Как из конструктора сделать робота

Как из конструктора сделать робота

Как из конструктора сделать робота

В последнее время всё чаще слышу от многих трейдеров заявления, что очень здорово знать язык программирования и самому писать роботов. Многие усиленно пытаются изучать модный в последнее время язык C#. Однако новичку с нуля написать какое-либо стоящее приложение будет довольно сложно. В этой статье я попытаюсь дать минимальные знания языка программирования, показать логику построения приложения, спроектировать и запустить торгового робота для терминала QUIK.

Сразу хотелось бы отметить, что данная статья более всего ориентирована на новичков в программировании, знания которых ограничиваются школьной/университетской программой и опытом программирования на языках типа Pascal, Basic. В качестве литературы по языку C# лучше всего подойдут книги Шилдта и справка Microsoft.

В начале посмотрим, какие средства представлены в настоящий момент, для разработки роботов и создания автоматизированных алгоритмических торговых систем:

1)      Инструменты встроенные в терминал

  1. Qpile – встроенный язык в наиболее популярный терминал для торговли QUIK, язык довольно просто. Однако у этой простоты помимо очевидного плюса в легком освоении, есть очевидные минусы, как ограниченный функционал, сложность отладки.
  2. LUA – еще один несложный язык для терминала QUIK. Имеет больший функционал, чем Qpile. Однако большую популярность еще не приобрел. Сам код работает непосредственно в терминале QUIK.

2)      Внешние коробочные продукты – очень схожие по функционалу:  возможность тестирования на исторических данных, написание торговых систем на языке платформы .NET (обычно C#), интеграция с торговым терминалом.

  1. TradeMatic — система для создания торговых систем со встроенным механизмом тестирования на истории.
  2. TSLab – система аналогичная TradeMatic. Имеет визуальный редактор для проектирования торговой стратегии.
  3. LiveTrade RobotLab – терминал и визуальный конструктор роботов с возможностью написания кода самому.

3)      Внешние программы, разработанные самостоятельно. В данном случае можно использовать любой язык программирования, который знает человек.  Несколько лет назад была популярна связка терминала QUIK и Excel с роботом, написанным на Visual Basic. В настоящий момент можно воспользоваться довольно мощной и гибкой библиотекой для написания роботов Stock#, однако не программисту будет довольно сложно в ней разобраться.

Для разработки своего робота «с нуля» определимся со списком задач:

1)      Реализация импорта данных из терминала QUIK в нашу программу

2)      Программирование торгового алгоритма

3)      Создание механизма отправки заявок на совершение торговых операций в терминал

Этот список можно разбить на множество подпунктов, которые мы будем формулировать по ходу реализации этих этапов.

Прежде чем начать реализовывать импорт данных из терминала QUIK в нашу программу, вспомним основы программирования. Чтобы не превращать статью в очередной нудный учебник по программированию, опишем основные конструкции языка, которые нам понадобятся только для разработки программы.

В C# есть два способа построения интерфейсов клиентских приложений. Первый – использовать Windows Forms – технология построения приложений, которая уже более 10 лет применяется при проектировании визуального интерфейса. Второй — Windows Presentation Foundation (WPF) – довольно новая система для построения интерфейса, имеет возможность создавать привлекательный элементы с использованием 3D-графики, использует MVC-подход, однако требует больших ресурсов компьютера, чем WinForms. Поскольку Windows Forms проще и менее требователен к ресурсам, мы будем использовать именно эту технологию.

Начнем с создания приложения. Для этого надо запустить Visual Studio 2010 и создать проект «Приложение Windows Forms» (Рис. 1).

 

Рис. 1. создание приложения Windows Forms

После создания мы видим Форму – на ней будут размещаться визуальные элементы и дерево файлов, включая файл с кодом (Рис. 2, 3). Чтобы перейти к коду приложения, нужно нажать клавишу F7.

 

Рис. 2. Форма

 

Рис. 3. Код приложения

Если посмотреть на код, который был создан Visual Studio, то мы видим что, платформа нам автоматически создала объект класса Form. Класс — это логическая структура, позволяющая создавать свои собственные пользовательские типы путем группирования переменных других типов, методов и событий. Класс подобен чертежу. Он определяет данные и поведение типа. Класс и объект — это разные вещи, хотя в некоторых случаях они взаимозаменяемы. Класс определяет тип объекта, но не сам объект. Объект — это конкретная сущность, основанная на классе и иногда называемая экземпляром класса.

Также нам потребуется вспомнить это такое переменные. Переменные объявляются следующим образом:

ТипДанных Идентификатор;

Например:

int i = 10;                             //переменная целого типа

string st = “text”;             //переменная строкового типа

bool flag = true;               //переменная логического типа, принимает значения только true или false

Переменная представляет числовое или строковое значение или объект класса. Значение, хранящееся в переменной, может измениться, однако имя остается прежним.

Точно также обозначаются и массивы, которые представляют собой набор данных одного типа.

Прежде чем начать писать код для импорта данных, определим какие данные нам нужно импортировать из QUIK в нашу программу. В упрощенном варианте для нас будут важны исторические свечи и текущие цены торгуемого инструмента.

Хочу обратить внимание, что импортировать свечи просто так у нас не получится. Чтобы импортировать свечи в нашу программу придется написать портфель на языке терминала Qpile и открыть его в терминале, выбрав в меню QUIK пункт Таблицы-Портфели-Задать портфель (Рис. 4) и нажать кнопку загрузить локально. После чего выбрать Таблицы-Портфели-Просмотр портфеля, нажать кнопки «Добавить все» и затем кнопку «Да», установив значение поля «Имя таблицы» как «candles» (Рис.5). После чего в QUIK появится новое окно со списком свечей (Рис. 6).

 

