Блог им. mirovan

Пишем торгового робота на C#. Часть 2. Реализация торгового алгоритма

В прошлой части данной статьи мы узнали, как подключиться к терминалу 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%.

 Пишем торгового робота на C#. Часть 2. Реализация торгового алгоритма
Рис. 1. Кривая доходности системы
 Пишем торгового робота на C#. Часть 2. Реализация торгового алгоритма
Рис. 2. Статистика системы
 Пишем торгового робота на C#. Часть 2. Реализация торгового алгоритма
Рис. 3. Просадка системы при торговле с 1 плечом при реинвестировании


Для отправки заявки в QUIK нужно выполнить предварительные действия.
1) Настроить  импорт данных в Quik. Выбрать в меню Торговля -> Внешние транзакции. Нажать на кнопку «Начать обработку». Тем самым мы заставим Quik принимать данные
 Пишем торгового робота на C#. Часть 2. Реализация торгового алгоритма
 
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).
 Пишем торгового робота на C#. Часть 2. Реализация торгового алгоритма
Рис. 5. Алгоритм робота
3)      Метод отправки заявки в QUIK – sendOrder. Этот метод принимает два параметра – цену и направление сделки и формирует строку-заявку, которую отсылает в QUIK.
Таким образом, наше приложение несколько изменило свой внешний вид (Рис. 6), появились дополнительные объекты на форме, отвечающие за связь с терминалом QUIK и лог-транзакций.
 Пишем торгового робота на C#. Часть 2. Реализация торгового алгоритма
Рис.6. Итоговое приложение.
Для создания реального робота, к приложении, конечно, требуется отслеживать статус выполнения заявки, соединения с Quik. В данном примере мы разобрали, как принимать данные из QUIK и отправлять заявки, однако это всего лишь пример, который, надеюсь, позволит разобраться начинающим робостроителям с основами построения торговых роботов.


Скачать код приложения и дополнительные файлы
1.3К | ★18
1 комментарий
+++
avatar

Читайте на SMART-LAB:
✅ Займер сменил статус на МКК
Теперь компания зарегистрирована в ЕГРЮЛ как ПАО МКК “Займер”. Эта перерегистрация стала логичным следствием процесса смены вида МФК “Займер” на...
Фото
Крупные страховые начали повышать тарифы по ОСАГО
Агентство АСН выяснило, что некоторые страховые компании, входящие в топ-10 по ОСАГО, изменили тарифы по ОСАГО для физлиц с 20 января 2026 г. В...
Фото
Новосибирскэнергосбыт. Надбавки на 26г. установлены. Изменение целевой цены
Департамент по тарифам Новосибирской области опубликовал приказ №681 от 30.12.2025г. об установлении сбытовых надбавок гарантирующего...
Фото
Сбер РПБУ 2025 г. - дешевле было только в 2022 году
Сбер опубликовал результаты по РПБУ за 2025 год Чистая прибыль за 2025 год составила 1,69 трлн руб. (+8,4% год к году). В декабре 126 млрд руб....

теги блога Максим Милованов

....все тэги



UPDONW
Новый дизайн