Конструктор трейдера: Drag Trade Library

TheXpert | 7 мая, 2010

Введение

На момент написания продукта уже существовало несколько продуктов, реализующих – в той или иной мере – функционал, представленный в библиотеке, или похожий на него. Не могу сказать, что библиотека лучше или хуже. Некоторым, например небезызвестному Автографу, она сильно проигрывает в функционале, другим в удобстве. Однако, у Drag Trade Library есть свои особенности, и надеюсь, продукт окажется востребованным.

1. Цели создания

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

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

2. Структура

Функционал библиотеки можно разбить на четыре блока:

  1. Торговый блок
  2. Информационный блок
  3. Блок работы с ордерами
  4. Блок настроек


Рис. 1. Функционал библиотеки

Соответственно блокам происходит и отображение функционала советника – пользовательский интерфейс разбит на 3 независимых блока, которые можно использовать как совместно, так и независимо, отключая и подключая небходимые блоки по мере необходимости во время работы. Также такой подход позволяет не расходовать впустую ресурсы на обработку ненужного в данный момент логического блока или вообще расходовать минимум ресурсов при отключенном функционале. По умолчанию весь функционал отключен.

2.1. Принципы отключения/подключения блоков

Весь функционал по отрисовке и обработке блоков находится в советнике. Однако отрисовка информации и большинства управляющих и информационных объектов происходит не в главном окне инструмента. Место для отрисовки предоставляют псевдоиндикаторы, они же являются выключателями функционала. Это значит, что наличие соответствующего индикатора на графике означает, что соответствующий функционал советника включен и работает.

Сами индикаторы никакой смысловой нагрузки не несут. Предоставление места их единственная задача.

Рис 2. Вспомогательные индикаторы

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

3. Пользовательский интерфейс

3.1. Настройки советника

Настройки вынесены из библиотеки в отдельный функциональный блок. Благодаря этому, стало возможно собственно выделить весь функционал в библиотеку и настраивать его извне, причем настраивать можно как до, так и во время работы советника, кроме того, возможно разделять настройки на отдельные логические блоки и не экономить на описании.

Сам процесс происходит применением соответствующего скрипта к нужному графику.

На данный момент есть 3 скрипта с настройками:

У каждого свойства есть описание в скрипте, поэтому, думаю, разобраться с их установкой проблем возникнуть не должно.

Реализация этой особенности использует глобальные переменные терминала для хранения настроек. Это налагает некоторые ограничения на ее использование – таким образом нельзя передавать строки, т.к. максимальный размер передаваемой информации ограничен и равен размеру типа double, т.е. 8 байт.

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

Для того, чтобы можно было свободно проводить тестирование стратегии на тестере, не боясь сбить или поменять параметры для онлайн-торговли, передача параметров для онлайн режима и тест-режима различается. Установка свойств для одного не окажет влияния на другой.

Поэтому, если хочется поменять параметры по умолчанию в тестере, необходимо воспользоваться аналогичными скриптами для тест-режима:

3.2. Функционал

Итак, интерфейс разбит на 3 независимые отключаемые области:

Целиком это выглядит так:


Рассмотрим более подробно каждый из них.

3.2.1. Информационная панель

Информационная панель является областью для отображения информации. Это наиболее простая часть функционала. Отображается как общая информация по счету и инструменту, так и текущие настройки библиотеки.

Рис 3. Информационная панель

Информация для отображения легко наращивается, правда, для этого придется править код библиотеки.

Для тех, кого это не пугает – функционал находится в функциях: void ClearInformation() и void DrawInformation()

3.2.2. Панель ордеров

На данной панели отображается информация по текущим (отрытым) ордерам инструмента, а также находятся элементы управления ими.

Рис 4. Панель ордеров

Что можно делать при подключении этой панели:

В следующем видео наглядно представлен функционал данной панели:

3.2.3. Торговая панель

Данная панель служит для отображения торгового функционала. Эта панель является самой главной и самой необходимой, т.к. включает основной функционал библиотеки. При подключении этой панели появляется возможность открывать ордера, а также управлять ими с помощью управляющих объектов прямо на графике.

Рис 5. Торговая панель

Что можно делать при подключении этой панели:

Открытие рыночных ордеров происходит следующим образом:

Закрытие рыночного ордера происходит простым перетягиванием любого из стоп-уровней по другую сторону цены.

На видео ниже показаны примеры работы с рыночными ордерами

Работа с ордерами на покупку:




Работа с ордерами на продажу:




Открытие отложенных ордеров происходит так:

Закрытие рыночного ордера происходит простым перетягиванием линии ордера по другую сторону цены.

