Для изменения размера нажмите или перетащите
Создание первого робота

Создание торговых роботов под SmartCOM практически ничем не отличается от создания под Quik. Для демонстрации взят пример из раздела Создание первого робота, где показано как создавать торговое приложение под Quik. Исходные коды примера лежат в дистрибутиве в папке Samples/SmartCom.

Внимание Внимание

SmartCOM 2 имеет те же ограничения на разрядность операционной системы, что и Quik. Приложение необходимо компилировать под 32 бита. Как это сделать показано в Создание первого робота. В SmartCOM 3 режим компиляции выбирается в зависимости от установленной сборки (32- или 64-битной).

Пример робота под SmartCOM

  1. В самом начале необходимо заменить шлюз с QuikTrader на SmartTrader:

    C#
    // создаем шлюз к Smart-у
    var trader = new SmartTrader(login, password);
  2. После создания шлюза необходимо подключиться к торговой системе. В случае с SmartTrader такой системой выступает SmartCOM:

    C#
    // подписываемся на событие успешного подключения
    // все действия необходимо производить только после подключения
    trader.Connected += () =>
    {
        Console.WriteLine("Подключение было произведено успешно.");
    
        // извещаем об успешном соединении
        waitHandle.Set();
    };
    
    Console.WriteLine("Производим подключение...");
    
    trader.Connect();
    
    // дожидаемся события об успешном соединении
    waitHandle.WaitOne();
  3. Далее, необходимо подписаться на события появления информации по инструментам (так программа получит сведения по бумаге Лукойл), и портфелям (для выставления заявок). А также на событие появления Моих Сделок (сигнал пользователю о том, что произошла сделка по его заявке):

    C#
    // подписываемся на все портфели-счета
    trader.NewPortfolios += portfolios =>
    {
        // необходимое условие работы в SmartCOM
        portfolios.ForEach(trader.RegisterPortfolio);
    
        if (_portfolio == null)
        {
            // находим нужный портфель и присваиваем его переменной _portfolio
            _portfolio = portfolios.FirstOrDefault(p => p.Name == account);
    
            if (_portfolio != null)
            {
                Console.WriteLine("Портфель {0} появился.", account);
    
                if (_lkoh != null)
                    waitHandle.Set();
            }
        }
    };
    
    // подписываемся на событие появления инструментов
    trader.NewSecurities += securities =>
    {
        if (_lkoh == null)
        {
            // находим Лукойл и присваиваем ее переменной lkoh
            _lkoh = securities.FirstOrDefault(sec => sec.Code == secCode && sec.Type == SecurityTypes.Equity);
    
            if (_lkoh != null)
            {
                Console.WriteLine("Инструмент Лукойл появился.");
    
                if (_portfolio != null)
                    waitHandle.Set();
            }
        }
    };
    
    // подписываемся на событие появления моих новых сделок
    trader.NewMyTrades += myTrades =>
    {
        foreach (var myTrade in myTrades)
        {
            var trade = myTrade.Trade;
            Console.WriteLine("Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}.", trade.Id, trade.Price, trade.Security.Code, trade.Volume, trade.Time);
        }
    };
  4. Дожидаемся появления портфеля и инструмента и запускаем обновления по инструменту:

    C#
    Console.WriteLine("Дожидаемся появления в программе инструмента Лукойл и портфеля {0}...".Put(account));
    
    
    // дожидаемся появления портфеля и инструмента
    waitHandle.WaitOne();
    
    trader.SecuritiesChanged += securities =>
    {
        // если инструмент хоть раз изменился (по нему пришли актуальные данные)
        if (securities.Contains(_lkoh))
            waitHandle.Set();
    };
    
    Console.WriteLine("Дожидаемся обновления данных по инструменту Лукойл...");
    
    // запускаем обновление по инструменту
    trader.RegisterSecurity(_lkoh);
    waitHandle.WaitOne();

    Когда данные начнут приходить в SmartTrader, то будут вызываться события IConnectorNewSecurities, IConnectorNewOrders и т.д. Для тех данных, которые изменяются, вызывается другое событие. Например, для заявок, у которых изменяются значения Состояние, Остаток и т.д. будет вызвано событие IConnectorOrdersChanged.

  5. Торговый алгоритм робота:

    C#
    // 0.1% от изменения цены
    const decimal delta = 0.001m;
    
    // запоминаем первоначальное значение середины спреда
    var firstMid = lkoh.BestPair.SpreadPrice / 2;
    if (_lkoh.BestBid == null)
        throw new Exception("Нет лучшего бида для котировки.");
    
    Console.WriteLine("Первоначальное значение середины спреда {0:0.##}", _lkoh.BestBid.Price + firstMid);
    
    while (true)
    {
        var mid = lkoh.BestPair.SpreadPrice / 2;
    
        // если спред вышел за пределы нашего диапазона
        if    (
                ((firstMid + firstMid * delta) <= mid) ||
                ((firstMid - firstMid * delta) >= mid)
            )
        {
            var order = new Order
            {
                Portfolio = _portfolio,
                Price = lkoh.ShrinkPrice(lkoh.BestBid + mid),
                Security = lkoh,
                Volume = 1,
                Direction = OrderDirections.Buy,
            };
            trader.RegisterOrder(order);
            Console.WriteLine("Заявка {0} зарегистрирована", order.Id);
            break;
        }
        else
            Console.WriteLine("Текущее значение середины спреда {0:0.##}", _lkoh.BestBid.Price + mid);
    
        // ждем 1 секунду
        Thread.Sleep(1000);
    }
  6. Освобождение занятых ресурсов:

    Освобождение ресурсов произойдет автоматически, т.к. код заключен в конструкцию using.

    C#
    using (SmartTrader trader = new SmartTrader { Login = login, Password = password, Address = SmartComAddresses.Demo })
    {
       // ...
    }