← Zurück

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

Попрошу помощи, тк уже 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);
        }
    }
}

}

War dieses Thema hilfreich?

Thema teilen

Kommentare (3)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Alexander
Alexander

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

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

tmt
tmt Autor

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

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

tmt
tmt Autor

подскажите, что не так с подключением портфеля (не появляется он..) видимо не вызывается портфель вообще, насколько понял "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);
        }
    }
}

}