The X: 10 шагов для программирования своей стратегии!
Partial Close and Trail Частичное закрытие позиций при откатах
Описание
Пример программирования стратегии по индикатору PipFinite Trend PRO и торговля с помощью нашей универсальной торговой системы Exp – The xCustomEA.
В этой статье мы подробно разберем пользовательский индикатор PipFinite Trend PRO, скачанный с маркета mql5.
Example of using Pipfinite in xCustomEA
Разберем способы работы с индикатором и варианты его вызова в нашем Советнике Exp – The xCustomEA.
Начало
Разрабатывая советник Exp – The xCustomEA, мы знали, что большинство наших пользователей программировать не умеют!
Но нужно ли иметь знания по программированию, чтобы торговать по индикатору?
Мы сделали все, чтобы использование нашего советника была легким и доступным.
Программирование советника по индикатору за 20 минут? Легко!
Особенно, Если весь программный код уже давно выполнен на безупречно.
В нашей инструкции по Exp – The xCustomEA мы максимально понятно написали шаги по программированию стратегий!
Первый индикатор, который мы будем использовать в нашем примере мы выбрали не случайно.
Дело в том, что в маркете mql5 очень много индикаторов для МТ5 и МТ4.
Но мы выбрали один из самых популярных индикаторов маркета, который имеет 1000 отзывов и распространяется для терминала МТ4 и МТ5.
Также автор индикатора на стал скрывать сигнальные буферы и даже написал номера этих буферов! Что очень важно при разработке советника по индикатору.
PipFinite Trend PRO
Для начала работы с индикатором, нам необходимо установить его в наши терминалы!
Как установить индикатор с маркета?
Заходим на страницу индикатора для мт5 https://www.mql5.com/en/market/product/26889
Заходим на страницу индикатора для мт4 https://www.mql5.com/en/market/product/26888
Нажимаем кнопку Скачать ТРИАЛ или Free DEMO
Подтверждаем загрузку индикатора в наш терминал MetaTrader
После загрузки индикатора с маркета он появится в папке Вашего терминала Indicators\Market
Для того, чтобы протестировать индикатор, Вам необходимо нажать правой кнопкой по индикатору – Test
Должен открыться тестер стратегий, где будет выбранный наш индикатор
Определение сигнальных буферов
После этого нам необходимо выяснить, какие сигнальные буферы использует индикатор, для вывода информации о сигналах.
Нам необходимы номера буферов.
Изначально я пытался сам выяснить номера буферов, но это заняло немало времени потому, что номера буферов не стандартны!
Почитав инструкцию к индикатору я обнаружил, что автор сделал правильно, он написал номера буферов для работы из советника. За это огромный Респект.!
Для того, чтобы узнать номера буферов для сигналов, нам необходимо запустить индикатор в режиме Визуализации и открыть Окно данных или Data Window
C этими номерами мы будем в дальнейшем работать!
Хочу заметить, что все буферы начинаются с 0!
В данном случае Буфер для сигналов BUY под номером 8.
Буфер для сигналов SELL под номером 9.
Этот индикатор очень выгодный для нашего примера потому, что мы можем использовать два типа программирования советника по индикатору:
- Программирование сигналов в нашем индикаторе Ind – The xCustomEA для сигналов (xCustomEA)
- Установка PipFinite Trend PRO в качестве основного индикатора без отдельного программирования (xArrow)
xArrow Работа по индикатору без программирования
Начнем с простейшего прямого указание пользовательского индикатора PipFinite Trend PRO в качестве xArrow
Так, как мы знаем номера буферов для сигналов, а также знаем, что советник устанавливает стрелки по сигналу, то следующий процесс настройки нашего советника займет 10 секунд:
Открытие позиций Сигналы
для мт4 мы указываем название Market\\PipFinite Trend PRO
для мт5 мы указываем название Market\\PipFinite Trend PRO MT5
Параметр SignalTypeIndicator = xArrow
Далее нам необходимо указать номера буферов для открытия позиций!
Автор индикатора любезно предоставил эти номера и мы легко их видим в обзоре рынка:
- SignalBuferforBUY=8
- SignalBuferforSELL=9
Все остальные настройки по умолчанию!
выглядит так:
- SignalNameIndicator=Market\\PipFinite Trend PRO MT5
- SignalTypeIndicator=2
- TF_IndSigToTrade1=0
- OWNSIGNAL_shift=1
- SIGNALStrategyInputs=
- SignalBuferforBUY=8
- SignalBuferforSELL=9
Проверяем работу советника и определяем, что советник точно торгует по нашему индикатору!
Результаты работы советника по индикатору PipFinite Trend PRO будут представлены ниже!
Закрытие позиций Сигналы
для мт4 мы указываем название Market\\PipFinite Trend PRO
для мт5 мы указываем название Market\\PipFinite Trend PRO MT5
- CloseNameIndicator=Market\\PipFinite Trend PRO MT5
- CloseTypeIndicator=xArrow
- CloseTimeFrame=0
- Close_shift=1
- CloseStrategyInputs=
- CloseBuferforBUY=9
- CloseBuferforSELL=8
Далее нам необходимо указать номера буферов для закрытия позиций!
Автор индикатора любезно предоставил эти номера и мы легко их видим в обзоре рынка:
- CloseBuferforBUY=9
- CloseBuferforSELL=8
Как видите – для закрытия позиций по сигналам индикатора, достаточно перевернуть номера буферов (По умолчанию, наш советник открывает по сигналам и закрывает позиции по противоположному сигналу, но если у Вас есть спец буферы для закрытия по определенным правилам, можете использовать их)
Все остальные настройки по умолчанию!
Фильтрация сигналов по тренду
для мт4 мы указываем название Market\\PipFinite Trend PRO
для мт5 мы указываем название Market\\PipFinite Trend PRO MT5
- FilterNameIndicator=Market\\PipFinite Trend PRO MT5
- FilterTypeIndicator=2
- FILTER_TF_IndSigToTrade1=0
- FILTERSIGNAL1_shift=1
- FILTERStrategyInputs=
- FilterBuferforBUY=10
- FilterBuferforSELL=11
Далее нам необходимо указать номера буферов для фильтрации позиций!
Автор индикатора любезно предоставил эти номера и мы легко их видим в обзоре рынка:
- FilterBuferforBUY=10
- FilterBuferforSELL=11
Эти значения похожи на значения при открытии позиций. Их можно использовать с другими индикаторами.
Например: на открытие указывать один индикатор, а на фильтрацию сигналов указывать этот индикатор с фильтрами.
Автор указывает эти фильтры как линии UpTrend и DnTrend
Все остальные настройки по умолчанию!
Стоплосс и Тейкпрофит от индикатора
для мт4 мы указываем название Market\\PipFinite Trend PRO
для мт5 мы указываем название Market\\PipFinite Trend PRO MT5
- SLTPNameIndicator=Market\\PipFinite Trend PRO MT5
- SLTPTypeIndicator=1
- SLTPTimeFrame=0
- SLTP_shift=1
- SLTPStrategyInputs=
- SLTPBuferforBUY_StopLoss=-1
- SLTPBuferforSELL_StopLoss=-1
- SLTPBuferforBUY_TakeProfit=13
- SLTPBuferforSELL_TakeProfit=13
Далее нам необходимо указать номера буферов для получения значений тейкпрофита!
Автор индикатора любезно предоставил эти номера и мы легко их видим в обзоре рынка:
- SLTPBuferforBUY_TakeProfit=13
- SLTPBuferforSELL_TakeProfit=13
Здесь мы указываем одинаковый буфер. Автор указывает нам Тейкпрофит по цене, и в момент нового сигнала заполняется буфер номер 13.
Для стоплосса, автор не указал номер буфера. В этой стратегии стоплосс не предусмотрен! Вы можете указать свой стоплосс в настройках нашего советника в разделе Stops
Также автор указал нам два буфера для тейкпрофита.
Ближний под номером 12
Дальний под номером 13
Мы использовали дальний тейкпрофит, Вы можете указать 12 для ближнего Тейкпрофита!!!!
Результат закрытия по тейкпрофиту индикатору:
Все остальные настройки по умолчанию!
Тестирование советника PipFinite Trend PRO
После проверки правильности сигналов, Мы запустим тест советника по индикатору на EURUSD H1 с 2018 01 01 по 2018 09 27
Кстати: Мы совершенно точно видим, что советник работает практически одинаково на двух терминалах МТ4 и МТ5
Выводы
Мы не будем проводить многочисленные тесты этого индикатора, Вы можете использовать наш пример по работе с этим индикатором и оптимизировать параметры нашего советника с разными вариантами использований функций.
Помните, что для того, чтобы индикатор и советник работал на Вашем демо счете или реальном счете, Вам необходимо купить Exp The xCustomEA и индикатор PipFinite Trend PRO для того терминала, с которым Вы будете работать!
Покупая наш Exp The xCustomEA Вы можете программировать любые стратегии с использованием любых индикаторов!
xCustomEA Программирование стратегии по индикатору
Так, как мы знаем номера сигнальных буферов, то нам не составит труда, чтобы прописать эти сигналу в наш индикатор Ind – The xCustomEA, который мы будем использовать в нашем советнике
Нижу я предоставлю код стратегии по индикатору для МТ5:
#resource "\\Indicators\\Market\\PipFinite Trend PRO MT5.ex5" int h_custom; int h_custom2; double custom1_buffer[]; double custom2_buffer[]; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void IndicatorInit() { // Инициализируем индикаторы, Initializing Indicators switch(StrategyNumber) { case 1: h_custom=iCustom(StrategySymbolString,StrategyTimeFrame,"::Indicators\\Market\\PipFinite Trend PRO MT5"); if(h_custom==INVALID_HANDLE) { Print(" Не удалось получить хендл индикатора Moving Average"); return; } break; } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int IndicatorSignal(int sigInd=0,string symToWork3="",int TF=0,int ShiftIndicator=1,int i=0) { // **************************************************************************************************** // ==================================================================================================== // Эту часть кода Не изменять! // Do not change this part of the code! // START int sig=0; if(symToWork3=="") symToWork3=Symbol(); int StartCopyI=i; InfoAboutSignal=""; if(sigInd==0) { return(-9); } // END // Эту часть кода Не изменять! // Do not change this part of the code! // ==================================================================================================== // **************************************************************************************************** if(sigInd==1) { // Заполняем данные, // We fill in the data if(CopyBuffer(h_custom,8,0,3+ShiftIndicator,custom1_buffer)<3+ShiftIndicator) return(0); if(!ArraySetAsSeries(custom1_buffer,true)) return(0); if(CopyBuffer(h_custom,9,0,3+ShiftIndicator,custom2_buffer)<3+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]!=EMPTY_VALUE && custom1_buffer[ShiftIndicator]>0) { sig=1;} else if(custom2_buffer[ShiftIndicator]!=EMPTY_VALUE && custom2_buffer[ShiftIndicator]>0) { sig=-1;} else sig=0; InfoAboutSignal=InfoAboutSignal+" "+"sigInd="+(string)sigInd+" TF="+(string)TF+" Symbol="+symToWork3+" sig="+(string)sig+" "+__FUNCTION__+" " +" custom1_buffer[ShiftIndicator]="+(string)custom1_buffer[ShiftIndicator] +" custom2_buffer[ShiftIndicator]="+(string)custom2_buffer[ShiftIndicator]; // //--- возвращаем торговый сигнал Comment(InfoAboutSignal); return(sig); } return(-100); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int FILTERIndicatorSignal(int sigInd=0,string symToWork3="",int TF=0,int ShiftIndicator=1,int i=0) { // **************************************************************************************************** // ==================================================================================================== // Эту часть кода Не изменять! // Do not change this part of the code! // START int sig=0; if(symToWork3=="")symToWork3=Symbol(); int shift=ShiftIndicator; int StartCopyI=i; // END // Эту часть кода Не изменять! // Do not change this part of the code! // ==================================================================================================== // **************************************************************************************************** if(sigInd==1) { // Заполняем данные, // We fill in the data if(CopyBuffer(h_custom,10,0,3+ShiftIndicator,custom1_buffer)<3+ShiftIndicator) return(0); if(!ArraySetAsSeries(custom1_buffer,true)) return(0); if(CopyBuffer(h_custom,11,0,3+ShiftIndicator,custom2_buffer)<3+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]!=EMPTY_VALUE && custom1_buffer[ShiftIndicator]>0) { sig=1;} else if(custom2_buffer[ShiftIndicator]!=EMPTY_VALUE && custom2_buffer[ShiftIndicator]>0) { sig=-1;} else sig=0; InfoAboutSignal=InfoAboutSignal+" "+"sigInd="+(string)sigInd+" TF="+(string)TF+" Symbol="+symToWork3+" sig="+(string)sig+" "+__FUNCTION__+" " +" custom1_buffer[ShiftIndicator]="+(string)custom1_buffer[ShiftIndicator] +" custom2_buffer[ShiftIndicator]="+(string)custom2_buffer[ShiftIndicator]; // //--- возвращаем торговый сигнал Comment(InfoAboutSignal); return(sig); } return(-100); } //+------------------------------------------------------------------+
Нижу я предоставлю код стратегии по индикатору для МТ4:
#resource "\\Indicators\\Market\\PipFinite Trend PRO.ex4" string ind="========= Indicators options ========="; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int IndicatorSignal(int sigInd=0,string symToWork3="",int TF=0,int ShiftIndicator=1,int i=0) { // **************************************************************************************************** // ==================================================================================================== // Эту часть кода Не изменять! // Do not change this part of the code! // START int sig=0; if(symToWork3=="") symToWork3=Symbol(); int StartCopyI=i; InfoAboutSignal=""; if(sigInd==0) { return(-9); } // END // Эту часть кода Не изменять! // Do not change this part of the code! // ==================================================================================================== // **************************************************************************************************** if(sigInd==1) { // // Заполняем данные, // We fill in the data // // double CustomSigBuy=iCustom(StrategySymbol,StrategyTimeFrame,"::Indicators\\Market\\PipFinite Trend PRO",8,StartCopyI+ShiftIndicator); double CustomSigSell=iCustom(StrategySymbol,StrategyTimeFrame,"::Indicators\\Market\\PipFinite Trend PRO",9,StartCopyI+ShiftIndicator); // // // // Здесь пишем нашу стратегию, в данном примере это пересечение двух линий, // Here we write our strategy, in this example it is the intersection of two lines // if(CustomSigBuy!=EMPTY_VALUE && CustomSigBuy>0) // // Buy sig sig=1; if(CustomSigSell!=EMPTY_VALUE && CustomSigSell>0) // // 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 +" CustomSigBuy="+(string)CustomSigBuy +" CustomSigSell="+(string)CustomSigSell ; // //--- возвращаем торговый сигнал // return(sig); } return(-100); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int FILTERIndicatorSignal(int sigInd=0,string symToWork3="",int TF=0,int ShiftIndicator=1,int i=0) { // **************************************************************************************************** // ==================================================================================================== // Эту часть кода Не изменять! // Do not change this part of the code! // START int sig=0; if(symToWork3=="") symToWork3=Symbol(); int shift=ShiftIndicator+i; int StartCopyI=i; // END // Эту часть кода Не изменять! // Do not change this part of the code! // ==================================================================================================== // **************************************************************************************************** if(sigInd==1) { // // Заполняем данные, // We fill in the data // // double CustomSigBuy=iCustom(StrategySymbol,StrategyTimeFrame,"::Indicators\\Market\\PipFinite Trend PRO",10,StartCopyI+ShiftIndicator); double CustomSigSell=iCustom(StrategySymbol,StrategyTimeFrame,"::Indicators\\Market\\PipFinite Trend PRO",11,StartCopyI+ShiftIndicator); // // // // Здесь пишем нашу стратегию, в данном примере это пересечение двух линий, // Here we write our strategy, in this example it is the intersection of two lines // if(CustomSigBuy!=EMPTY_VALUE && CustomSigBuy>0) // // Buy sig sig=1; if(CustomSigSell!=EMPTY_VALUE && CustomSigSell>0) // // 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 +" CustomSigBuy="+(string)CustomSigBuy +" CustomSigSell="+(string)CustomSigSell ; // //--- возвращаем торговый сигнал // return(sig); } return(-100); }
Остальную часть кода, которая идет ниже в наших индикаторах трогать ЗАПРЕЩЕНО!
Иначе советник не сможет правильно инициализироваться!
Как Вы видите, программирование стратегии по индикатору очень легкое!
Проверка работы индикатора и советника
После того, как мы выполнили Все шаги программирования стратегии по индикатору, мы обязаны проверить работу советника по этому индикатору!
Загружаем индикатор Ind – The xCustomEA PipFinite Trend PRO для проверки в тестере стратегий и смотрим правильность установки стрелок:
Настраиваем и проверяем советник по индикатору:
Проверяем правильность открытия позиций по сигналам индикатора PipFinite Trend PRO
Как загрузить индикатор PipFinite с пользовательскими настройками в МТ5?
Многие пользователи хотят загрузить Pipfinite с настройками?
В мт5 Вы можете использовать параметр SIGNALStrategyInputs и перечислить параметры через запятую!
Есть правила для того, чтобы записать параметры. Вы можете прочитать их здесь: Настройки xCustomea
ПРИМЕР:
SIGNALStrategyInputs | Внешние параметры для пользовательского индикатора, в режиме SignalTypeIndicator=xArrowВы можете указать внешние переменные индикатора в том виде, как они записаны в таблице настроек через запятую!Важно: Необходимо соблюдать порядок переменных и тип переменных.Тип переменнойЗаписьВажноПримерintx 110777doublex.xОбязательно указание через точку .0.21.10string”x”В MT5: Обязательно указание строки (не цифры ), можно просто записать как “X”В MT4: Внимание! В версии для MetaTrader4 запрещено передавать строковые параметры! При передаче строковых параметров (string) индикатор может быть загружен неправильно!“XXX””TEST SAME”datetimeD’year.month.day’Обязательно указание D и одинарных ковычекD’2018.11.08’D’2015.01.01’colorC’red/green/blue’Обязательно указание С и одинарных ковычек. Перечисление цвета через слэш /C’0/128/128’C’0/256/0’enum (список, перечисление)х(цифра)Если в Вашем индикаторе есть список (выбор параметра из списка), т.е. В настройках нужно записывать цифру! Пример, как это сделать: /forum/69-965-25469-16-1587798560 например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 Например: |
Как загрузить индикатор PipFinite с пользовательскими настройками в МТ4?
Многие пользователи хотят загрузить Pipfinite с настройками?
В мт5 Вы можете использовать параметр SIGNALStrategyInputs и перечислить параметры через запятую!
Внимание! В версии для MetaTrader4 запрещено передавать строковые параметры! При передаче строковых параметров (string) индикатор может быть загружен неправильно!
Поэтому в МТ4 мы должны программировать свой индикатор с параметрами индикатора.
в ШАГ 0 Step MT4 0 добавляем переменные (строго в порядке представленных параметров индикатора)
например:
string ___1; input int Period_1=30; input double Factor_1=1.00000000; input int Lookback=5000; string ___6; int Misc_1=1; int Misc_2=1; int Misc_5=1; int Misc_3=1; string ___2; int Show_1=1; int Show_12=1; int Show_7=1; int Show_4=1; int Show_3=1; int Show_10=1; int Show_9=1; int Show_8=1; int Show_2=1; int Size_1=8; int Show_11=1; int ChartFG=0; string ___3; color Color_bull_1=25600; color Color_bear_1=128; color Color_bull_2=65280; color Color_bear_2=255; color Color_bull_3=16776960; color Color_bear_3=65535; color Color_bull_4=16776960; int LWidth_bull_4=2; color Color_bear_4=255; int LWidth_bear_4=2; color Color_bull_5=16776960; int LWidth_bull_5=0; color Color_bear_5=255; int LWidth_bear_5=0; color Color_exit_1=65535; int LWidth_exit_1=0; color Color_exit_2=65535; int LWidth_exit_2=0; color Color_exit_3=65535; int LWidth_exit_3=0; color Color_exit_4=65535; int LWidth_exit_4=2; color Color_exit_5=16711935; int LWidth_exit_5=1; color Color_3=5197615; color Color_1=8388608; color Color_2=5197615; color Color_7=128; color Color_win_1=65535; color Color_loss_1=16711935; string ___4; int Show_5=1; int Show_6=1; int Size_2=8; int XCoordinateOffset=8; int YCoordinateOffset=8; double YCoordinateSpacing=2.00000000; double BG_X_Size_Factor=20.00000000; int Display_1=0; color Color_4=0; int Use_1=1; color Color_6=16777215; int Use_2=1; color Color_8=65280; color Color_9=255; color Color_10=65535; color Color_5=5767168; string ___5; int Alert_1=1; int Alert_2=0; int Alert_3=0; int Alert_4=0; string SoundFile="alert.wav"; int Alert_5=0;
Так, как нам нужны только первые 4 параметры потому, что остальные параметры это рисование (они нам не нужны.) Используем только
input int Period_1=30; input double Factor_1=1.00000000; input int Lookback=5000;
Добавляем эти параметры в ШАГ Step MT4 5
Это будет так:
custom_buffer_for_Open_BUY[inum]=iCustom(StrategySymbolString,StrategyTimeFrame,"\\Market\\PipFinite Trend PRO",___1,Period_1,Factor_1,Lookback,8,StartCopyI+inum); custom_buffer_for_Open_SELL[inum]=iCustom(StrategySymbolString,StrategyTimeFrame,"\\Market\\PipFinite Trend PRO",___1,Period_1,Factor_1,Lookback,9,StartCopyI+inum);
Теперь наш индикатор будет загружать индикатор PipFinite Trend PRO с параметрами!
После этого мы будем использовать НАШ индикатор.
Поэтому настраиваем советник xCustom на работу с нашим новым индикатором:
Проверим, чтобы все работало:
При загрузку индикатора на график Мы получим индикатор с внешними переменными.
Примеры индикаторов и настроек Вы найдете на форуме PipFinite
Друзья! Вы можете обсудить данную стратегию на нашем форуме!
This post is also available in: English Українська Portuguese Español Deutsch Chinese Русский Français Italiano Türkçe 日本語 한국어