Exp - The xCustomEA Универсальный торговый советник на пользовательских индикаторах. Советник по индикатору!

Exp - The xCustomEA Универсальный торговый советник на пользовательских индикаторах. Советник по индикатору!

9 октября 2018, 07:14
Vladislav Andruschenko
2
1 907





Описание

Exp - The xCustomEA Универсальный торговый советник на пользовательских индикаторах.

Наш новый советник The xCustomEA построен на базе советника The X - Universal EA

Функциональные возможности универсального торгового советника The xCustomEA в точности повторяют все параметры нашего советника The X за исключением одного:

The xCustomEA работает на пользовательских индикатор и имеет возможность программирования своей собственной стратегии торговли для терминалов МТ5 и МТ4.

Другими словами: The xCustomEA имеет связь с пользовательскими индикаторами, которые могут быть скачаны с интернета или маркета mql5 .

Предисловие

Программируя советники на заказ мы не были удивлены тем, что 90 % заказов построены на стратегиях по индикаторам.

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

Но стоимость такой работы + шаблон для написания + открытый код такого шаблона слишком велика. И не все трейдеры соглашаются на то, чтобы написать торговый советник на один пользовательский индикатор.

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

Мы нашли выход из этой ситуации и разработали новый универсальный торговый советник The xCustomEA

Этот советник не имеет предустановленной стратегии, он умеет торговать по сигналам других индикаторов. Вы можете запрограммировать Ваш пользовательский индикатор, а наш советник The xCustomEA будет открывать позиции по сигналам.

Купив Наш Универсальный торговый советник The xCustomEA , Вы сможете программировать советники по индикаторам каждый день!

Внимание: Вы не обязаны покупать индикатор для тестирования советника в тестере стратегий.

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

Только после получения прибыльных результатов в тестере стратегий, Вы можете купить пользовательский индикатор и запустить советник по этому индикатору на реальном или демо счете!



Основные Функции и описание параметров

Мы не будем останавливаться на подробном описании основных параметров советника потому, что 99% параметров соответствуют нашей систему The X.

Описание настроек и внешних переменных 

Блок подключения пользовательской стратегии в нашего советника

Новый блок работы с пользовательской стратегией был включен в нашего нового советника.


Параметр Описание
OWN Signal  options
SignalNameIndicator

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

По умолчанию: "Ind - The xCustomEA"

Это стандартный пустой индикатор, в который Вы можете запрограммировать свою стратегию по нашему примеру!

Также мы создали пример пользовательского индикатора по сигналам The X

"Ind - The xCustomEA Example TheX"

Вы можете использовать наш пример для получения сигналов по стандартным индикаторам 

Описание стандартных стратегий The X

The xCustomEA Примеры стратегий

SignalTypeIndicator

Тип индикатора для сигналов.

Есть два типа работы советника :

xCustomEA - Работа советника по нашему индикатору, в котором Вы лично программируете свою стратегию.

xArrow - Работа советника напрямую с пользовательским индикатором, у которого есть буферы типа Стрелок (Arrow) которые можно использовать для советника.

Например: Буфер с сигналами индикатора на BUY и  Буфер с сигналами индикатора на SELL

Такие буферы должны иметь тип Стрелки.

Наш советник определяет сигнал по типу : Значение буфера не равно пустому значению и выше 0.:

//--- проводим проверку условия и устанавливаем значение для sig if(xCustom_SIGNAL_BUY_buffer[OWNSIGNAL_shift]!=EMPTY_VALUE && xCustom_SIGNAL_BUY_buffer[OWNSIGNAL_shift]>0) sig=1; else if(xCustom_SIGNAL_SELL_buffer[OWNSIGNAL_shift]!=EMPTY_VALUE && xCustom_SIGNAL_SELL_buffer[OWNSIGNAL_shift]>0) sig=-1;

 

IndSigToTrade

Выбор индикатора и сигнала для открытия первой и главной позиции.
Номер стратегии из пользовательского индикатора  SignalNameIndicator

Если заданная стратегия не найдена в индикаторе, советник будет выгружен с графика с ошибкой!

Если задан 0 , тогда сигналы стратегии не используются но используются фильтры!

TF_IndSigToTrade1 Таймфрейм для 1 главного индикатора. Вы можете выбрать ТаймФрейм, по которому индикатор будет принимать сигналы. 
Period_Current - текущий Таймфрейм
SIGNALStrategyInputs

Внешние параметры для пользовательского индикатора, в режиме  SignalTypeIndicator=xArrow  

Вы можете указать внешние переменные индикатора в том виде, как они записаны в таблице настроек через запятую!

Важно: Необходимо соблюдать порядок переменных и тип переменных.

Тип переменной Запись Важно Пример
int x  

1

10

777

double x.x Обязательно указание через точку .

0.2

1.10

string "x" Обязательно указание строки (не цифры ), можно просто записать как "X"




В MT5: Обязательно указание строки (не цифры ), можно просто записать как "X"

В MT4: Внимание! В версии для MetaTrader4 запрещено передавать строковые параметры! При передаче строковых параметров (string) индикатор может быть загружен неправильно!

"XXX"

"TEST SAME"

datetime D'year.month.day' Обязательно указание D и одинарных ковычек

D'2018.11.08'

D'2015.01.01'

color C'red/green/blue' Обязательно указание С и одинарных ковычек. Перечисление цвета через слэш /

C'0/128/128'

C'0/256/0'

например 

input int InpCCIPeriod=1; 
input double InpCCIPeriod2=2.0; 
input color InpCCIPeriod3=clrGreen; 
input string InpCCIPeriod6="text"; 
input datetime InpCCIPeriod4=2018.11.08; 
input bool InpCCIPeriod5=false; 

записывается как:

SIGNALStrategyInputs=1,2.0,C'0/128/0',"text ",D'2018.11.08',false




Signal_Reverse Переворачивать сигналы этого индикатора. Эта опция переворачивает сигналы только главного индикатора. 
ClosePositionifChangeOWNSignal  Включить \ Выключить закрытие позиций по обратному сигналу главного индикатора, без участия остальных фильтров и других параметров
OWNSIGNAL_shift Номер бара для сигнала, который будет генерировать индикатор,
1 = последний закрытый бар, сигналы на таком баре считаются завершенными. 
0 = Текущий открытый бар, сигналы на таком баре считаются рисующими. 
Подробнее о этом параметре: Подробная статья о сигнальных барах

SignalBuferforBUY

SignalBuferforSELL

Номер буфера в пользовательском индикаторе, для получения сигнала на BUY и SELL

Не изменять для Ind - The xCustomEA и Ind - The xCustomEA Example TheX

Close options  
CloseNameIndicator

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

CloseTypeIndicator

Тип индикатора для сигналов.

Есть два типа работы советника :

xCustomEA - Работа советника по нашему индикатору, в котором Вы лично программируете свою стратегию.

xArrow - Работа советника напрямую с пользовательским индикатором, у которого есть буферы типа Стрелок (Arrow) которые можно использовать для советника.

Например: Буфер с сигналами индикатора на закрытие BUY и  Буфер с сигналами индикатора на закрытие SELL

Такие буферы должны иметь тип Стрелки.

Наш советник определяет сигнал по типу : Значение буфера не равно пустому значению и выше 0.:

//--- проводим проверку условия и устанавливаем значение для sig if(xCustom_SIGNAL_BUY_buffer[OWNSIGNAL_shift]!=EMPTY_VALUE && xCustom_SIGNAL_BUY_buffer[OWNSIGNAL_shift]>0) sig=1; else if(xCustom_SIGNAL_SELL_buffer[OWNSIGNAL_shift]!=EMPTY_VALUE && xCustom_SIGNAL_SELL_buffer[OWNSIGNAL_shift]>0) sig=-1;

CloseTimeFrame  
Close_shift  
CloseStrategyInputs  
CloseBuferforBUY  
CloseBuferforSELL  
Close_IndSigToClose  
   
Filter  options
FilterNameIndicator

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

По умолчанию: "Ind - The xCustomEA"

Это стандартный пустой индикатор, в который Вы можете запрограммировать свою стратегию по нашему примеру!

Также мы создали пример пользовательского индикатора по фильтрамThe X

"Ind - The xCustomEA Example TheX"

Вы можете использовать наш пример для получения фильтров по стандартным индикаторам 

Описание стандартных стратегий The X

The xCustomEA Примеры стратегий

FilterTypeIndicator

Тип индикатора для фильтра.

Есть два типа работы советника :

xCustomEA - Работа советника по нашему индикатору, в котором Вы лично программируете свою стратегию фильтра.

xArrow - Работа советника напрямую с пользовательским индикатором, у которого есть буферы типа Стрелок (Arrow) или не пустое значение буфера которые можно использовать для советника.

Например: Буфер с фильтром индикатора на BUY и  Буфер с фильтром индикатора на SELL

Такие буферы должны иметь тип Стрелки.

Наш советник определяет фильтр по типу : Значение буфера не равно пустому значению и выше 0.:

//--- проводим проверку условия и устанавливаем значение для sig if(xCustom_FILTER_BUY_buffer[shift]!=EMPTY_VALUE && xCustom_FILTER_BUY_buffer[shift]>0) sig=1; else if(xCustom_FILTER_SELL_buffer[shift]!=EMPTY_VALUE && xCustom_FILTER_SELL_buffer[shift]>0) sig=-1;

FILTER_IndSigToTrade

Выбор индикатора и фильтра для фильтрации основного сигнала.
Номер стратегии из пользовательского индикатора  FilterNameIndicator

Если заданная стратегия не найдена в индикаторе, советник будет выгружен с графика с ошибкой!

Если IndSigToTrade задан 0 , тогда советник будет работать по фильтрам!

FILTER_TF_IndSigToTrade Таймфрейм для фильтра. Вы можете выбрать ТаймФрейм, по которому индикатор будет принимать сигналы фильтра. 
Period_Current - текущий Таймфрейм.
Например: При использовании МА как главного сигнала с ТФ = М30, Вы можете включить фильтрацию по старшему МА с ТФ=Н4
Filter_Reverse Переворачивать сигналы этого фильтра. Эта опция переворачивает сигналы только этого фильтра.
Например: Главный индикатор МА показывает BUY но старший индикатор МА показывает SELL, при использовании этой функции мы переворачиваем сигналы старшего МА и получаем совокупный сигнал BUY 
FILTERSIGNAL_shift Номер бара для сигнала, который будет генерировать индикатор,
1 = последний закрытый бар, сигналы на таком баре считаются завершенными. 
0 = Текущий открытый бар, сигналы на таком баре считаются рисующими. 
Подробнее о этом параметре: Подробная статья о сигнальных барах

FilterBuferforBUY

FilterBuferforSELL

Номер буфера в пользовательском индикаторе, для получения фильтра на BUY и SELL

Не изменять для Ind - The xCustomEA и Ind - The xCustomEA Example TheX

SLTP options  
SLTPNameIndicator

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

SLTPTypeIndicator

Тип индикатора .

xPrice - Значение цены, котороые будет передано в соответствующую переменную (Стоплосс, Тейкпрофит)

SLTPTimeFrame​​​​​​​  
SLTP_shift​​​​​​​  
SLTPStrategyInputs​​​​​​​  
SLTPBuferforBUY_StopLoss​​​​​​​ Номер буфера, для получения значения StopLoss для позиций BUY , -1 означает, что данная опция не работает. 
SLTPBuferforSELL_StopLoss​​​​​​​ Номер буфера, для получения значения StopLoss для позиций SELL , -1 означает, что данная опция не работает. 
SLTPBuferforBUY_TakeProfit​​​​​​​ Номер буфера, для получения значения TakeProfit для позиций BUY , -1 означает, что данная опция не работает. 
SLTPBuferforSELL_TakeProfit Номер буфера, для получения значения TakeProfit для позиций SELL , -1 означает, что данная опция не работает. 


Определение Сигнала и Фильтра

Сигнал

  1. Сигнал - происходит тогда, когда есть все условия для сигнала, например факт пересечения линий МА. Или появление новой точки ZigZag .
  2. Например : Пересечение уровня 70 для индикатора RSI это сигнал. А если RSI выше уровня 70, то это уже фильтр.
  3. Сигнал - это то, что появляется в момент поступления котировок, фиксируется на баре. Советник принимает факт совершения сигнала.
  4. Например: Включился свет. Это сигнал потому, что свет только что включился. При включении света , человек проснулся. Это сигнал.
  5. Открытие позиций происходит по факту совершения сигнала, линии пересеклись , тогда открывается позиция. Если линии были пересечены ранее, то это не сигнал. Сигнал уже прошел.

Фильтр:

  1. Фильтр - Это текущее положение индикатора, например текущее положение линий МА относительно друг друга. Или текущая последняя вершина ZIGZAG
  2. Фильтр - это то, что на данный момент показывает индикатор. Это не факт совершения сигнала. Это текущее положение индикатора.
  3. Например: Свет горел. Это фильтр потому, что свет уже был включен и он уже горит. При включенном свете человек уже не спит. Это фильтр.
  4. Фильтрация сигналов происходит по текущему значению индикатору. Если Быстрая МА выше медленной МА, то это фильтр на то, что должны открываться только BUY.

Расположение файлов и папок

Если Вы покупаете нашего советника в Маркете mql5.com то наш советник устанавливается в папку Экспертов.

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

Расположение нашего главного индикатора в папке Indicators

