торговля на нескольких квиках
Atom
09.12.2011


tmt

Фотография
Попрошу помощи, тк уже 2ой день бьюсь... Это я пример переделывал и вот что получилось, но скрипт не работает, думаю где то ошибка с подключением (тк он выводит подключение.. и все.. выходит)

мне кажется все верно, наверняка чтот с терминалами у меня, тк на 2ом счету даже вручную не открывает по RIZ1

Цитата:
namespace SampleConsole
{
using System;
using System.Linq;
using System.Threading;

using Ecng.Common;

using StockSharp.BusinessEntities;
using StockSharp.Quik;
using StockSharp.Algo;

class Program
{
private static Security _instrument1;
private static Security _instrument2;
private static Portfolio _portfolio1;
private static Portfolio _portfolio2;
private static MarketDepth _depth1;
private static MarketDepth _depth2;

static void Main()
{
try
{
// для теста выбираем бумагу Лукойл
const string secCode = "RIZ1";
var path1 = @"D:\FinamJunior\info.exe";
var account1 = "SPBFUT00O88";
var path2 = @"D:\FinamJunior1\info.exe";
var account2 = "SPBFUT00P53";

using (var waitHandle = new AutoResetEvent(false))
{
// создаем шлюз к Quik-у
using (var trader1 = new QuikTrader { Path = path1, DdeServer = "quik1" })
using (var trader2 = new QuikTrader { Path = path2, DdeServer = "quik2", DllName = @"TRANS2QUIK_2.dll" })
{
var portfoliosWait = new ManualResetEvent(false);
var connect1 = 0;
var connect2 = 0;
trader1.Connected += () =>
{
Console.WriteLine("Подключение 1 было произведено успешно.");
connect1 = 1;
// извещаем об успешном соединени
if(connect1==1 && connect2==1)
portfoliosWait.Set();
};
trader2.Connected += () =>
{
Console.WriteLine("Подключение 2 было произведено успешно.");
connect1 = 2;
// извещаем об успешном соединени
if (connect1 == 1 && connect2 == 1)
portfoliosWait.Set();
};
Console.WriteLine("Производим подключение...");

trader1.Connect();
trader2.Connect();


// дожидаемся события об успешном соединении
//waitHandle.WaitOne();

Console.WriteLine("Дожидаемся появления инструментов и портфелей...");
portfoliosWait.WaitOne();

trader1.NewPortfolios += portfolios =>
{
if (_portfolio1 == null)
{
// находим Лукойл и присваиваем ее переменной lkoh
_portfolio1 = portfolios.FirstOrDefault(p => p.Name == account1);

if (_portfolio1 != null)
{
Console.WriteLine("Портфель {0} появился.", account1);

// если инструмент и стакан уже появились,
// то извещаем об этом основной поток для выставления заявки
if (_instrument1 != null && _depth1 != null && _instrument2 != null && _depth2 != null && _portfolio2 != null)
waitHandle.Set();
}
}
};

trader2.NewPortfolios += portfolios =>
{
if (_portfolio2 == null)
{
// находим Лукойл и присваиваем ее переменной lkoh
_portfolio2 = portfolios.FirstOrDefault(p => p.Name == account2);

if (_portfolio2 != null)
{
Console.WriteLine("Портфель {0} появился.", account2);

// если инструмент и стакан уже появились,
// то извещаем об этом основной поток для выставления заявки
if (_instrument1 != null && _depth1 != null && _instrument2 != null && _depth2 != null && _portfolio1 != null)
waitHandle.Set();
}
}
};

// подписываемся на событие появление инструментов
trader1.NewSecurities += securities =>
{
if (_instrument1 == null)
{
// находим Лукойл и присваиваем ее переменной lkoh
_instrument1 = securities.FirstOrDefault(sec => sec.Code == secCode);

if (_instrument1 != null)
{
Console.WriteLine("Инструмент Лукойл появился.");

// запускаем экспорт стакана
trader1.RegisterQuotes(_instrument1);

if (_portfolio1 != null && _depth1 != null && _portfolio2 != null && _depth2 != null && _instrument2 != null)
waitHandle.Set();
}
}
};

trader2.NewSecurities += securities =>
{
if (_instrument2 == null)
{
// находим Лукойл и присваиваем ее переменной lkoh
_instrument2 = securities.FirstOrDefault(sec => sec.Code == secCode);

if (_instrument2 != null)
{
Console.WriteLine("Инструмент Лукойл появился.");

// запускаем экспорт стакана
trader2.RegisterQuotes(_instrument2);

if (_portfolio1 != null && _depth1 != null && _portfolio2 != null && _depth2 != null && _instrument1 != null)
waitHandle.Set();
}
}
};


// подписываемся на событие обновления стакана
trader1.QuotesChanged += depths =>
{
if (_depth1 == null && _instrument1 != null)
{
_depth1 = depths.FirstOrDefault(d => d.Security == _instrument1);

if (_depth1 != null)
{
Console.WriteLine("Стакан Лукойла появился.");

// если портфель и инструмент уже появился, то извещаем об этом основной поток для выставления заявки
if (_portfolio1 != null && _instrument1 != null && _portfolio2 != null && _instrument2 != null && _depth2 != null)
waitHandle.Set();
}
}
};

trader2.QuotesChanged += depths =>
{
if (_depth2 == null && _instrument2 != null)
{
_depth2 = depths.FirstOrDefault(d => d.Security == _instrument2);

if (_depth2 != null)
{
Console.WriteLine("Стакан Лукойла появился.");

// если портфель и инструмент уже появился, то извещаем об этом основной поток для выставления заявки
if (_portfolio1 != null && _instrument1 != null && _portfolio2 != null && _instrument2 != null && _depth1 != null)
waitHandle.Set();
}
}
};


trader1.StartExport(trader1.SecuritiesTable, trader1.MyTradesTable, trader1.EquityPositionsTable,
trader1.EquityPortfoliosTable, trader1.OrdersTable);
trader2.StartExport(trader2.SecuritiesTable, trader2.MyTradesTable, trader2.EquityPositionsTable,
trader2.EquityPortfoliosTable, trader2.OrdersTable);
// дожидаемся появления портфеля и инструмента
waitHandle.WaitOne();

// 0.1% от изменения цены
const decimal delta = 0.001m;

// запоминаем первоначальное значение середины спреда
var firstMid = _instrument1.BestPair.SpreadPrice / 2;
if (_instrument1.BestBid == null)
throw new Exception("Нет лучшего бида для котировки.");

Console.WriteLine("Первоначальное значение середины спреда {0:0.##}", _instrument1.BestBid.Price + firstMid);

while (true)
{
var mid = _instrument1.BestPair.SpreadPrice / 2;

// если спред вышел за пределы нашего диапазона
if (
((firstMid + firstMid * delta) <= mid) ||
((firstMid - firstMid * delta) >= mid)
)
{
var order1 = new Order
{
Portfolio = _portfolio1,
Price = _instrument1.ShrinkPrice(_instrument1.BestBid.Price + mid),
Security = _instrument1,
Volume = 1,
Direction = OrderDirections.Buy,
};
trader1.RegisterOrder(order1);
Console.WriteLine("Заявка {0} зарегистрирована.", order1.Id);

var order2 = new Order
{
Portfolio = _portfolio2,
Price = _instrument2.ShrinkPrice(_instrument2.BestAsk.Price + mid),
Security = _instrument2,
Volume = 1,
Direction = OrderDirections.Sell,
};
trader2.RegisterOrder(order2);
Console.WriteLine("Заявка {0} зарегистрирована.", order2.Id);
break;
}
else
//Console.WriteLine("Текущее значение середины спреда {0:0.##}", _instrument.BestBid.Price + mid);

// ждем 1 секунду
Thread.Sleep(1000);
}

// останавливаем экспорт по DDE
trader2.StopExport(trader2.SecuritiesTable, trader2.MyTradesTable, trader2.EquityPositionsTable,
trader2.EquityPortfoliosTable, trader2.OrdersTable);
trader1.StopExport(trader1.SecuritiesTable, trader1.MyTradesTable, trader1.EquityPositionsTable,
trader1.EquityPortfoliosTable, trader1.OrdersTable);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
}

Теги:


Спасибо:


Alexander

Фотография
Дата: 09.12.2011
Ответить


Совместный поиск ошибки непонятно где? :)

А BasketTrader не пробовали использовать?
Спасибо:

tmt

Фотография
Дата: 09.12.2011
Ответить


Alexander Mukhanchikov Перейти
Совместный поиск ошибки непонятно где? :)

А BasketTrader не пробовали использовать?

Неее.. пока я до этого не добрался, мнеб пример простой чтоб сделки открывал на обоих терминалах.
Насчет ошибок, я седня если успею, то зарегаю 2а новых счета, а то чтот подозрительно на 1 из счетов просто не могу на фортс торговать
Спасибо:

tmt

Фотография
Дата: 09.12.2011
Ответить


подскажите, что не так с подключением портфеля (не появляется он..)
видимо не вызывается портфель вообще, насколько понял "trader1.StartExport(trader1.SecuritiesTable, trader1.MyTradesTable, trader1.EquityPositionsTable,trader1.EquityPortfoliosTable, trader1.OrdersTable);" запускает подключение к стакану,инструмент ищет.. а сама программа мне выводит
Цитата:
Производим подключение...
Подключение 1 было произведено успешно.
Подключение 2 было произведено успешно.
Дожидаемся появления инструментов и портфелей...
Инструмент 1 Лукойл появился.
Стакан 1 Лукойла появился.
Инструмент 2 Лукойл появился.
Стакан 2 Лукойла появился.


Цитата:
namespace SampleConsole
{
using System;
using System.Linq;
using System.Threading;

using Ecng.Common;

using StockSharp.BusinessEntities;
using StockSharp.Quik;
using StockSharp.Algo;

class Program
{
private static Security _instrument1;
private static Security _instrument2;
private static Portfolio _portfolio1;
private static Portfolio _portfolio2;
private static MarketDepth _depth1;
private static MarketDepth _depth2;

static void Main()
{
try
{
// для теста выбираем бумагу Лукойл
const string secCode = "LKOH";
var path1 = @"C:\Program Files\QUIK\info.exe";
var account1 = "NL0011100043";
var path2 = @"C:\Program Files\QUIK1\info.exe";
var account2 = "NL0011100043";
var connect1 = 0;
var connect2 = 0;

using (var waitHandle1 = new AutoResetEvent(false))
using (var waitHandle2 = new AutoResetEvent(false))
using (var waitHandle3 = new AutoResetEvent(false))
using (var waitHandle4 = new AutoResetEvent(false))
using (var waitHandle5 = new AutoResetEvent(false))
using (var waitHandle6 = new AutoResetEvent(false))
using (var con1 = new AutoResetEvent(false))
using (var con2 = new AutoResetEvent(false))
{
// создаем шлюз к Quik-у
using (var trader1 = new QuikTrader { Path = path1, DdeServer = "quik1" })
using (var trader2 = new QuikTrader { Path = path2, DdeServer = "quik2", DllName = @"TRANS2QUIK_2.dll" })
{
trader1.Connected += () =>
{
Console.WriteLine("Подключение 1 было произведено успешно.");
connect1 = 1;
// извещаем об успешном соединени
con1.Set();
};
trader2.Connected += () =>
{
Console.WriteLine("Подключение 2 было произведено успешно.");
connect1 = 2;
// извещаем об успешном соединени
con2.Set();
};
Console.WriteLine("Производим подключение...");

trader1.Connect();
trader2.Connect();



// дожидаемся события об успешном соединении

con1.WaitOne();
con2.WaitOne();

Console.WriteLine("Дожидаемся появления инструментов и портфелей...");
//waitHandle.WaitOne();

trader1.NewPortfolios += portfolios =>
{
if (_portfolio1 == null)
{
// находим Лукойл и присваиваем ее переменной lkoh
_portfolio1 = portfolios.FirstOrDefault(p => p.Name == account1);

if (_portfolio1 != null)
{
Console.WriteLine("Портфель 1 {0} появился.", account1);

// если инструмент и стакан уже появились,
// то извещаем об этом основной поток для выставления заявки
//if (_instrument1 != null && _depth1 != null && _instrument2 != null && _depth2 != null && _portfolio2 != null)
waitHandle1.Set();
}
}
};

trader2.NewPortfolios += portfolios =>
{
if (_portfolio2 == null)
{
// находим Лукойл и присваиваем ее переменной lkoh
_portfolio2 = portfolios.FirstOrDefault(p => p.Name == account2);

if (_portfolio2 != null)
{
Console.WriteLine("Портфель 2 {0} появился.", account2);

// если инструмент и стакан уже появились,
// то извещаем об этом основной поток для выставления заявки
//if (_instrument1 != null && _depth1 != null && _instrument2 != null && _depth2 != null && _portfolio1 != null)
waitHandle2.Set();
}
}
};

// подписываемся на событие появление инструментов
trader1.NewSecurities += securities =>
{
if (_instrument1 == null)
{
// находим Лукойл и присваиваем ее переменной lkoh
_instrument1 = securities.FirstOrDefault(sec => sec.Code == secCode);

if (_instrument1 != null)
{
Console.WriteLine("Инструмент 1 Лукойл появился.");

// запускаем экспорт стакана
trader1.RegisterQuotes(_instrument1);

//if (_portfolio1 != null && _depth1 != null && _portfolio2 != null && _depth2 != null && _instrument2 != null)
waitHandle3.Set();
}
}
};

trader2.NewSecurities += securities =>
{
if (_instrument2 == null)
{
// находим Лукойл и присваиваем ее переменной lkoh
_instrument2 = securities.FirstOrDefault(sec => sec.Code == secCode);

if (_instrument2 != null)
{
Console.WriteLine("Инструмент 2 Лукойл появился.");

// запускаем экспорт стакана
trader2.RegisterQuotes(_instrument2);

//if (_portfolio1 != null && _depth1 != null && _portfolio2 != null && _depth2 != null && _instrument1 != null)
waitHandle4.Set();
}
}
};


// подписываемся на событие обновления стакана
trader1.QuotesChanged += depths =>
{
if (_depth1 == null && _instrument1 != null)
{
_depth1 = depths.FirstOrDefault(d => d.Security == _instrument1);

if (_depth1 != null)
{
Console.WriteLine("Стакан 1 Лукойла появился.");

// если портфель и инструмент уже появился, то извещаем об этом основной поток для выставления заявки
//if (_portfolio1 != null && _instrument1 != null && _portfolio2 != null && _instrument2 != null && _depth2 != null)
waitHandle5.Set();
}
}
};

trader2.QuotesChanged += depths =>
{
if (_depth2 == null && _instrument2 != null)
{
_depth2 = depths.FirstOrDefault(d => d.Security == _instrument2);

if (_depth2 != null)
{
Console.WriteLine("Стакан 2 Лукойла появился.");

// если портфель и инструмент уже появился, то извещаем об этом основной поток для выставления заявки
//if (_portfolio1 != null && _instrument1 != null && _portfolio2 != null && _instrument2 != null && _depth1 != null)
waitHandle6.Set();
}
}
};

trader1.StartExport(trader1.SecuritiesTable, trader1.MyTradesTable, trader1.EquityPositionsTable,
trader1.EquityPortfoliosTable, trader1.OrdersTable);
trader2.StartExport(trader2.SecuritiesTable, trader2.MyTradesTable, trader2.EquityPositionsTable,
trader2.EquityPortfoliosTable, trader2.OrdersTable);

// дожидаемся появления портфеля и инструмента
waitHandle1.WaitOne();
waitHandle2.WaitOne();
waitHandle3.WaitOne();
waitHandle4.WaitOne();
waitHandle5.WaitOne();
waitHandle6.WaitOne();



// 0.1% от изменения цены
const decimal delta = 0.001m;

// запоминаем первоначальное значение середины спреда
var firstMid = _instrument1.BestPair.SpreadPrice / 2;
if (_instrument1.BestBid == null)
throw new Exception("Нет лучшего бида для котировки.");

Console.WriteLine("Первоначальное значение середины спреда {0:0.##}", _instrument1.BestBid.Price + firstMid);

while (true)
{
var mid = _instrument1.BestPair.SpreadPrice / 2;

// если спред вышел за пределы нашего диапазона
if (
((firstMid + firstMid * delta) <= mid) ||
((firstMid - firstMid * delta) >= mid)
)
{
var order1 = new Order
{
Portfolio = _portfolio1,
Price = _instrument1.ShrinkPrice(_instrument1.BestBid.Price + mid),
Security = _instrument1,
Volume = 1,
Direction = OrderDirections.Buy,
};
trader1.RegisterOrder(order1);
Console.WriteLine("Заявка {0} зарегистрирована.", order1.Id);

var order2 = new Order
{
Portfolio = _portfolio2,
Price = _instrument2.ShrinkPrice(_instrument2.BestAsk.Price + mid),
Security = _instrument2,
Volume = 1,
Direction = OrderDirections.Sell,
};
trader2.RegisterOrder(order2);
Console.WriteLine("Заявка {0} зарегистрирована.", order2.Id);
//break;
}
else
//Console.WriteLine("Текущее значение середины спреда {0:0.##}", _instrument.BestBid.Price + mid);

// ждем 1 секунду
Thread.Sleep(1000);
}

// останавливаем экспорт по DDE
trader1.StopExport(trader1.SecuritiesTable, trader1.MyTradesTable, trader1.EquityPositionsTable,
trader1.EquityPortfoliosTable, trader1.OrdersTable);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
}
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy