Для изменения размера нажмите или перетащите
Работа с несколькими Quik-ами

S# позволяет работать с несколькими Quik-ами одновременно из одного робота. К примеру, это необходимо, когда идет торговля на разных площадках через разных брокеров.

Пример работы с несколькими Quik-ами

  1. В папку с программой необходимо поместить два файла TRANS2QUIK.dll (пример работает с 2-мя Quik-ами). Например, один будет иметь оригинальное название, а второй будет переименован TRANS2QUIK_2.dll. Это обязательное требование работы с несколькими Quik-ами из одной программы: один Quik - одна dll.

  2. После этого, идет создание нескольких QuikTrader. Через свойство QuikTraderDdeServer передается уникальное имя для DDE сервера, а через QuikTraderDllName путь к TRANS2QUIK.dll:

    C#
    var quikTrader1 = new QuikTrader { Path = path1, DdeServer = "quik1" };
    var quikTrader2 = new QuikTrader { Path = path2, DdeServer = "quik2", DllName = @"TRANS2QUIK_2.dll" };
    
    // если вторая dll находится в другой папке, то можно создать шлюз, указав путь к dll
    // var quikTrader2 = new QuikTrader { Path = path2, DdeServer = "quik2", DllName = @"Folder1\TRANS2QUIK_2.dll" };
  3. Когда QuikTrader-ы созданы, идет обычная работа с каждом из них:

    C#
    // подписываемся на событие ошибок обработки данных и разрыва соединения
    // 
    quikTrader1.Error += OnError;
    quikTrader2.Error += OnError;
    
    quikTrader1.ConnectionError += OnError;
    quikTrader2.ConnectionError += OnError;
    
    
    var portfoliosWait = new ManualResetEvent(false);
    
    Action<IEnumerable<Portfolio>> newPortfolios = portfolios =>
    {
        if (_portfolio1 == null)
            _portfolio1 = portfolios.FirstOrDefault(p => p.Name == account1);
    
        if (_portfolio2 == null)
            _portfolio2 = portfolios.FirstOrDefault(p => p.Name == account2);
    
        // если оба инструмента появились
        if (_portfolio1 != null && _portfolio2 != null)
            portfoliosWait.Set();
    };
    
    // подписываемся на события новых портфелей
    quikTrader1.NewPortfolios += newPortfolios;
    quikTrader2.NewPortfolios += newPortfolios;
    
    
    var securitiesWait = new ManualResetEvent(false);
    
    Action<IEnumerable<Security>> newSecurities = securities =>
    {
        if (_lkoh == null)
            _lkoh = securities.FirstOrDefault(s => s.Code == "LKOH" && s.Trader == quikTrader1);
    
        if (_riz0 == null)
            _riz0 = securities.FirstOrDefault(s => s.Code == "RIZ0" && s.Trader == quikTrader2);
    
        // если оба инструмента появились
        if (_lkoh != null && _riz0 != null)
            securitiesWait.Set();
    };
    
    // подписываемся на события новых инструментов
    quikTrader1.NewSecurities += newSecurities;
    quikTrader2.NewSecurities += newSecurities;
    
    
    // запускаем экспорты в Quik-ах, когда получим событие об успешном соединении
    // 
    quikTrader1.Connected += () => quikTrader1.StartExport(new[] {quikTrader1.SecuritiesTable});
    quikTrader2.Connected += () => quikTrader2.StartExport(new[] {quikTrader2.SecuritiesTable});
    
    // производим подключение каждого из QuikTrader-а
    // 
    quikTrader1.Connect();
    quikTrader2.Connect();
    
    Console.WriteLine("Дожидаемся появления инструментов и портфелей...");
    portfoliosWait.WaitOne();
    securitiesWait.WaitOne();
    
    Console.WriteLine("Информация появилась. Производим регистрацию заявок...");
    
    if (_lkoh.BestBid == null || _riz0.BestBid == null)
        throw new Exception("Нет лучшего бида для котировки.");
    
    quikTrader1.RegisterOrder(new Order
    {
        Portfolio = _portfolio1,
        Volume = 1,
        Security = _lkoh,
        Price = _lkoh.BestBid.Price
    });
    Console.WriteLine("Заявка на LKOH зарегистрирована");
    
    quikTrader2.RegisterOrder(new Order
    {
        Portfolio = _portfolio2,
        Volume = 1,
        Security = _riz0,
        Price = _riz0.BestBid.Price
    });
    Console.WriteLine("Заявка на RIZ0 зарегистрирована");
    Внимание Внимание

    Номера счетов, которые в примере записаны в переменные account1 и account2, это не логины в Quik, а коды клиентов. Об особенности портфелей в Quik читайте в соответствующем разделе.

  4. Для более удобной работы с несколькими QuikTrader-ами S# предоставляет Множество подключений.

  5. Исходные коды примера лежат в папке SampleFewQuiks.

Следующие шаги