Пример расположения файлов для терминала MQL5

  1. \MQL5
  2. і \Experts
  3. і і Exp5 - The xCustomEA 20180929 DEMO.ex5
  4. і \Indicators
  5. і і Ind - The xCustomEA Example TheX.ex5
  6. і і Ind - The xCustomEA Example TheX.mq5
  7. і і Ind - The xCustomEA PipFinite Trend PRO.ex5
  8. і і Ind - The xCustomEA PipFinite Trend PRO.mq5
  9. і і Ind - The xCustomEA.ex5
  10. і і Ind - The xCustomEA.mq5
  11. і \Presets
  12. і Ind - The xCustomEA PipFinite Trend PRO CLEAN.set
  13. і Ind - The xCustomEA PipFinite Trend PRO.set
  14. і MT5 PipFinite Trend PRO MT5.set

Пример расположения файлов для терминала MQL4

  1. \MQL4
  2. і \Experts
  3. і і Exp4 - The xCustomEA 20180929 DEMO.ex4
  4. і \Indicators
  5. і і Ind - The xCustomEA Example TheX.ex4
  6. і і Ind - The xCustomEA Example TheX.mq4
  7. і і Ind - The xCustomEA PipFinite Trend PRO.ex4
  8. і і Ind - The xCustomEA PipFinite Trend PRO.mq4
  9. і і Ind - The xCustomEA.ex4
  10. і і Ind - The xCustomEA.mq4
  11. і \Presets
  12. і Ind - The xCustomEA PipFinite Trend PRO MT4 CLEAN .set
  13. і MT4 PipFinite Trend PRO.set


Файл шаблона индикатора

Для удобства использования советника:

При первом запуске советника, будет создан файл шаблона индикатора в папке Вашего терминала Files

Этот файл можно использовать как шаблон для написания стратегии по индикатору.

Для того, чтобы найти файл, нажмите в Вашем терминале меню Файл - Открыть каталог данных


Откройте этот файл с помощью Вашего компилятора

В файле Вы увидите примеры использования и шаги программирования стратегии.

После создания стратегии по индикатору - сохраните этот файл в папке Вашего терминала - Indicators/

После этого укажите этот файл в настройках советника SignalNameIndicator


Простая установка пользовательского индикатора в сигналах и фильтрах

Есть два типа работы советника :

xCustomEA - Работа советника по нашему индикатору, в котором Вы лично программируете свою стратегию.

Если Вам необходимо программировать работу советника по индикатору, перейдите в следующий раздел: Программирование своей стратегии

xArrow - Работа советника напрямую с пользовательским индикатором, у которого есть буферы типа Стрелок (Arrow) которые можно использовать для советника.

Например: Буфер с сигналами индикатора на BUY и Буфер с сигналами индикатора на SELL

Такие буферы должны иметь тип Стрелки.

Наш советник определяет сигнал по типу : Значение буфера не равно пустому значению и выше 0.:

//--- проводим проверку условия и устанавливаем значение для sig
 if(xCustom_SIGNAL_BUY_buffer[OWNSIGNAL_shift]!=EMPTY_VALUE && xCustom_SIGNAL_BUY_buffer[OWNSIGNAL_shift]>0)
 sig=1;
 else
 if(xCustom_SIGNAL_SELL_buffer[OWNSIGNAL_shift]!=EMPTY_VALUE && xCustom_SIGNAL_SELL_buffer[OWNSIGNAL_shift]>0)
 sig=-1;

Если Вы не хотите программировать свою стратегию и Ваш пользовательский индикатор позволяет работать напрямую с советником, Вы можете указать название индикатора и задать буферы для его работы по сигналам на BUY и SELL

например:

1. Укажите имя пользовательского индикатора! Если этот индикатор был скачан с маркета MQL5, тогда Вам необходимо указать с папки Market:

Market\\PipFinite Trend PRO

Обязательно нужно писать двойной обратный слэш \\

2. Укажите тип сигналов xArrow

3. Укажите номер буфера сигналов для открытия BUY (в данном примере буфер номер 8)

4. Укажите номер буфера сигналов для открытия SELL (в данном примере буфер номер 9)

Таким образом, нам не нужно программировать наш индикатор, для работы советника.

Наш пример пользовательского индикатора содержит буферы для работы советника и мы напрямую можем с ним взаимодействовать!



В нашем разделе The xCustomEA Примеры стратегий мы будем выкладывать примеры программирования стратегий и советники по индикаторам известных в маркете!

Пример советника по индикатору PipFinite Trend PRO



Программирование своей стратегии

Вы должны знать минимальные правила программирования для того, чтобы написать свою стратегию Или добавить готовую стратегию по индикаторам с готового файла (индикаторы с интернета, например)

Программирование советников для MetaTrader 5 сложнее, чем программирование для MetaTrader 4. Но терминал МТ5 позволяет создать более мощные стратегии, а также обладает более продвинутым тестером стратегий.

