Создание нейросетевых торговых роботов на базе MQL5 Wizard и Hlaiman EA Generator
Практически каждый трейдер знает, что существует такой инструмент как нейросеть, но для большинства это черный ящик, о котором им известно только то, что она, подобно человеку, способна к распознаванию образов, ассоциативному поиску решений и обучению, а также то, что она может быть эффективно использована для прогнозирования рынка и автоматической торговли. Однако множество источников информации, посвященных применению нейронных сетей, акцентируют внимание на сложности этого инструмента и утверждают, что необходимо потратить огромное количество времени для его изучения и для того, чтобы научиться им пользоваться.
В данной статье будет предпринята попытка опровергнуть эти утверждения и доказать, что современные методы автоматизации позволяют трейдеру легко начать работать с нейросетями, минуя длительные этапы изучения. Получить свой опыт использования нейросетей — это очень просто, уж точно проще, чем технический анализ.
Для этого будет описан метод автоматической генерации нейросетевых советников-роботов MetaTrader 5 на базе MQL5 Wizard и Hlaiman EA Generator.
Выбор средств для решения поставленной задачи не случаен:
- MQL5 Wizard – это эффективный и наиболее быстрый на сегодняшний день механизм автоматической генерации MQL5 кода, который масштабируется с помощью дополнительных модулей.
- Hlaiman EA Generator — это нейросетевой движок с гибким механизмом объектной интеграции, который программируется непосредственно в MQL5 коде советника.
Дополнение «робот» к названию советника также не случайно, поскольку характерные для настоящего робота антропоморфные признаки по распознаванию и обучению у нейросетевого советника являются основными, в отличие от других случаев применения этого названия, где «торговый робот» часто не соответствует сущности.
Общая характеристика
По причине, обозначенной в цели статьи, вы не найдете в ней описания теоретических основ, классификации и устройства нейронных сетей, а также материалы исследований, относящихся к финансовым рынкам. Для этого существует множество других источников. Здесь же мы умышленно ограничимся представлением о нейронной сети, как о черном ящике, способном к ассоциативному мышлению и прогнозированию входа в рынок на основе распознавания графических ценовых паттернов. По этой же причине остановимся на наиболее простом представлении о паттерне, как о непрерывной последовательности бар на графике торгового инструмента, которая предшествует прибыльному движению цены.
Кратко о средствах решения задачи. В отличие от Hlaiman, MQL5 Wizard — неоднократно освещался в статьях и документации, он, как и MetaTrader 5, в презентации не нуждается. Социально ориентированный проект Hlaiman предназначен для разработки и продвижения многопрофильного модульного программного обеспечения в виде плагинов, одним из которых и является EA Generator. Функционально, как уже указывалось выше, EA Generator представляет из себя нейросетевой движок и средства интеграции.
В состав Hlaiman EA Generator входит оболочка , которая представляет собой Windows GUI приложение с мультидокументным интерфейсом и плагины в виде динамически загружаемых компонентных библиотек. Система предоставляет широкий набор ручных и алгоритмических методов настройки и управления компонентами, как загружаемыми в составе плагинов, так и базовыми. В процессе ее работы можно создавать сложные древовидные структуры объектов и гибко управлять их методами и свойствами, как при помощи ручного диалога (Object Inspector), так и при помощи программных средств автоматизации, например скриптов.
Для интеграции Hlaiman EA Generator в MQL5 используется скриптовый интерпретатор Object Pascal, передача исходного кода осуществляется по именованным каналам Named Pipes, а в качестве главного нейросетевого компонента применяется многослойный персептрон MLP.
Интеграция Hlaiman EA Generator в MQL5 Wizard выполняется посредством модуля библиотеки сигналов SignalHNN.mqh. После автоматической генерации советники могут быть обучены торговле на любом количестве инструментов и таймфреймов. Для этого в терминале МetaТrader 5 можно вручную наносить на график цены графические объекты стрелок, указывающие на сигналы, или использовать скрипт TeachHNN.mq5 для автоматического нанесения, который так же автоматически запускает процесс обучения советника.
На этом теоретическое описание заканчивается и начинается практическая часть, которая состоит из двух разделов, а именно — «Как это работает» и «Как это устроено».
Второй раздел предназначен для программистов и приведен скорее в знак уважения к настоящему ресурсу, поэтому его чтение не является обязательным, особенно для трейдеров, которых интересует не навыки программирования, а практика создания нейросетевых советников-роботов и оценка их эффективности или бесполезности для своей торговли.
Как это работает
В MQL5.community, наверное, излишне напоминать, что для работы необходим терминал MetaТrader 5. Если он у вас не установлен — то скачайте и установите его. Также скачайте и установите демо-версию пакета Hlaiman EA Generator.
Запустите терминал МetaТrader 5 и MetaEditor. Войдите в мастер создания советников MQL5. Мастер MQL5 может быть вызван с помощью команды «Создать» в меню «Файл» или панели инструментов «Стандартная», а также при помощи горячих клавиш «Ctrl+N».
В окне мастера MQL5 выберите пункт «Советник (сгенерировать)» и нажмите «Далее».
Рис. 1. Создание советника в Мастере MQL5
Введите путь и имя советника, например «ExpertsSampleHNN», и нажмите «Далее».
Рис. 2. Общие параметры советника
Нажмите кнопку «Добавить». В появившемся окне «Параметры модуля сигналов» выберите модуль сигналов «Signals of patterns Hlaiman Neural Network EA generator» из выпадающего списка и нажмите «OK».
Рис. 3. Выбор модуля торговых сигналов Hlaiman Neural Network EA generator
В самом простом случае реализации на оставшихся этапах мастера MQL5 можете нажимать «Далее». При необходимости вы также можете выбрать дополнительные опции советника.
По завершению процесса генерации кода нажмите кнопку «Компилировать» и закройте окно «MetaEditor». Созданный советник будет отображен в разделе «Советники» на панели «Навигатор» терминала МetaТrader 5.
Рис. 4. Советник SampleHNN
Прежде чем приступить к обучению созданного советника, необходимо открыть в терминале график с требуемым символом и таймфреймом. Приложение Hlaiman EA Generator обязательно должно быть запущено.
Рис. 5. Подготовка к обучению нейросети
Для обучения советника, на панели терминала «Навигатор» в разделе «Скрипты», выберите «TeachHNN» и активируйте его для выбранного графика.
Скрипт «TeachHNN», перед запуском должен быть соответствующим образом настроен. Для этого у него имеются следующие параметры:
- Document name — наименование советника для обучения;
- Neural layers — количество слоев в нейросети;
- Middle neurons — количество нейронов;
- Teaching epochs — количество эпох обучения;
- Pattern bars — количество баров в паттерне;
- Teaching a net? — запустить обучение нейросети (или просто создание сигналов);
- SignalsCreate — автоматически создать графические изображения сигналов;
- SignalsBarPoints — порог для создания сигнала в количестве пунктов;
- SignalsBarsCount — количество баров для подсчета количества пунктов;
- SignalsStartTime, SignalsEndTime — время начала и конца периода для создания сигналов;
- SignalsClear — автоматически удалять изображения сигналов по завершению обучения.
Рис. 6. Параметры скрипта TeachHNN
Если все готово, жмите «OK» для запуска процесса обучения советника. Начнется автоматическое формирование графических паттернов по каждому из имеющихся на графике сигналов.
Информация об этом отображается в журнале «Эксперты» на панели «Инструменты» терминала, а в окне Hlaiman EA Generator появляются соответствующие объекты.
После завершения формирования паттернов начинается непосредственное обучение нейросети. Об этом сигнализирует появляющаяся на экране панель хода обучения.
Рис. 7. Панель процесса обучения
Дождитесь окончания процесса. Досрочная же остановка обучения доступна из контекстного меню по щелчку правой кнопкой мыши на панели хода обучения.
Сообщение об окончании обучения и работы скрипта будет отражено в журнале на вкладке «Эксперты». Например сообщение «Neural net create success! On 431 patterns» свидетельствует об успешном завершении обучения советника с использованием 431-го сигнала.
По сообщениям можно определить, сколько и какие номера паттернов участвовали в обучении. В частности, BUY и SELL определяются по сообщениям типа «Sell signal detected at pattern #211».
Рис. 8. Сообщения скрипта TeachHNN в процессе обучения
Причины, по которым процесс обучения советника может запускается с ошибкой:
- Предварительно не была запущена программа Hlaiman. В этом случае будет отображено сообщение «CSignalHNN::InitHNN: Error! initializing pipe server (possible reason: HLAIMAN APPLICATION IS NOT RUNNING!)».
- Отсутствие стрелок, обозначающих сигналы на графике, при отключенной автогенерации сигналов (переменная SignalsCreate = false). В этом случае будет отображено сообщение «OnStart: error, orders arrow not found!». При включенной автогенерации сигналов (переменная SignalsCreate = true) ошибку может вызывать наличие на графике других графических объектов, так как в программе предполагается не портить пользовательские разметки. Поэтому для автогенерации сигналов рекомендуется открывать все графики отдельно.
После обучения советника можно просмотреть его результаты. Для этого вам необходимо перейти в GUI Hlaiman и выбрать соответствующие объекты и панели визуализации.
Рис. 9. Вкладка «Text» программы Hlaiman
Рис. 10. Вкладка «Graph» программы Hlaiman
После успешного обучения советника хотя бы на одном из торговых инструментов можно приступать к его тестированию и/или оптимизации.
Для этого выберите в тестере имя обученного советника, символ, таймфрейм, интервал и другие параметры тестирования. При необходимости выполните настройку внешних переменных и запустите тест.
Рис. 11. Настройки тестирования советника SampleHNN на исторических данных
Рис. 12. Внешние переменные советника SampleHNN могут быть модифицированы
Ниже приведен пример отчета по работе советника в тестере стратегий. Советник был обучен по автоматически сгенерированным сигналам, все внешние параметры обучающего скрипта выставлены по умолчанию, период обучения — 01.01.2010-01.07.2013 по инструменту EURUSD H4.
Отчет Тестера стратегий
Советник: | SampleHNN |
---|---|
Символ: | EURUSD |
Период: | H4 (2010.01.01-2013.07.12) |
Валюта: | USD |
Начальный депозит: | 10 000.00 |
Плечо: | 0,111111111 |
Бэктест | |
Качество истории: | 100% |
Бары: | 5497 |
Чистая прибыль: | 9 159.58 |
Общая прибыль: | 29 735.97 |
Общий убыток: | -20 576.39 |
Прибыльность: | 1.45 |
Фактор восстановления: | 12.81 |
AHPR: | 1.0005 (0.05%) |
GHPR: | 1.0005 (0.05%) |
Всего трейдов: | 1417 |
Всего сделок: | 2246 |
Тики: | 60211228 |
Абсолютная просадка по балансу: | 0.00 |
Максимальная просадка по балансу: | 679.98 (3.81%) |
Относительная просадка по балансу: | 4.00% (715.08) |
Матожидание выигрыша: | 6.46 |
Коэффициент Шарпа: | 0.16 |
LR Correlation: | 0.98 |
LR Standard Error: | 595.06 |
Короткие трейды (% выигравших): | 703 (56.61%) |
Прибыльные трейды (% от всех): | 793 (55.96%) |
Самый большой прибыльный трейд: | 53.00 |
Средний прибыльный трейд: | 37.50 |
Максимальное количество непрерывных выигрышей: | 9 (450.38) |
Максимальная непрерывная прибыль: | 450.38 (9) |
Средний непрерывный выигрыш: | 2 |
Символы: | 1 |
Абсолютная просадка по средствам: | 6.60 |
Максимальная просадка по средствам: | 715.08 (4.00%) |
Относительная просадка по средствам: | 4.00% (715.08) |
Уровень маржи: | 6929.24% |
Z-Счет: | -1.24 (78.50%) |
Результат OnTester: | 0 |
Длинные трейды (% выигравших): | 714 (55.32%) |
Убыточные трейды (% от всех): | 624 (44.04%) |
Самый большой убыточный трейд: | -53.30 |
Средний убыточный трейд: | -32.97 |
Максимальное количество непрерывных проигрышей: | 9 (-234.00) |
Максимальный непрерывный убыток: | -276.67 (7) |
Средний непрерывный проигрыш: | 2 |
Рис. 13. Результаты тестирования советника SampleHNN на исторических данных
Рис. 14. Статистика входов советника SampleHNN
Рис. 15. Корреляция прибыли и MFE/MAE советника SampleHNN
Рис. 16. Статистика времени удержания позиции советника SampleHNN
Как это устроено
Главным компонентом программной реализации на MQL5 является класс CSignalHNN, описанный в модуле сигналов SignalHNN.mqh. Класс наследован от базового класса CExpertSignal и включает в себя все необходимые поля данных и методы для работы и интеграции Hlaiman, а также для работы с советниками, создаваемыми с помощью мастера MQL5.
Шаблон класса выглядит следующим образом:
//+------------------------------------------------------------------+ //| Class CSignalHNN. | //| Purpose: Class of generator of trade signals based on | //| the 'Hlaiman EA Generator Neural Net' indicator. | //| Is derived from the CExpertSignal class. | //+------------------------------------------------------------------+ class CSignalHNN :public CExpertSignal < protected: //--- variables int m_hnn; // handle of HNN connect string hnn_path; // MT5 Terminal data path string hnn_fil; // HNN file w neural net string hnn_nam; // Expert name string hnn_sym; // Symbol name string hnn_per; // Period name ENUM_TIMEFRAMES hnn_period; // Period timeframe int hnn_index; // Index ext multinet int hnn_bar; // index of last bar int hnn_in; // input layer int hnn_out; // output layer int hnn_layers; // layers count int hnn_neurons; // neurons count int hnn_epoch; // learn epoch double hnn_signal; // value of last signal double pattern[]; // values of the pattren bool hnn_norm; // normalize pattern public: CSignalHNN(void); // class constructor ~CSignalHNN(void); // class destructor //--- methods of setting adjustable parameters void PatternBarsCount(int value) < hnn_in = value; ArrayResize(pattern, value + 1); > void LayersCount(int value) < hnn_layers = value; > void NeuronsCount(int value) < hnn_neurons = value; > void EpochCount(int value) < hnn_epoch = value; > void Normalize(bool value) < hnn_norm = value; > //--- method of verification of settings virtual bool ValidationSettings(void); //--- method of creating the indicator and timeseries virtual bool InitIndicators(CIndicators *indicators); //--- methods of checking conditions of entering the market virtual double Direction(void); bool FillPattern(datetime tim = 0); // prepare pattern bool AddPattern(string name, int ptype); // add new pattern bool TeachHNN(void); // learn neural net bool SaveFileHNN(void); // neural net file double CalculateHNN(void); // calc neural signal //protected: //--- method of initialization of the Hlaiman Application bool InitHNN(bool openn); // Hlaiman App Init void FreeHNN(void) < // Hlaiman App Deinit if(m_hnn!=0 && m_hnn!=INVALID_HANDLE) < FileClose(m_hnn); m_hnn=0; > >; >;
После создания экземпляра класса с помощью конструктора этот объект может работать в двух основных режимах:
- Режим обучения: в этом режиме происходит сбор рыночных паттернов и обучение нейросети.
- Режим индикатора: в данном режиме по текущему паттерну рассчитывается сигнал нейросети.
Идентификация режима происходит при вызове метода инициализации InitHNN посредством булевского параметра openn. Причем истинное значение этого параметра инициирует поиск и открытие файла данных уже обученной нейросети, его загрузку и работу в режиме индикатора (2). Этот режим является рабочим и используется в советнике для торговли.
В отличие от режима обучения (1), который инициируется при вызове метода InitHNN с параметром openn=false, этот режим индикатора является для советника подготовительным и используется для работы обучающего скрипта.
Реализация метода инициализации выглядит следующим образом:
//+------------------------------------------------------------------+ //| Initialize HNN | //+------------------------------------------------------------------+ bool CSignalHNN::InitHNN(bool openn) < //--- initialize Hlaiman Application int num=0; ulong res=0; if(m_symbol!=NULL) < hnn_sym=m_symbol.Name(); hnn_period=m_period; >else < hnn_sym=_Symbol; hnn_period=_Period; > hnn_per = string(PeriodSeconds(hnn_period) / 60); hnn_fil = hnn_nam + NAME_DELIM + hnn_sym + hnn_per + NAME_DELIM + string(hnn_index) + TYPE_NEURO; if(m_hnn== 0|| m_hnn == INVALID_HANDLE) m_hnn=FileOpen(HLAIMAN_PIPE,FILE_READ|FILE_WRITE|FILE_BIN); if(m_hnn!=0 && m_hnn!=INVALID_HANDLE) < string source,result=""; if(openn==true) < result=CON_OPENN+CON_TRUE; if(!FileIsExist(hnn_fil,FILE_READ)) < if(FileIsExist(hnn_fil,FILE_READ|FILE_COMMON)) hnn_fil=TerminalInfoString(TERMINAL_COMMONDATA_PATH)+PATH_FILES+hnn_fil; else < // hnn_fil = hnn_path + PATH_MQL5 + PATH_FILES + hnn_fil; hnn_fil=TerminalInfoString(TERMINAL_DATA_PATH)+PATH_MQL5+PATH_FILES+hnn_fil; > > else hnn_fil=TerminalInfoString(TERMINAL_DATA_PATH)+PATH_MQL5+PATH_FILES+hnn_fil; > else < result=CON_OPENN+CON_FALSE; hnn_fil=TerminalInfoString(TERMINAL_DATA_PATH)+PATH_MQL5+PATH_FILES+hnn_fil; > source="unit InitHNN; Interface "+result+" var libr, term, exp, sym: TObject;" " Implementation function main: integer;nr" // Line #1 " begin" " Result := 0;" " libr := Open('mt45.dll');nr" // Line #2 " if (libr <> nil) then" " begin" " term := Open('"+hnn_path+"');nr" // Line #3 " if (term <> nil) then" " begin" " exp := term.ObjectOfName('"+hnn_nam+"');" " if (exp = nil) then exp := term.AddObject('TMT45Expert');nr" // Line #5 " if (exp <> nil) then" " begin" " if (exp.Name <> '"+hnn_nam+"') then exp.Name := '"+hnn_nam+"';nr" // Line #6 " sym := exp.ObjectOfName('"+hnn_sym+hnn_per+"');" " if (sym = nil) then sym := exp.AddObject('TMT45Symbol');" " if (sym <> nil) then" " begin" " sym.Log.Add('"+hnn_sym+hnn_per+"');nr" " if (sym.Name <> '"+hnn_sym+hnn_per+"') then sym.Name := '"+hnn_sym+hnn_per+"';" " if (sym.Period <> "+hnn_per+") then sym.Period : string">";" " if (openn = true) then" " begin" // " sym.Log.Add('" + hnn_fil + "');" " if (sym.Open('"+hnn_fil+"')) then Result := sym.TeachInput;nr" // ret input Line #8 " end else" " begin" " sym.TeachInput : functions">IntegerToString(hnn_in)+";" " sym.TeachOutput : functions">IntegerToString(hnn_out)+";" " sym.TeachLayer : functions">IntegerToString(hnn_layers)+";" " sym.TeachNeurons : functions">IntegerToString(hnn_neurons)+";" " sym.TeachEpoch : functions">IntegerToString(hnn_epoch)+";" " sym.FileName := '"+hnn_fil+"';" " Result := sym.TeachInput;nr" // ret input Line #9 " end;" " end;" " end;" " end;" " end;" " end; end."; FileWriteString(m_hnn,source,StringLen(source)); FileFlush(m_hnn); while(res0 && (MQL5InfoInteger(MQL5_TESTER) || numSleep(SLEEP_TIM); res=FileSize(m_hnn); num++; > if(res>0) < result=FileReadString(m_hnn,int(res/2)); res=StringToInteger(result); if(res<=RES_OK) printf(__FUNCTION__+": Error! Initialization data(possible reason: FILE NOT EXIST OR CORRUPTED "+hnn_fil); else < printf(__FUNCTION__+": Initialization successful! NEURAL PATTERN "+string(res)); ArrayResize(pattern,int(res+1)); return(true); > > else printf(__FUNCTION__+": Error! pipe server not responding(possible elimination: RESTART HLAIMAN APPLICATION)"); > else printf(__FUNCTION__+": Error! initializing pipe server (possible reason: HLAIMAN APPLICATION IS NOT RUNNING!)"); //--- ok return(false); >
Как видно из кода, на первом шаге инициализации делается попытка открыть именованный канал для установки связи с приложением Hlaiman. Если это не удается (например, когда не запущен), то осуществляется выход с отрицательным статусом. На втором шаге (при удачном завершении первого и рабочем режиме индикатора) происходит просмотр локальных и общих папок терминала с целью поиска соответствующего имени файла с данными нейросети. На третьем шаге выполняется подготовка текста кода на языке ObjectPascal (Delphi) для инициализации непосредственно в приложении Hlaiman.
Текст кода помещается в строку source. Для удобства форматирования он разбит с помощью перевода каретки «nr» на подстроки и содержит обращения к свойствам и методам объектов Hlaiman (см. комментарии). Объектная среда MetaTrader 5 Hlaiman плагина, как определено в тексте, построена в иерархическую древовидную структуру, в корне которой находится объект самого плагина.
На следующем уровне находится объект терминала МetaТrader 5, затем — объекты советников и символов. При удачной трансляции и выполнении исходного кода, переданного по именованному каналу, в возвращаемом значении Result будет получено количество элементов входного вектора нейросети. Это значение, как видно из кода, используется для инициализации массива паттерна, и выполнение метода завершается с положительным статусом.
Следующими ключевыми методами класса CSignalHNN являются CalculateHNN, AddPattern и TeachHNN, первый из которых возвращает результат расчета нейросети в режиме индикатора. Вторые два используются в режиме обучения для пополнения коллекции при сборе паттернов и запуске процесса обучения нейросети соответственно.
Реализация указанных методов в файле выглядит следующим образом:
//+------------------------------------------------------------------+ //| Calculate HNN signal | //+------------------------------------------------------------------+ double CSignalHNN::CalculateHNN(void) < if(m_hnn==0 || m_hnn==INVALID_HANDLE) return(0.0); int num = 0; ulong siz = 0; double res=0.0; string source,result=""; if(FillPattern(0)==true) < result=CON_START; for(int i=1; i<(ArraySize(pattern)-1); i++) result= result+DoubleToString(pattern[i])+CON_ADD; result = result + DoubleToString(pattern[ArraySize(pattern) - 1]) + CON_END; source = "unit CalcHNN; Interface " + result + " var i: integer; libr, term, exp, sym, lst: TObject;" " Implementation function main: double;nr" // Line #1 " begin" " Result := 0.0;" " libr := Open('mt45.dll');nr" // Line #2 " if (libr <> nil) then" " begin" " term := Open('"+hnn_path+"');nr" // Line #3 " if (term <> nil) then" " begin" " exp := term.ObjectOfName('"+hnn_nam+"');nr" // Line #4 " if (exp <> nil) then" " begin" " sym := exp.ObjectOfName('"+hnn_sym+hnn_per+"');nr" // Line #5 " if (sym <> nil) then" " begin" " lst := TStringList.Create;" " if (lst <> nil) then" " begin" " lst.Text := cons;" " if (lst.Count >= sym.NetInputs.Count) then" " begin" " for i := 0 to sym.NetInputs.Count - 1 do" " begin" " sym.NetInputs.Objects[i].NetValue := StrToFloat(lst[i]);nr" // Line #6 // " sym.Log.Add('Input ' + IntToStr(i) + ' = ' + lst[i]);" " end;" " sym.Computed := true;" " Result := sym.NetOutputs.Objects[0].NetValue;nr" // ret input Line #7 " end;" " lst.Free;" " end;" " end;" " end;" " end;" " end;" " end; end."; FileWriteString(m_hnn,source,StringLen(source)); FileFlush(m_hnn); while(siz0 && (MQL5InfoInteger(MQL5_TESTER) || numSleep(SLEEP_TIM); siz=FileSize(m_hnn); num++; > if(siz>0) < result=FileReadString(m_hnn,int(siz/2)); res=StringToDouble(result); > > //else Print("fill pattern error!"); return(res); > //+------------------------------------------------------------------+ //| AddPattern | //+------------------------------------------------------------------+ bool CSignalHNN::AddPattern(string name,int ptype) < int num=0; long res=0; ulong siz=0; string result,source,nam=name; if(m_hnn!=0 || m_hnn!=INVALID_HANDLE) < pattern[0]=ptype; result=CON_START; for(int i=0; i<(ArraySize(pattern)-1); i++) result= result+DoubleToString(pattern[i])+CON_ADD; result = result + DoubleToString(pattern[ArraySize(pattern) - 1]) + CON_END; source = "unit AddPatternHNN; Interface " + result + " Implementation function main: integer;" " var i: integer; out: double; onam: string;" " libr, term, exp, sym, ord, tck, lst: TObject;nr" // Line #1 " begin" " Result := 0;" " libr := Open('mt45.dll');nr" // Line #2 " if (libr <> nil) then" " begin" " term := Open('"+hnn_path+"');nr" // Line #3 " if (term <> nil) then" " begin" " exp := term.ObjectOfName('"+hnn_nam+"');nr" // Line #4 " if (exp <> nil) then" " begin" " sym := exp.ObjectOfName('"+hnn_sym+hnn_per+"');nr" // Line #5 " if (sym <> nil) then" " begin" " lst := TStringList.Create;" " if (lst <> nil) then" " begin" " lst.Text := cons;" " if (lst.Count >= (sym.TeachInput + sym.TeachOutput)) then" " begin" " out := StrToFloat(lst[0]);" " if(out >= 0) then onam := 'BUY-"+nam+"'" " else onam := 'SELL-"+nam+"';" " ord := sym.ObjectOfName(onam);" " if (ord = nil) then ord := sym.AddObject('TMT45Order');nr" // Line #6 " if (ord <> nil) then" " begin" " if (ord.Name <> onam) then ord.Name := onam;nr" // Line #7 " if (out >= 0) then ord.OrderType := 0 else ord.OrderType := 1;" " if (ord.NetOutput <> out) then ord.NetOutput := out;nr" // Line #8 " for i := 1 to sym.TeachInput do" " begin" " if(i " tck := ord.AddObject('TMT45Tick');nr" // Line #10 " if (tck <> nil) then" " begin" " tck.x := i;" " tck.y := StrToFloat(lst[i]);nr" // Line #11 " end;" " end;" " end;" " Result := sym.Count;nr" // ret input Line #12 " end;" " lst.Free;" " end;" " end;" " end;" " end;" " end;" " end; end."; FileWriteString(m_hnn,source,StringLen(source)); FileFlush(m_hnn); while(siz0 && (MQL5InfoInteger(MQL5_TESTER) || num Sleep(SLEEP_TIM); siz=FileSize(m_hnn); num++; > if(siz>0) < result=FileReadString(m_hnn,int(siz/2)); res=StringToInteger(result); > > return(res>0); > //+------------------------------------------------------------------+ //| TeachHNN | //+------------------------------------------------------------------+ bool CSignalHNN::TeachHNN(void) < int num=0; long res=0; ulong siz=0; string result,source; if(m_hnn!=0 || m_hnn!=INVALID_HANDLE) < source="unit TeachHNN; Interface const WAIT_TIM = 100; WAIT_CNT = 100;" " var i: integer; libr, term, exp, sym: TObject;" " Implementation function main: integer;nr" // Line #1 " begin" " Result := 0;" " libr := Open('mt45.dll');nr" // Line #2 " if (libr <> nil) then" " begin" " term := Open('"+hnn_path+"');nr" // Line #3 " if (term <> nil) then" " begin" " exp := term.ObjectOfName('"+hnn_nam+"');nr" // Line #4 " if (exp <> nil) then" " begin" " sym := exp.ObjectOfName('"+hnn_sym+hnn_per+"');nr" // Line #5 " if (sym <> nil) then" " begin" " if (sym.Teached) then sym.Teached := false;nr" // Line #6 " sym.Teached := true;nr" // Line #7 " Result := sym.Count;nr" // ret input Line #8 " end;" " end;" " end;" " end;" " end; end."; FileWriteString(m_hnn,source,StringLen(source)); FileFlush(m_hnn); while(siz0) // && (MQL5InfoInteger(MQL5_TESTER) || num < WAIT_TIMES)) Sleep(SLEEP_TIM); siz=FileSize(m_hnn); num++; > if(siz>0) < result=FileReadString(m_hnn,int(siz/2)); res=StringToInteger(result); > > return(res>0); >
Как видно из кода, тело методов в основном состоит из строк source, текст которых построен аналогично тем, что рассмотрены выше при описании метода InitHNN. Отличие состоит в том, что в объектной иерархии плагина для олицетворения паттернов добавлены два уровня — ордер и тик. Кроме того, в коде используются дополнительные свойства и методы объектов. Так для запуска расчета нейросети взводится флаг Computed объекта «символ», а для запуска обучения — флаг Teached.
Отличием в CalculateHNN от других методов является также тип возвращаемого функцией main значения — теперь он double. Это значение как раз и является откликом нейросети — сигналом, где в диапазоне 0..1 находится уровень BUY, а в диапазоне 0..-1 — уровень SELL. Контроль этого сигнала, который используется советником для принятия решений об открытии или закрытии соответствующих торговых позиций, осуществляется посредством метода Direction. Он отвечает за пересчет при появлении нового бара и возвращает его значение в процентном выражении.
//+------------------------------------------------------------------+ //| Check conditions for trading signals. | //+------------------------------------------------------------------+ double CSignalHNN::Direction(void) < if( m_hnn == 0 || m_hnn == INVALID_HANDLE) return(EMPTY_VALUE); //--- check new bar condition int cur_bar = Bars(hnn_sym, hnn_period); if (hnn_bar != cur_bar) < //--- condition OK hnn_signal = CalculateHNN() * 100; hnn_bar = cur_bar; > return(hnn_signal); >
Для настройки порога чувствительности советника к сигналам на открытие и закрытие торговых позиций предназначены соответствующие внешние переменные:
- input int Signal_ThresholdOpen =10; // Signal threshold value to open [0. 100]
- input int Signal_ThresholdClose=10; // Signal threshold value to close [0. 100]
Практически уровни сигнала зависят от качества и интенсивности обучения нейросети, которую, как правило, можно визуально оценивать, наблюдая за динамикой уменьшения расчетной ошибки, отображаемой на индикаторе хода обучения.
Выводы
Использование Hlaiman EA Generator предоставляет компоненты и прозрачную контролируемую объектную среду интеграции в MQL5, при этом:
- В интерфейсе MQL5 Wizard появляется дополнительный тип, основанный на распознавании паттернов и сигналов, а также возможность генерации нейросетевых советников-роботов.
- Быстро создаваемые нейросетевые советники так же быстро могут быть адаптированы к изменениям рынка и многократно подвергаться обучению на различных торговых инструментах и таймфреймах.
- Благодаря возможности MQL5 Wizard подключать несколько модулей сигналов, можно создавать сложные мультивалютные нейросетевые советники иили комбинированные индикаторно-нейросетевые советник. Также их можно комбинировать с различными дополнительными фильтрами, например, временными.
- Наконец, сам нейросетевой модуль можно использовать в качестве дополнительного фильтра для повышения эффективности уже готового рабочего советника. Для этого служит возможность обучения нейросети на графиках визуализации результатов теста исходного советника.
Одним из недостатков предложенной реализации можно считать использование скриптового интерпретатора, из-за чего интегрированная вычислительная система может показаться недостаточно быстродействующей. Однако нужно заметить, что во-первых, интерпретация скриптового кода, как и работа Hlaiman плагина, выполняется асинхронно с EX5, то есть выполняется распараллеливание задач. Во-вторых, для повышения быстродействия емких по времени вычислений, например, больших нейросетей, MetaTrader 5 и Hlaiman можно запускать на различных компьютерах со связью через сетевые именованные каналы. Причем запуск торгового терминала на отдельном компьютере в дополнение к увеличению быстродействия может повысить и его безопасность.
В качестве перспективы можно рассматривать разработку советников, самообучающихся в процессе торговли. Для начала, проще всего это сделать на основе объединения кода советника и обучающего скрипта, поскольку в них обоих используется один класс CSignalHNN, предоставляющий необходимую функциональность. Но это уже материал для продолжения или новой статьи, если это будет актуально.
Ознакомительную версию программы Hlaiman EA Generator можно скачать по ссылке.
- SignalHNN.mqh — модуль сигналов «MQL5IncludeExpertSignal».
- TeachHNN.mq5 — обучающий скрипт «MQL5Scripts».
- SampleHNN.mq5 — торговый советник на базе модуля торговых сигналов «Signals of patterns Hlaiman Neural Network EA generator», созданный при помощи MQL5 Wizard.
Программы для создания советников на МТ4 и МТ5
Точное количество советников для МетаТрейдера 4 сосчитать не получится, ежедневно база роботов пополняется десятками и даже сотнями новых торговых алгоритмов.
Общий счет уже давно перевалил за несколько тысяч. Но даже среди этого изобилия не всегда удается найти именно то, что нужно, потому многие и задумываются о том, как создать советник самостоятельно.
С языком программирования MQL4 знакомы не все, потому программы, облегчающие процесс создания робота, пользуются популярностью.
Как можно создать советник?
Обзор начнем с краткого описания всех возможных способов (возможно, вам и не придется разбираться с программами). Создать торговый робот можно:
• написав его самостоятельно в Meta Editor – хардкорный вариант. Сюда же занесем и модификацию кода уже существующего робота;
• заплатив программисту – самый реальный вариант. Если бот сложный с множеством условий для входа, а у вас нет опыта в написании АТС, то лучше всего купить чужой опыт. Соответствующих объявлений полно на профильных форумах;
• используя спец. программу, облегчающую создание кода робота. В некоторых реализован принцип «Drag and Drop», то есть код бота строится в виде диаграммы, вы задается в отдельных блоках условия работы, затем передвигаете их, задаете связи между ними. Код компилируется по составленной блок-схеме автоматически.
Перед тем как приступать к самостоятельной работе над советником рекомендуем еще раз все обдумать. Это не такая простая задача как кажется на первый взгляд даже если вы будете использовать специальную программу.
Краткий обзор программ для написания торговых роботов
Чтобы немного охладить ваш пыл отметим, что программы для создания роботов – всего лишь инструмент. То есть базовые познания в программировании, понимание того, как должен работать советник должно присутствовать. Нельзя просто взять программу, ввести пару значений, нажать кнопку и получить готовый рабочий советник. Придется попотеть.
Forex strategy builder
Мощный инструмент, программа платная, но в ознакомительных целях с сайта forexsb.com можно скачать демо-версию. На ознакомление дается всего 15 дней, повторно воспользоваться триальной версией можно будет только с другого ПК. Работать FSB будет только если у вас установлен МетаТрейдер, дело в том, что программа использует базу данных из МТ4.
При первом запуске программа сделает запрос на загрузку архива котировок, это необходимо для того, чтобы созданный советник можно было тут же протестировать.
При создании советника рабочее пространство программы делится на 3 зоны:
• левая часть экрана – краткое описание стратегии;
• центральная зона – функциональные блоки советника. Указывается такая информация как размер лота, когда выполняется вход и на основании каких индикаторов. Также указывается условие для закрытия сделки. В примере на скриншоте ниже вход в рынок выполняется только на закрытии свечи и только в том случае если свеча закрывается над верхней границей конверта. Выход из сделки в этом примере предусмотрен только за счет срабатывания стоп-лосса или тейк-профита;
• правая часть экрана – результаты тестирования советника на исторических данных, импортированных из торгового терминала.
Находясь в Editor можно выделив каждый из блоков редактировать его значения. Например, изменить период скользящей средней, период индикатора, положение уровней и т. д. Можно добавить дополнительные условия для входа нажав на «Add an opening logic condition» и условия для выхода из рынка нажав на «Add a closing logic condition».
В разделе review вся информация по работе советника истории. Доступны такие пункты:
• overview – так как в примере рассматривается один из готовых советников, загруженных в базу программы, то здесь можно ознакомиться с подробным описанием советника;
• balance chart – график изменения депозита при тестировании алгоритма. В нашем примере видно, что робота неспособен обеспечить прибыль на тестовом участке истории;
• indicator chart – график выбранного инструмента, на котором будут отображаться сделки, совершенные при тестировании. Примерно то же самое увидит трейдер при тестировании советника в МТ4/МТ5 при активированном параметре «Визуализация». Это полезно если вы хотите изучить в полной ли мере соответствует работа советника тому, что вы задумывали;
• journal – в журнале записывается каждое действие робота при тестировании на исторических данных.
Есть пара полезных разделов и во вкладке Analysis:
• comparator – выбирается метод бэктеста. Здесь можно ничего не делать, оставить все как есть;
• multimarkets – в отличие от стандартного тестера в том же МетаТрейдере4 здесь можно выполнить тестирование сразу по нескольким парам. Результаты отображаются в виде графика в одном и том же окне;
•monte carlo – еще один раздел, посвященный тестированию. Его можно не трогать.
Перед тем как тестировать робот на истории рекомендуем подгрузить историю из МетаТрейдера. Для этого перейдите в Market-Download History Data-MT4 HST Import.
Главное, чем ценна программа так это возможностью сохранить написанный робот сразу в нужном формате для МТ4 или МТ5. Соответствующая кнопка есть на панели инструментов.
Что касается программы в целом, то для новичков она особо ценна по той причине, что не требует написания ни единой строчки кода. Даже блок-схему робота создавать не нужно как это сделано в ряде аналогов. С другой стороны, она все же платная, а это может многих отпугнуть, проще вложить деньги в толкового программиста, который напишет вам советник с нуля.
Ensed Cor
По сравнению с предыдущей программой Ensed Cor выглядит чуть менее удобной в использовании. Да и составить костяк советника так же просто как в FSB не получится. Как и в случае с FSB доступ к полному функционалу можно получить только оплатив подписку на сайте авторов. Но для ознакомления с возможностями программы подойдет и бесплатная версия Ensed Cor.
Из ограничений бесплатной версии отметим только невозможность работать с пользовательскими индикаторами, шаблонами. Не все файлы проектов программы будут доступными, но созданию индикаторов ничто мешать не будет.
Перед началом работы нужно будет указать каталог МТ4. Enser Cod будет использовать все индикаторы, которые на данный момент содержаться в папке Indicators (в демо-версии реализована поддержка только стандартного инструментария МетаТрейдера).
Работу в программе рассмотрим на примере создания простенького торгового робота:
• при первом запуске указываем каталог терминала МТ4;
• после этого открывается окно программы и сразу можно приступать к созданию робота.
Сперва опишем принцип работы нашего советника текстом, для лучшего понимания работы алгоритма. Предположим, в работе будут использоваться только 2 индикатора – Стохастик и скользящая средняя. Покупки выполняем при условии, что осциллятор находится в зоне перепроданности, а ценовой график находится над мувингом. Продажи – при зеркальных условиях.
• в основном поле программы будут отображаться условия, использующиеся в работе советника. Индикаторы находятся в правой части, добавить на график их можно просто перетащив нужный на основное поле. Откроется окно с настройками, изменить параметры индикаторов можно и позже. На скриншоте ниже записаны условия для покупок, не забывайте только объединять их в одно целое;
• по той же схеме записываем условия для открытия коротких позиций. Теперь мувинг должен быть над ценой, а Стохастик находится в зоне перекупленности;
• теперь нужно указать условия для выхода из сделок. Предположим, что наш робот будет закрывать покупки при выполнении одного из 2 условий: Параболик со стандартными настройками переходит под график, цена пересекает скользящую среднюю сверху-вниз. Достаточно выполнение одного из этих условий, поэтому используем условие «или»;
• по той же схеме задаем и условия для закрытия коротких позиций. Правила зеркальные – Параболик должен быть под ценой либо график должен пересечь мувинг по направлению снизу-вверх;
• настройки робота – здесь задаются такие параметры как стоп-лосс, тейк-профит, будет вестись торговля фиксированным лотом либо будет использоваться мартингейл. Можно отметить пункт «автоучет знаков после запятой», в таком случае разрядность котировок советником будет определяться автоматически. Также задаются настройки мартингейла, будет ли переноситься стоп-лосс в безубыток и на каком уровне.
Теперь можно сохранить робота, причем автоматически при сохранении будет выбрана папка Experts в нужном каталоге. После перезапуска терминала наш советник появляется в перечне роботов в МетаТрейдер4. В MetaEditor при желании можно просмотреть код робота.
В целом, программа хотя и выглядит намного проще, чем FSB, но со своей задачей справляется. Создавать простые советники действительно легко. Проблема только в том, что функционал бесплатной версии ограничен, а продажу доступа к полноценной версии авторы временно ограничили. Можно поискать крякнутые версии Enser Cod, но нет гарантии, что работать она будет нормально.
Expert Advisor Visual Wizard
Программа интересна тем, что в ней упор сделан на визуализацию процесса создания робота. Его алгоритм выглядит как обычная блок-схема, но условия входа и выхода из рынка все равно нужно задавать вручную.
Процесс создания робота выглядит так:
• после открытия программы нужно будет указать путь к корневому каталогу МТ5, это ПО предназначено именно для создания ботов для МетаТрейдера5. Благодаря этому программа сможет работать не только со стандартными индикаторами, но и со всеми пользовательскими алгоритмами, которые трейдер сам установил в терминал;
• на график нужно будет добавить 2 кнопки Technical Analysis – для задания условий на покупку и продажу. Двойным щелчком по кнопке открывается окно, в котором выбираются нужные индикаторы, задаются условия для входа. Например, можно выбрать вход в рынок на пересечении 2 мувингов, выхода Стохастика из зон перепроданности/перекупленности и т. д.;
• потом добавляются блоки купить/продать, в них задаются параметры сделок – величина лота, стоп-лосс и тейк-профит.
В конце концов алгоритм советника будет выглядеть примерно так – обычная блок схема, но в ней каждый блок отвечает за определенные условия торговли. Например, за покупку/продажу и т. д.
На скриншоте выше – пример примитивнейшего советника на основе Стохастика. Его можно сохранить в нужном для МТ5 формате, загрузить в терминал и тут же испытывать на истории. В самой программе для создания возможности протестировать советник нет.
Недостатки программ для создания советников
Такое ПО можно сравнить с костылями, ходить то они позволят, но это будет нечто далекое от ходьбы нормального человека. Такое ПО неспособно на 100% заменить все те возможности, которые имеются в распоряжении программиста, когда он пишет код робота с нуля.
Пока речь идет о простых советниках, основанных, например, на пересечении скользящих средних, или выхода Стохастика из зон, то все в порядке. Разницы между ручным написанием кода и использованием соответствующего ПО не будет. Но если дело доходит до относительно сложных роботов, то недостатки программ сразу становятся заметными.
Например, если в советнике нужно применить ВВ к индикатору RSI, программы это реализовать не смогут. Есть проблема с использованием свечных паттернов, паттернов Price Action, уровней Фибо и т. д.
Заключение
Программы для создания советников хороши только в тех случаях, когда нужно написать простой советник на основе индикаторов. Если ваши требования выходят за пределы этого ТЗ, в алгоритме нужно использовать свечные и графические паттерны, то придется обращаться за помощью к специалистам. Иного способа пока что нет, даже лучшая программа такого типа (Forex strategy builder) существенно уступает возможностям программиста.
Возможно, Вам будут интересны следующие обзоры:
• Обзор брокера FinmaxFX – торговые условия нового форекс брокера
Источник https://www.mql5.com/ru/articles/706
Источник https://rognowsky.ru/forex2/programmy-dlya-sozdaniya-sovetnikov-na-mt4-i-mt5/