Рис. 4. Загрузка портфеля

 

Рис. 5. Открытие и запуск портфеля

 

Рис.6. Результат открытия портфеля

Теперь давайте подумаем, как можно получить данные из терминала QUIK. Из QUIK данные можно получить тремя способами:

1) экспортировать данные через ODBC

2) экспортировать данные через DDE

3) брать данные непосредственно из памяти

Третий способ очень трудозатратный для программирования, хотя является самым быстрым для получения данных. Вывод данных через ODBC, как пишут разработчики Quik, работает медленнее, чем вывод через DDE. Поэтому мы воспользуемся наиболее простым способом – выводом через DDE.

Настроим сразу же QUIK для вывода данных (Рис. 7). Для этого нужно выделить нужную таблицу и нажать в меню Экспорт данных – Вывод по DDE. В качестве DDE сервера нужно указать имя «DDEServer». В качестве рабочей книги нужно указать следующее:

1)      для таблицы исторических свечей – «candles»

2)      для таблицы котировок и инструментов – «quotes»

3)      для таблицы заявок – «orders»

Не забудьте установить галочку «Вывод при нажатии Ctrl+Shift+L».

 

Рис. 7. Настройка вывода таблицы по DDE

В итоге окно QUIK будет выглядеть следующим образом:

 

Рис. 8. QUIK

Для импорта по DDE нам потребуется:

1) Класс XLTable, реализующий приведение данных из формата Excel к обычному виду (все необходимые файлы есть в приложении к статье)

2) Библиотека NDde.dll для создания DDE сервера

Чтобы добавить динамическую библиотеку, которая содержит необходимый набор функций для нашего приложения, нужно выбрать пункт «Добавить ссылку» в Обозревателе решений и открыть файл NDde.dll (Рис. 4).

 

Рис. 9. Импорт DLL

Сформируем класс для работы с DDE сервером:

class MyDDEServer : DdeServer

{

    public MyDDEServer(string service) : base(service)

    {

    }

}

В этом классе должны быть предусмотрен минимальный набор функции:

1)      Регистрация сервера

2)      Разрегистрация сервера

3)      Событие срабатывания таймера для получения новых данных

4)      Метод для обработки принятия данных

Добавим объекты на форму, для которых назначим эти события (Рис. 5).

 

Рис. 10. Кнопки на форме

Теперь назначим на кнопку «Запустить» событие нажатия мышью, дважды кликнув на эту кнопку в конструкторе и добавим код запуска DDE сервера:

private void buttonRunDDEServer_Click(object sender, EventArgs e)

{

     server = new MyDDEServer("DDEServer");  //Создаем объект DDE сервер

     server.Register();  //Регистрируем его

}

В этом случае мы создали объект класса MyDDEServer и затем вызвали метод этого объекта Register(). Конструктор класса принимает одно значение – строковую переменную, которая обозначает название имя нашего сервера. В реализации конструктора класса MyDDEServer мы используем таймер, который будет отвечать за оповещение при получении новых  данных:

System.Timers.Timer _Timer = new System.Timers.Timer();


public MyDDEServer(string service) : base(service)

{

   _Timer.Elapsed += this.OnTimerElapsed;  //подписываемся на событие принятия данных

   _Timer.Interval = 100;  //Интервал таймера в мс

}

Рассмотрим теперь метод получения данных через DDE:

    protected override PokeResult OnPoke(DdeConversation conversation, string item, byte[] data, int format)

    {

            XLTable table = new XLTable(data);

            // Данные и Заголовки таблиц

            double[,] impdata = new double[table.Rows, table.Columns];

            string[,] imptitles = new string[table.Rows, table.Columns];

            //Конвертируем данные в понятный вид

            XLTable.BytesToMatrix(data, ref impdata, ref imptitles);       

            switch (conversation.Topic)

            {

                case "candles":

                    break;

                case "orders":

                    break;

                case "quotes":

                    break;

            }

        }

        return PokeResult.Processed;

    }

Этот метод вызывается каждый раз при срабатывании таймера, который был установлен в конструкторе класса. Данные содержатся в массиве data, который мы с помощью метода BytesToMatrix класса XLTable преобразуются в привычный нам вид. Затем мы используем условный оператор switch для определения, какую таблицу обрабатывать.

На форму приложения я также добавил визуальные объекты для отображения пришедших данных. В результате компиляции (F5)  приложения и запуска импорта по DDE получилось следующее (Рис. 11):

 

Рис. 11. Импорт данных их QUIK в окно приложения

Как мы видим, данные успешно импортируются в наше приложение из терминала QUIK, теперь перед нами встает задача создания логики торгового робота и его программная реализация, о чем я постараюсь написать в следующей статье.

Структура архива:

1)      NDde.dll — динамическая библиотека, в которой реализованы функции для работы с DDE сервером

2)      XLTable.cs – класс для обработки данных из QUIK в приложение

3)      charts.qpl – портфель для QUIK на языке Qplie для формирования исторических счевек

4)      INFO.wnd – настройки QUIK

5)      Robot – код робота на C#

Прикрепленные файлы

·  


Источник: http://robostroy.ru/community/article.aspx?id=683


Как из конструктора сделать робота

Как из конструктора сделать робота

Как из конструктора сделать робота

Как из конструктора сделать робота

Как из конструктора сделать робота

Как из конструктора сделать робота

Как из конструктора сделать робота

Как из конструктора сделать робота

Как из конструктора сделать робота

Как из конструктора сделать робота