.
Проект "Битва роботов". Шаг 3. Унификация виртуальной биржи.
Автор megabax   
17.10.2013 г.
Структура программы на примере простейшей программы

Проект "Битва роботов". Шаг 3. Унификация виртуальной биржи.

В прошлый раз я реализовал механизм взаиморасчетов на виртуальной бирже: виртуальные счет, виртуальные денежные средства. На третьем шаге я сделал унификацию. Дело в том, что биржевых терминалов существует превеликое множество: Quik, AlorTrade, AlfaDirect - это только одни из них. Для программирования торговых алгоритмов к каждому из них требуется совершенно разный подход. Согласитесь, неудобно будет переделывать обученных на виртуальной бирже роботов каждый раз. Конечно, от адаптации к другим терминалам никуда не уйти. Но можно свести эту работу к минимуму. Ранее я разработал два интерфейса ITerminalDriver, IAddTerminalDriver, которые реализовал для симулятора стратегий и для терминала АлорТрейд (см. анонсы уроков "Пишем биржевого робота на C#" и "Программирование в TEClient AlorTrade", а так же ряд уроков по программированию в AlorTrade из бесплатного раздела). Если я унифицирую виртуальную биржу для этих интерфейсов, то роботы, торгующие на этой виртуальной биржи, без какой либо переделки смогут торговать и через Алор. Разумеется, для других брокеров и торговых терминалов придется писать отдельные библиотеки.

И так, вот как выглядят эти интерфейсы:

ITerminalDriver:

    /// <summary>

    /// Структура заявки на соврешение сделки.

    /// </summary>

    public struct StockOrderInfo

    {

        /// <summary>

        /// Тикер  инструмента

        /// </summary>

        public string ticker;

 

        /// <summary>

        /// Доп. информация (рынок, режим торгов и так далее, в зависимости от биржы, брокера и терминала)

        /// </summary>

        public string market;

 

        /// <summary>

        /// Тип стоп приказа "stoploss" или "takeprofit", если это не стоп приказ, то ""

        /// </summary>

        public string stopType;

 

        /// <summary>

        /// Тип приказа "buy" или "sell"

        /// </summary>

        public string type;

 

        public int count;

        public double price;

        public double signalPrice;

 

        /// <summary>

        /// Номер торгового счета

        /// </summary>

        public string account;

 

        /// <summary>

        /// Срок действия заявки

        /// </summary>

        public DateTime expiry;

    }

 

    /// <summary>

    /// Структура результата отправки ордера

    /// </summary>

    public struct ResultSendOrder

    {

        /// <summary>

        /// Код результата выставления заявки

        /// </summary>

        public int resCode;

 

        /// <summary>

        /// Сообщения о результате выставления заявки

        /// </summary>

        public string resMessage;

 

        /// <summary>

        /// Код выставленной заявки

        /// </summary>

        public string orderCode;

 

        /// <summary>

        /// Время начала выставления заявки

        /// </summary>

        public DateTime time_beg;

 

        /// <summary>

        /// Время окончания выставления заявки

        /// </summary>

        public DateTime time_end;

    }

 

 

 

    /// <summary>

    /// Интерфейс доступа к драйверу биржевого терминала

    /// </summary>

    public interface ITerminalDriver

    {

 

        /// <summary>

        /// Подключиться к терминалу

        /// </summary>

        void connection();

 

        /// <summary>

        /// Отключиться от терминала

        /// </summary>

        void disconnection();

 

       

        /// <summary>

        /// Послать ордер (заявку)

        /// </summary>

        /// <param name="info">Структура заявки</param>

        /// <returns>Результат ввода заявки</returns>

        ResultSendOrder sendOrder(StockOrderInfo info);

 

        /// <summary>

        /// Количество данного инструмента на эмулируемом счете

        /// </summary>

        /// <param name="ticker">Тикер финансового инструмента</param>

        /// <returns>Количество данного инструмента на эмулируемом счете</returns>

        int itemCountOnAccount(string ticker);

 

        /// <summary>

        /// Количество доступных денежных средств

        /// </summary>

        /// <returns>Количество доступных денежных средств</returns>

        double moneyAvailable();

 

        /// <summary>

        /// Количество разновидностей финансовых инструментов, доступных для торгов

        /// </summary>

        /// <returns>Количество разновидностей финансовых инструментов, доступных для торгов</returns>

        int itemsCount();

 

        /// <summary>

        /// Количество заявок

        /// </summary>

        /// <returns>Количество заявок</returns>

        int ordersCount();

 

        /// <summary>

        /// Получить список заявок

        /// </summary>

        /// <returns>Список заявок</returns>

        List<Order> getOrders();

 

        /// <summary>

        /// Получить все открытые позиции

        /// </summary>

        /// <returns>Список открытых позиций</returns>

        List<StockItem> GetPositions();

 

        /// <summary>

        /// Получить стоимость портфеля

        /// </summary>

        /// <returns>Стоимость портфеля</returns>

        double getPortfolioPrice();

 

    }

 

IAddTerminalDriver:

    /// <summary>

    /// Класс структуры элемента "стакана"

    /// </summary>

    [Serializable]

    public class OrderBookItem

    {

 

        /// <summary>

        /// Уникальный идентификатор

        /// </summary>

        public int ID;

 

        /// <summary>

        /// Финансовый инструмент

        /// </summary>

        [field: NonSerialized]

        public StockItem item;

       

        /// <summary>

        /// Направление заявок

        /// +1 - на покупку (спрос)

        /// -1 - на продажу (предложение)

        /// </summary>

        public int direction;

 

        /// <summary>

        /// Цена

        /// </summary>

        public double price;

 

        /// <summary>

        /// Количество

        /// </summary>

        public int count;

 

        /// <summary>

        /// Возвращает тип заявки, buy или sell, Только для чтения

        /// </summary>

        public string type

        {

            get

            {

                if (direction == 1) return "buy"; else return "sell";

            }

        }

 

       

    }

 

    /// <summary>

    /// Дополнительный интерфейс доступа к драйверу биржевого терминала

    /// </summary>

    public interface IAddTerminalDriver

    {

 

        /// <summary>

        /// Возвращает содержимое "стакана"

        /// </summary>

        /// <returns>Содержимое стакана</returns>

        /// <param name="a_ticker">Инструмент, по которому нужно вернуть стакан</param>

        List<OrderBookItem> getOrderBook(string a_ticker);

 

        /// <summary>

        /// Удалить заявку с указанным номером

        /// </summary>

        /// <param name="ID">Номер заявки (ее идентификационный код</param>

        /// <returns>Результат операции</returns>

        ResultSendOrder deleteOrder(string ID);

 

        /// <summary>

        /// Получить  список всех инструментов

        /// </summary>

        /// <returns>Список инструментов</returns>

        List<StockItem> getItems();

 

 

    }

 

После унификации я немного доработал и интерфейс "биржи", вот как теперь выглядит программа:

Проект "Битва роботов". Шаг 3. Унификация виртуальной биржи.

 

Последнее обновление ( 17.10.2013 г. )