Попрошу помощи, тк уже 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); } } }}
评论 (3)
登录 或 创建账户, 登录或注册以发表评论
Совместный поиск ошибки непонятно где? :)
А BasketTrader не пробовали использовать?
подскажите, что не так с подключением портфеля (не появляется он..) видимо не вызывается портфель вообще, насколько понял "trader1.StartExport(trader1.SecuritiesTable, trader1.MyTradesTable, trader1.EquityPositionsTable,trader1.EquityPortfoliosTable, trader1.OrdersTable);" запускает подключение к стакану,инструмент ищет.. а сама программа мне выводит