Для простоты программирования

  1. Откройте наш исходный код индикатора Ind - The xCustomEA или Ind - The xCustomEA Example TheX,;
  2. Нажмите сочетание клавиш Ctrl+F и вы увидите строку поиска;
  3. Введите название Step - По этому слову, в нашем исходном коде, Вы сможете ориентироваться и быстро написать свою стратегию.
  4. Каждый шаг комментирован и содержит пример
  5. Для того,чтобы научиться программировать свою стратегию, Вы можете поэтапно раскомментировать строки с звездочкой //*

Мы разберем каждый шаг подробно!

MetaTrader 4 Программирование своей стратегии по пользовательскому индикатору в МТ4

Программирование советника по индикатору в МТ4 состоит из 4 шагов:

MetaTrader 4 Шаг 1: Шаг загрузки индикаторов в ресурсы!

// Step 1 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// Для того,чтобы при компиляции, индикатор был встроен в советник, Вам необходимо загрузить его в ресурсы советника
// In order for the indicator to be built into the Expert Advisor during compilation, you need to load it into the resources of the Expert Advisor
// ####################################################################
// for example:
//* #resource "\\Indicators\\MACD.ex4"
// ###########################################################################

Здесь мы обязаны добавить , нужные Нам, индикаторы в ресурсы.

Это позволит компилировать индикатор для маркета , а также избавит нас от лишних проблем, когда компилированный советник вдруг не найдет нужный индикатор на другом компьютере!

Правила написания имени маркета: Полное название папок, начиная с Indicators!

Папка обозначается \\

Например:

Если путь к Вашему индикатору выглядит так:

C:\ROBO MT4\MQL4\Indicators\Examples\MACD.ex4

тогда путь к этому индикатору в языке программирования записывается так:

"\\Indicators\\Examples\\MACD.ex4"

MetaTrader 4 Шаг 2: Главный шаг создания стратегии и сигналов для открытия позиций!

// Step 2 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// Здесь создаем наш сигнал для открытия позиций. Заполняем буферы данных
// Here we create our signal for opening positions. Fill in the data buffer
// ####################################################################
// for example:
//*   if(sigInd==1)
//*     {
//      
//      Заполняем данные, 
//      We fill in the data
//      
//
//*   double CustomMain=iCustom(StrategySymbol,StrategyTimeFrame,"::Indicators\\MACD",periodma1,periodma2,9,MAprice,
//*                             MODE_MAIN,StartCopyI+ShiftIndicator);
//*   double CustomSig=iCustom(StrategySymbol,StrategyTimeFrame,"::Indicators\\MACD",periodma1,periodma2,9,MAprice,
//*                            MODE_SIGNAL,StartCopyI+ShiftIndicator);
//
//*   double CustomMain2=iCustom(StrategySymbol,StrategyTimeFrame,"::Indicators\\MACD",periodma1,periodma2,9,MAprice,
//*                              MODE_MAIN,StartCopyI+ShiftIndicator+1);
//*   double CustomSig2=iCustom(StrategySymbol,StrategyTimeFrame,"::Indicators\\MACD",periodma1,periodma2,9,MAprice,
//*                             MODE_SIGNAL,StartCopyI+ShiftIndicator+1);
//
//
//      Здесь пишем нашу стратегию, в данном примере это пересечение двух линий, 
//      Here we write our strategy, in this example it is the intersection of two lines
//      
//*   if(CustomMain>CustomSig && CustomMain2<CustomSig2)
//      // Buy sig
//*      sig=1;
//*   if(CustomMain<CustomSig && CustomMain2>CustomSig2)
//      // Sell sig
//*      sig=-1;//      
//      Записываем данные, которые будут отображаться в журнале, при открытии позиций по сигналу 
//      We write down the data that will be displayed in the log, when you open positions on a signal
//      
//*   InfoAboutSignal=" InfoAboutSignal sigInd="+(string)sigInd+" sig="+(string)sig
//*                   +" CustomMain="+CustomMain
//*                   +" CustomSig="+CustomSig
//*                   +" CustomMain2="+CustomMain2
//*                   +" CustomSig2="+CustomSig2
//*                   ;
//      //--- возвращаем торговый сигнал
//*                      return(sig);

//*     }
Этот шаг очень важен для советника. Хотя и все о

стальные шаги обязательны, иначе советник не будет работать.

Свои комментарии я указал в коде!

  1. Программирование кода для стратегии и сигнала индивидуально. Зависит от выбранной стратегии и индикаторов. Получения буферов, стратегии........
  2. Хочу заметить лишь то, что в этом блоке Вы можете указывать любую стратегию.

  1. 1. Программирование стратегии. В данном случае это пересечение двух линий.
  2. Важно: Сигнал для BUY это 1, а для SELL это -1

