В прошлой части данной статьи мы узнали, как подключиться к терминалу QUIK, создали свой DDE сервер, с помощью которого мы смогли импортировать данные в наше приложение. Сейчас нашей задачей является реализация торгового алгоритма робота и отправка заявок на совершение торговых операций в терминал.
За основу алгоритма для торговли возьмем алгоритм, который я описывал ранее (
http://robostroy.ru/community/article.aspx?id=537). В качестве входа в сделку используется свечной паттерн: две повышающиеся свечи — дают сигнал на покупку, две понижающиеся — сигнал на продажу.
Помимо этого, условием входа в длинную позицию также является условие:
High[bar] > High[bar-1] and Low[bar] > Low[bar-1]
т.е. максимум текущей свечи больше максимума предыдущей и минимум текущей больше минимума предыдущей.
И дополнительное условие входа в короткую позицию при обратном соотношении:
High[bar] < High[bar-1] and Low[bar] < Low[bar-1]
При этом ограничим время входа только дневной сессией с исключением первого часа торгов. Определим стоп-лосс на сделку равным 1%, соответственно тейк-профит выставим в 4%.
Рис. 1. Кривая доходности системы
Рис. 2. Статистика системы
Рис. 3. Просадка системы при торговле с 1 плечом при реинвестировании
Для отправки заявки в QUIK нужно выполнить предварительные действия.
1) Настроить импорт данных в Quik. Выбрать в меню Торговля -> Внешние транзакции. Нажать на кнопку «Начать обработку». Тем самым мы заставим Quik принимать данные
2) Воспользоваться динамической библиотекой Trans2Quik для отправки заявок на покупку/продажу в QUIK. Данная библиотека имеет довольно неплохую документацию и поддержку на сайте разработчика Quik компании Arqa —
http://quik.ru/. Для этого нужно добавить в наш проект файл TRANS2QUIK.dll. Собственно DLL — это Dynamic Link Library, т.е. динамическая библиотека. Однако, добавить в обозреватель решений ссылку на этот файл не получится, т.к. данная библиотека является Native DLL. Т.е. это библиотека собранная с помощью компилятора Native языка ( C, C++, Delphi), скомпилированная в машинный код. Поэтому просто скопируем данный файл TRANS2QUIK.dll в папку с исполняемым файлом нашего проекта, к примеру «\bin\Debug».
Для отправки заявки для начала нужно соединиться с Quik. Рассмотрим на примере класса TransToQuik.cs, который реализует набор функций для упрощения работы с динамической библиотекой. В конструктор класса передается строковый параметр path – путь до папки где лежит Quik.
TransToQuik trans = new TransToQuik(path);
В данном классе главным для нас является метод отправки заявки в QUIK send_sync_transaction, который принимает два параметра: первый – строку для отправки в QUIK и номер заявки:
public long send_sync_transaction(string transactionStr, ref double OrderNum)
Заявка в Quik отправляется в виде текстовой строки. Пример:
«ACCOUNT=L01-00000F00; ACTION=NEW_ORDER; CLIENT_CODE=20666; TYPE=L; TRANS_ID=33; CLASSCODE=EQBR; SECCODE=SBER03; OPERATION=B; PRICE=100.95; QUANTITY=1;»
Отправка данной заявки реализуется с помощью динамического импорта транзакций QUIK. Подробное описание параметров для отправки транзакций в QUIK содержится в главе 6 справки QUIK (Работа с другими приложениями).
Читать продолжение на сайте robostroy.ru
создадим новый класс, назовем его MyRobot. В нем предусмотрим следующие методы:
1) Метод получения и обработки данных полученных DDE – receiveCandles. Этот метод будет обрабатывать свечи, пришедшие из QUIK, в объекты класса Candle, который хранит в себе данные о свече в формате OHLC – открытие, максимальное значение, минимальное значение, закрытие и дату свечи.
2) Метод runRobot(List<Candle> candles), который реализует основную логику работы роботу. В коде есть достаточное количество комментариев, поэтому всю логику я описывать не буду, а лишь приведу краткий алгоритм (Рис. 5).
Рис. 5. Алгоритм робота
3) Метод отправки заявки в QUIK – sendOrder. Этот метод принимает два параметра – цену и направление сделки и формирует строку-заявку, которую отсылает в QUIK.
Таким образом, наше приложение несколько изменило свой внешний вид (Рис. 6), появились дополнительные объекты на форме, отвечающие за связь с терминалом QUIK и лог-транзакций.
Рис.6. Итоговое приложение.
Для создания реального робота, к приложении, конечно, требуется отслеживать статус выполнения заявки, соединения с Quik. В данном примере мы разобрали, как принимать данные из QUIK и отправлять заявки, однако это всего лишь пример, который, надеюсь, позволит разобраться начинающим робостроителям с основами построения торговых роботов.
Скачать код приложения и дополнительные файлы