торговля на нескольких квиках
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