Примеры стратегий я буду публиковать на нашем форуме!

MetaTrader 4 Шаг 3: Шаг для указание фильтров от ваших индикаторов, или использование вашего индикатора как фильтр для стратегии!

// Step 3 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// Здесь создаем наш фильтр для фильтрации сигналов. Заполняем буферы данных
// Here we create our filter for signal filtering. Fill in the data buffers
// ####################################################################
// for example:
//*   if(sigInd==1)
//*     {
//      
//      Заполняем данные, 
//      We fill in the data
//      
//
//*   double CustomMain=iCustom(StrategySymbol,StrategyTimeFrame,"::Indicators\\MACD",periodma1,periodma2,9,MAprice,
//*                             MODE_MAIN,shift);
//*   double CustomSig=iCustom(StrategySymbol,StrategyTimeFrame,"::Indicators\\MACD",periodma1,periodma2,9,MAprice,
//*                            MODE_SIGNAL,shift);
//
//      Здесь пишем нашу стратегию, в данном примере это пересечение двух линий, 
//      Here we write our strategy, in this example it is the intersection of two lines
//      
//*   if(CustomMain>CustomSig )
//      // Buy sig
//*      sig=1;
//*   if(CustomMain<CustomSig )
//      // Sell sig
//*      sig=-1;//      
//      Записываем данные, которые будут отображаться в журнале, при открытии позиций по сигналу 
//      We write down the data that will be displayed in the log, when you open positions on a signal
//      
//*   InfoAboutSignal=" InfoAboutSignal sigInd="+(string)sigInd+" sig="+(string)sig
//*                   +" CustomMain="+CustomMain
//*                   +" CustomSig="+CustomSig

//*                   ;
//      //--- возвращаем торговый сигнал
//*                       return(sig);

//*     }

В программировании кода на этом шаге нет ничего сложного и он похож на предыдущий шаг.

Отличие лишь в том, что на этом шаге Вы программируете свои индикаторы в роли Фильтра.

Вы можете не указывать сигналы по индикатору, а указать только фильтр. Или наоборот! Все зависит от стратегии.

MetaTrader 5 Программирование своей стратегии по пользовательскому индикатору в МТ5

MetaTrader 5 Шаг 1: Шаг загрузки индикаторов в ресурсы!

// Step 1 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// Для того,чтобы при компиляции, индикатор был встроен в советник, Вам необходимо загрузить его в ресурсы советника
// In order for the indicator to be built into the Expert Advisor during compilation, you need to load it into the resources of the Expert Advisor
// ####################################################################
// for example:
//* #resource "\\Indicators\\Examples\\MACD.ex5"
// ###########################################################################

Здесь мы обязаны добавить , нужные Нам, индикаторы в ресурсы.

Это позволит компилировать советник для маркета , а также избавит нас от лишних проблем, когда компилированный советник вдруг не найдет нужный индикатор на другом компьютере!

Правила написания имени маркета: Полное название папок, начиная с Indicators!

Папка обозначается \\

Например:

Если путь к Вашему индикатору выглядит так:

C:\ROBO MT5\MQL5\Indicators\Examples\MACD.ex5

тогда путь к этому индикатору в языке программирования записывается так:

"\\Indicators\\Examples\\MACD.ex5"

MetaTrader 5 Шаг 2: Шаг объявления переменных для хранения хендлов индикаторов стратегии!

// Step 2 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// обьявите переменную массива хендлов
// Declare the variable of the handle array
// ####################################################################
// for example:
//* int h_custom;
//* int h_custom2;
// ###########################################################################

Здесь мы просто указываем названия наших хендлов, которые создавали выше!

Сложного здесь ничего нет.

Хендлы создаются в виде массивов для того, чтобы использовать мультивалютность в советнике и использоваться возможность указания сразу 6 сигналов или фильтров!

MetaTrader 5 Шаг 3: Шаг объявления переменных для хранения данных индикаторов!

// Step 3 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// обьявите переменную массива значений индикатора
// Declare the variable of the handle array
// ####################################################################
// for example:
//* double custom1_buffer[];
//* double custom2_buffer[];
// ###########################################################################

Здесь мы просто указываем названия наших данных для буферов!

Сложного здесь ничего нет.

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

В нашем случае, для примера, нам нужно 2 буфера, для сигнальной и главной линии индикатора MACD

MetaTrader 5 Шаг 4: Шаг создания хендлов индикаторов, для загрузки в советник!