На видео ниже показаны примеры работы с отложенными ордерами.

Работа со стоп-ордерами:




Работа с лимитными ордерами:



4. Встраивание в советник

Наконец, самое интересное.

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

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

//+------------------------------------------------------------------+
//|                                      DragTrade_Example_v_1.0.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, TheXpert"
#property link      "theforexpert@gmail.com"

extern int      Magic          = 1111;
extern int      EAMagic        = 1234;
extern int      TimesToRepeat  = 3;
extern int      Slippage       = 3;

#include <DragTrade_v_1.0/DragTradeLib_v_1.0.mqh>

bool Testing;

int init()
{
   Testing = IsTesting();
   DragTrade_Init(Magic, EAMagic, TimesToRepeat, Slippage, "Drag Trade Example");

   Comment_("Test Example of using Drag Trade Library");

   return(0);
}

int deinit()
{
   DragTrade_Deinit();
   return(0);
}

int start()
{
   DragTrade_Start();
   
   return(0);
}

Данный код можно использовать как готовый советник для торговли мышкой.

В данном приведенном выше коде обработка событий будет по пришествии нового тика.

Основные моменты добавления библиотеки:

  1. DragTrade_Init
  2. DragTrade_Deinit
  3. DragTrade_Start

Функция DragTrade_Init имеет следующий вид:

   void DragTrade_Init(int magic, int eaMagic, int timesToRepeat, int slippage, string ordersComment = "");

Остановимся подробнее на передаваемых параметрах:

Если хочется быстрого исполнения команд, функцию start советника можно зациклить:

int start()
{
   while (!IsStopped())
   {
      DragTrade_Start();
      Sleep(200);
   }
   return(0);
}

Однако такой советник нельзя будет протестировать в тестере -- он зависнет.

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

int start()
{
   if (Testing)
   {
      DragTrade_Start();
   }
   else
   {
      while (!IsStopped())
      {
         RefreshRates();
         
         DragTrade_Start();
         Sleep(200);
      }
   }
   
   return(0);
}

Именно такой простейший советник идет в стандартной поставке, приложенной к статье.

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

В файле DragTradeLib_v_1.0.mqh кроме необходимых для подключения функций есть также целый набор функций, полезных при реализации торговых стратегий, которые используются библиотекой и могут быть использованы при реализации Вашего кода.

5. Установка библиотеки

Установка проста -- необходимо распаковать содержимое приложенного к статье архива в папку Вашего терминала, после чего необходимо перезапустить терминал, если он работал, для того, чтобы исполняемые файлы появились в списке доступных в терминале.

6. Лицензия

/* =============================================================================================== */
/* Copyright (c) 2010 Труханович Андрей Николаевич (aka TheXpert)                                  */
/*                                                                                                 */
/* Данная лицензия разрешает, безвозмездно, лицам, получившим копию данного программного           */
/* обеспечения и сопутствующей документации (в дальнейшем именуемыми "Программное Обеспечение"),   */
/* использовать Программное Обеспечение без ограничений, включая неограниченное право на           */
/* использование, копирование, изменение, добавление, публикацию, распространение,                 */
/* сублицензирование и/или продажу копий Программного Обеспечения, также как и лицам,              */
/* которым предоставляется данное Программное Обеспечение, при соблюдении следующих условий:       */
/*                                                                                                 */
/*                                                                                                 */
/* Вышеупомянутый копирайт и данные условия должны быть включены во все копии или значимые         */
/* части данного Программного Обеспечения.                                                         */
/*                                                                                                 */
/* ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ ЛЮБОГО ВИДА ГАРАНТИЙ, ЯВНО       */
/* ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ,   */
/* СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И НЕНАРУШЕНИЯ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ     */
/* ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ ИЛИ ДРУГИХ       */
/* ТРЕБОВАНИЙ ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ ПРИЧИНОЙ ИЛИ    */
/* СВЯЗАННЫМ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ИНЫМИ      */
/* ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.                                                          */
/* =============================================================================================== */

Заключение

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

В очередной раз хочется выразить огромную благодарность Рустамову Виктору Хабибулаевичу. Именно он стал автором идеи написания библиотеки, а также тестером и ценным советчиком в процессе реализации идеи.

Кода довольно много, поэтому скорее всего остались мелкие ошибки и недочеты. Буду очень признателен, если Вы будете сообщать о них.

Посильное (не гарантированное) сопровождение кода я постараюсь обеспечить. Я только "ЗА" развитие проекта другими людьми при соблюдении условий лицензии. Замечания и пожелания по работе библиотеки постараюсь учесть в следующих версиях.

Удачи Вам и легкой торговли!