// Step 4 ####################################################################
      // Эта часть кода для программирования своей стратегии в открытом коде
      // This part of the code for programming your strategy in open source
      // 
      // Вам необходимо создать запись в массиве для того, чтобы советник присвоил хендл индикатора при инициализации
      // You need to create an entry in the array in order for the Expert Advisor to assign an indicator handle when initializing
      // ####################################################################
      // for example:
      //* case 1:h_custom=iCustom(StrategySymbolString,StrategyTimeFrame,"::Indicators\\Examples\\Moving Average\\Moving Average",MAFastPeriod,MAmethod,MAprice);
      //* h_custom2=iCustom(StrategySymbolString,StrategyTimeFrame,"::Indicators\\Examples\\Moving Average\\Moving Average",MASlowPeriod,MAmethod,MAprice);
      //*            if(h_custom==INVALID_HANDLE)
      //*              {
      //*               Print(" Не удалось получить хендл индикатора Moving Average");
      //*               return(INIT_FAILED);
      //*              }
      //* if(h_custom2==INVALID_HANDLE)
      //*              {
      //*               Print(" Не удалось получить хендл индикатора Moving Average");
      //*               return(INIT_FAILED);
      //*              }
      //*            break;
      // ###########################################################################

Этот шаг нужен для того, чтобы наши индикаторы загружались 1 раз при инициализации советника. В MetaTrader 5 нет необходимости в том, чтобы постоянно загружать индикатор на график.

При создании хендла, мы запоминаем хендл уже открытого индикатора и используем его для дальнейшей работы.

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

Помните, что мы загрузили индикатор в ресурсы советника. Поэтому вызывать индикатор мы будем из ресурсов!

Вы можете почитать справку о вызове индикаторов через iCustom

Номер стратегии также нужен нам для написания этого кода. Если у Вас несколько индикаторов в одной стратегии, тогда нужно указывать несколько индикаторов но с одинаковым номером. Чтобы советник правильно загрузил Вашу стратегию.

По нашим примерам выше нам нужно сделать так:

 case 1:
      h_custom=iCustom(StrategySymbolString,StrategyTimeFrame,"::Indicators\\Examples\\Moving Average\\Moving Average");
      h_custom2=iCustom(StrategySymbolString,StrategyTimeFrame,"::Indicators\\Examples\\Moving Average\\Moving Average");
      if(h_custom==INVALID_HANDLE)
        {
         Print(" Не удалось получить хендл индикатора Moving Average");
         return;
        }
      if(h_custom2==INVALID_HANDLE)
        {
         Print(" Не удалось получить хендл индикатора Moving Average");
         return;
        }
      break;

По аналогии выше, Вы можете добавить несколько индикаторов и хендлов.

Также и с другими стратегиями, которые вы хотите вставить в советника!

MetaTrader 5 Шаг 5: Главный шаг создания стратегии и сигналов для открытия позиций!

// Step 5 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// Здесь создаем наш сигнал для открытия позиций. Заполняем буферы данных
// Here we create our signal for opening positions. Fill in the data buffer
// ####################################################################
// for example:
//*   if(sigInd==1)
//*     {
//      
//      Заполняем данные, 
//      We fill in the data
//      
//*      if(CopyBuffer(h_custom,0,0,3+ShiftIndicator,custom1_buffer)<3+ShiftIndicator) 
//*         return(0);
//*      if(!ArraySetAsSeries(custom1_buffer,true))
//*         return(0);
//*      if(CopyBuffer(h_custom2,0,0,2+ShiftIndicator,custom2_buffer)<2+ShiftIndicator) 
//*         return(0);
//*      if(!ArraySetAsSeries(custom2_buffer,true))
//*         return(0);
//      
//      Здесь пишем нашу стратегию, в данном примере это пересечение двух линий, 
//      Here we write our strategy, in this example it is the intersection of two lines
//      
//*      if(custom1_buffer[ShiftIndicator+1]<custom2_buffer[ShiftIndicator+1] && custom1_buffer[ShiftIndicator]>custom2_buffer[ShiftIndicator])
//*         sig=1;
//*      else if(custom1_buffer[ShiftIndicator+1]>custom2_buffer[ShiftIndicator+1] && custom1_buffer[ShiftIndicator]<custom2_buffer[ShiftIndicator])
//*         sig=-1;
//*      else sig=0;
//      
//      Записываем данные, которые будут отображаться в журнале, при открытии позиций по сигналу 
//      We write down the data that will be displayed in the log, when you open positions on a signal
//      
//*      InfoAboutSignal=InfoAboutSignal+" "+"sigInd="+(string)sigInd+" TF="+(string)TF+" Symbol="+symToWork3+" sig="+(string)sig+" "+__FUNCTION__+" "
//*                      +" custom1_buffer[ShiftIndicator+1]="+(string)custom1_buffer[ShiftIndicator+1]
//*                      +" custom2_buffer[ShiftIndicator+1]="+(string)custom2_buffer[ShiftIndicator+1]
//*                      +" custom1_buffer[ShiftIndicator]="+(string)custom1_buffer[ShiftIndicator]
//*                      +" custom2_buffer[ShiftIndicator]="+(string)custom2_buffer[ShiftIndicator];
//      //--- возвращаем торговый сигнал
//*      return(sig);
//*     }
// ###########################################################################

Этот шаг очень важен для советника. Хотя и все остальные шаги обязательны, иначе советник не будет работать.

Свои комментарии я указал в коде!

Номер стратегии у нас такой же как и в первых шагах!

  1. Программирование кода для стратегии и сигнала индивидуально. Зависит от выбранной стратегии и индикаторов. Получения буферов, стратегии........
  2. Хочу заметить лишь то, что в этом блоке Вы можете указывать любую стратегию.
  3. Все индикаторы, которые мы объявили в хендлах, будут загружены в память и использоваться для построения стратегии.

Этот шаг можно разделить на 2 подшага:

  1. 1. Мы обязаны скопировать буферы данных в наши массивы данных. В параметрах копирования мы должны указать номера линий (В нашем случае это линии индикатора MACD )
  2. Мы используем две линии MAIN и SIGNAL
  3. Вы можете почитать справку о функции CopyBuffer
  4. 2. Программирование стратегии. В данном случае это пересечение двух линий.
  5. Важно: Сигнал для BUY это 1, а для SELL это -1

MetaTrader 5 Шаг 6: Шаг для указание фильтров от ваших индикаторов, или использование вашего индикатора как фильтр для стратегии!

// Step 6 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// Здесь создаем наш фильтр для фильтрации сигналов. Заполняем буферы данных
// Here we create our filter for signal filtering. Fill in the data buffers
// ####################################################################
// for example:
//*   if(sigInd==1)
//*     {
//      
//      Заполняем данные, 
//      We fill in the data
//      
//*      if(CopyBuffer(h_custom,0,0,3+ShiftIndicator,custom1_buffer)<3+ShiftIndicator) 
//*         return(0);
//*      if(!ArraySetAsSeries(custom1_buffer,true))
//*         return(0);
//*      if(CopyBuffer(h_custom2,0,0,2+ShiftIndicator,custom2_buffer)<2+ShiftIndicator) 
//*         return(0);
//*      if(!ArraySetAsSeries(custom2_buffer,true))
//*         return(0);
//      
//      Здесь пишем нашу стратегию, в данном примере это пересечение двух линий, 
//      Here we write our strategy, in this example it is the intersection of two lines
//      
//*      if(custom1_buffer[ShiftIndicator]!=0 && custom2_buffer[ShiftIndicator]!=0)
//*      {
//*       Alert(" Поздравляем! Вы сделали урок, который показывает программирование своей стратегии!");
//*       Alert(" Congratulations! You have done a lesson that shows the programming of your strategy!");
//*      }

//*      if(custom1_buffer[ShiftIndicator]>custom2_buffer[ShiftIndicator])
//*         sig=1;
//*      else if( custom1_buffer[ShiftIndicator]<custom2_buffer[ShiftIndicator])
//*         sig=-1;
//*      else sig=0;
//      
//      Записываем данные, которые будут отображаться в журнале, при открытии позиций по сигналу 
//      We write down the data that will be displayed in the log, when you open positions on a signal
//      
//*      InfoAboutSignal=InfoAboutSignal+" "+"sigInd="+(string)sigInd+" TF="+(string)TF+" Symbol="+symToWork3+" sig="+(string)sig+" "+__FUNCTION__+" "
//*                      +" custom1_buffer[ShiftIndicator+1]="+(string)custom1_buffer[ShiftIndicator+1]
//*                      +" custom2_buffer[ShiftIndicator+1]="+(string)custom2_buffer[ShiftIndicator+1]
//*                      +" custom1_buffer[ShiftIndicator]="+(string)custom1_buffer[ShiftIndicator]
//*                      +" custom2_buffer[ShiftIndicator]="+(string)custom2_buffer[ShiftIndicator];
//      //--- возвращаем торговый сигнал
//*      return(sig);
//*     }

В программировании кода на этом шаге нет ничего сложного и он похож на предыдущий шаг.

Отличие лишь в том, что на этом шаге Вы программируете свои индикаторы в роли Фильтра.

Вы можете не указывать сигналы по индикатору, а указать только фильтр. Или наоборот! Все зависит от стратегии.


Поделитесь с друзьями: