Советник для бинарных опционов на основе Zigzag

 
Здравствуйте друзья!
Попытался найти ответ с помощью поиска в Web. Он привел меня сюда к вам.
Попытался найти ответ в руководстве. некоторые ответы нашел но не все.
Попытался найти ответ в списке часто задаваемых вопросов (ЧаВО).такого ответа не нашел.
Попытался найти ответ путем проверок или экспериментов. путем проверок и экспериментов пробовал но понял что запутался.
Нужна хотя бы минимальная подсказка или пример как лучше сделать хотя бы самому.

Конечно можно все сделать самому, но думаю можно и спросить здесь.
На просторах web такие темы были они развивались до определенного уровня и все дальше развития не было.
В развитие этой темы, ищу ответ может кто подскажет как самому лучше(как правильно делать, информацию познаю но как сформировать самому пока для меня большая деле-мА) или хотя бы кто сделает это если не очень сложно.
Чтобы задать такой вопрос и не впустую развивать эту тему конечно некоторую часть времени уделял проверки работоспособности данной идеи.
не каждый кто умеет хорошо складывать может уметь быстро бегать, вкусно готовить, красиво рисовать. :-)
Согласны? так же спрашивает интересуется, если ему интересно.

Попытаюсь максимально понятно и открыто донести информацию.
Для бинарных опционов (Futures)

Описание технического задания:

Надо что бы торговая операция открывалась один раз по закрытию бара(5м или не важно если не критично) когда сработал сигнал в период времени 00:00-00:30; 00:30-01:00;.....23:30-00:00;

больше не открывалось когда еще срабатывает сигнал и перерисовывает индикатор в период открывшейся торговой позиции.
если в период времени 00:30-01:00 сделка открылась, и она проиграла. То следующая открывшаяся сделка была догоном(Мартингейл)
Во входных параметрах добавить мартингейл:
сделка-1  1.0  (можно самому устанавливать и менять сумму мартина)
сделка-2  2.0
сделка-3  5.0
сделка-4  12.0

сделка-5  25.5   

Файлы:
 

Начал с того что попытался понять каждое действие и расшифровать его.

если что подправьте пожалуйста.

//+------------------------------------------------------------------+
//|                                             super-signals_v2.mq4 |
//|                Copyright © 2006, Nick Bilak, beluck[AT]gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Nick Bilak"
#property copyright "alterations by Mark Tomlinson"
#property link      "https://www.forex-tsd.com/"

#property indicator_chart_window  // Свойства программ Выводить индикатор в окно графика
#property indicator_buffers 2     // Свойства программ Количество буферов для расчета индикатора 2 Тип int
#property indicator_color1 Red    // Свойства программ Цвет для вывода линии1 красный
#property indicator_color2 Yellow // Свойства программ Цвет для вывода линии2 желтый
#property indicator_width1 5      // Свойства программ Толщина линии в графической серии 1
#property indicator_width2 5      // Свойства программ Толщина линии в графической серии 2


// input properties Вводные свойства 

extern int  dist2           = 59;// was 21 250 //переменные на нулевом баре (т.е. на текущем) запрашиваются и обрабатываются максимальное и минимальное значения курсов на барах с положительным индексом.
extern int  dist1           = 59;// was 14     //переменные на нулевом баре (т.е. на текущем) запрашиваются и обрабатываются максимальное и минимальное значения курсов на барах с положительным индексом
extern bool alertsOn        = true;            //переменные оповещенеи включено
extern bool alertsOnCurrent = true;            //переменные возвращает текущий элемент массива
extern bool alertsMessage   = true;            //переменные текстовое сообщение в окошке
extern bool alertsSound     = true;            //переменные звук
extern bool alertsEmail     = false;           //переменные не отправлять сообщение на почтовый ящик
double alertBar;                               //дробная часть оповещения бара
extern int SignalGap = 3;                      //переменная разрыв цены в потоке котировок

double b1[];
double b2[];

int init()                                      //для инициализации переменных которые предопределены, для проверок.
{
                                                      //настройка параметров отрисовки
   SetIndexBuffer(0,b1);                              //буфер для первой линии
   SetIndexBuffer(1,b2);                              //буфер для второй линии
   SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,222); //Устанавливает стрелку, стиль, ширину и цвет для указанной линии индикатора
   SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,221); //Устанавливает стрелку, стиль, ширину и цвет для указанной линии индикатора
  return(0);                                          //
}
int start()
{
   int counted_bars=IndicatorCounted();       // последний посчитанный бар будет пересчитан // проверка на возможные ошибки
   int i,limit,hhb1,llb1;


   
  if(counted_bars<0) return(-1);             // последний посчитанный бар будет пересчитан
   if(counted_bars>0) counted_bars--;        // Притворяемся, что посчитано на один бар меньше, чтобы пересчитать последний бар. На самом деле, это перестраховка, т.к. функция IndicatorCounted( ) и так возвращает число на 1 меньше
          limit=Bars-counted_bars;           // основной цикл
           limit=MathMax(limit,dist1);       // Функция возвращает максимальное из двух числовых значений.
           limit=MathMax(limit,dist2);       // Функция возвращает максимальное из двух числовых значений

   for (i=limit;i>=0;i--)
      {
         hhb1 = iHighest(NULL,Period(),MODE_HIGH,dist2,i-dist2/2); //  Устаревшие функция Highest собираются значения максимальной цены 
         llb1 = iLowest(NULL,Period(),MODE_LOW,dist1,i-dist2/2);   // Возвращает индекс наименьшего найденного значения (смещение относительно текущего бара) соответствующего графика

            b1[i] = EMPTY_VALUE;            //присваивается пустое значение в индикаторном буфере Значение 2147483647 (0x7FFFFFFF)
            b2[i] = EMPTY_VALUE;            //присваивается пустое значение в индикаторном буфере Значение 2147483647 (0x7FFFFFFF)
 
         double tr = iATR(NULL,0,5,i);
         if (i==hhb1)   b1[i]=High[hhb1] + tr/2;
         if (i==llb1)  b2[i]=Low[llb1] -tr/2;
         if(i == 0 && b1[i]!=0 && b2[i] != 2147483647 && Bars>alertBar) {Alert("Super_Signal Вверх Alert " + Symbol() + " on the " +  Period() + " minute chart ");alertBar = Bars;}
         if(i == 0 && b2[i]!=0 && b1[i] != 2147483647 && Bars>alertBar) {Alert("Super_Signal ВНИЗ Alert " + Symbol() + " on the " +  Period() + " minute chart ");alertBar = Bars;}
      }
      
  return(0);
}

 

Малость добавлю

 hhb1 = iHighest(NULL,Period(),MODE_HIGH,dist2,i-dist2/2); //  Попытка заглянуть в будущее
 llb1 = iLowest(NULL,Period(),MODE_LOW,dist1,i-dist2/2);   //  Попытка заглянуть в будущее
 
Vinin спасибо за ваш вклад.
Здесь я что-то подобное нашел описывается, что и исправить можно но пока не проверял.
https://forum.mql4.com/ru/3571
Но вот код немного другой i-dist/2 и i-dist2/2 и вроде исправить наверное можно - i+dist/2 

Думаю в этом нет ничего страшного, то что в будущее заглядывает.
Как здесь было описано в шапке, не до словно конечно но любой советник индикатор можно вечно доводить до совершенства.(я бы поспорил, но тема не об этом)
Хотел связаться с Mark Tomlinson не получается (не пускает reCAPTCHA).

Здесь вижу недостаток, нету определение флета и не флета.(заглядывая в будущее) пока тока время и торговую операцию добавить.
Например: как эффективнее тоже никто не знает. если ~20 программистов будут работать над одни советником каждый вкладывая свой опыт или те же ~20 программистов каждый над своим советником. фокусировка распыляется. эффективнее конечно когда например ~20 на одним советником(мне так кажется).

ка то так получилось у меня

double tr = iATR(NULL,0,5,i);      // дробное tr равняется Возвращает значение технического индикатора Average True Range тоже не понятно зачем присваивать NULL,0,5,i
if (i==hhb1)   b1[i]=High[hhb1] + tr/2;     //Истина, если i равно hhb1 b1[i]равно Массив-таймсерии, содержащий максимальные цены каждого бара текущего графика hhb1 плюс tr деленное на 2
if (i==llb1)  b2[i]=Low[llb1] -tr/2;        //Истина, если i равно llb1 b2[i]равно Массив-таймсерия, содержащий минимальные цены каждого бара текущего графика llb1 минус tr деленное на 2

if(i == 0 && b1[i]!=0 && b2[i] != 2147483647 && Bars>alertBar) {Alert("Super_Signal Вверх Alert " + Symbol() + " on the " +  Period() + " minute chart ");alertBar = Bars;}
   // если i равно 0 и b1[i] не равно 0 и b2[i] не равно 2147483647 и текущие бары больше прошедших сигнальных баров то срабатывает оповещение аллерт вверх, сигнальный бар равняется текущим баром
if(i == 0 && b2[i]!=0 && b1[i] != 2147483647 && Bars>alertBar) {Alert("Super_Signal ВНИЗ Alert " + Symbol() + " on the " +  Period() + " minute chart ");alertBar = Bars;}
   // здесь так же только вниз, сигнальный бар равняется текущим баром

 Сразу появляется вопрос

время c 00:00 по  00:30 нужно назначать вначале а потом прилагать его к действию старт

какой торговой функцией лучше назначать торговую операцию для бинарных опционов.

приходится заглядывать в другие советники и смотреть как там это реализовано. не в 1, а в 3-5 разные, почти по каждому вопросу. 


 

Вроде так лучше будет

//+------------------------------------------------------------------+
//|                                             super-signals_v2.mq4 |
//|                Copyright © 2006, Nick Bilak, beluck[AT]gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Nick Bilak"
#property copyright "alterations by Mark Tomlinson"
#property link      "https://www.forex-tsd.com/"

#property indicator_chart_window  // Свойства программ Выводить индикатор в окно графика
#property indicator_buffers 2     // Свойства программ Количество буферов для расчета индикатора 2 Тип int
#property indicator_color1 Red    // Свойства программ Цвет для вывода линии1 красный
#property indicator_color2 Yellow // Свойства программ Цвет для вывода линии2 желтый
#property indicator_width1 5      // Свойства программ Толщина линии в графической серии 1
#property indicator_width2 5      // Свойства программ Толщина линии в графической серии 2


// input properties Вводные свойства 

extern int  dist2           = 59;// was 21 250 //переменные на нулевом баре (т.е. на текущем) запрашиваются и обрабатываются максимальное и минимальное значения курсов на барах с положительным индексом.
extern int  dist1           = 59;// was 14     //переменные на нулевом баре (т.е. на текущем) запрашиваются и обрабатываются максимальное и минимальное значения курсов на барах с положительным индексом

double b1[];
double b2[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init() //для инициализации переменных которые предопределены, для проверок.
  {
//настройка параметров отрисовки
   SetIndexBuffer(0,b1);                              //буфер для первой линии
   SetIndexBuffer(1,b2);                              //буфер для второй линии
   SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,222); //Устанавливает стрелку, стиль, ширину и цвет для указанной линии индикатора
   SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,221); //Устанавливает стрелку, стиль, ширину и цвет для указанной линии индикатора

   SetIndexEmptyValue(0,0);
   SetIndexEmptyValue(1,0);

   return(0);                                          //
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted();       // последний посчитанный бар будет пересчитан // проверка на возможные ошибки
   int i,limit,hhb1,llb1;

   if(Bars<MathMax(dist1,dist2)) return(-1);             // Недостаточно баров для расчета

   limit=Bars-counted_bars;           // основной цикл

   if(limit>1) 
     {
      limit=Bars-MathMax(dist1,dist2)-1;
     }

   for(i=limit;i>=0;i--)
     {

      b1[i] = 0;            //присваивается пустое значение в индикаторном буфере Значение 2147483647 (0x7FFFFFFF)
      b2[i] = 0;            //присваивается пустое значение в индикаторном буфере Значение 2147483647 (0x7FFFFFFF)

      hhb1 = iHighest(NULL,Period(),MODE_HIGH,dist2,i); //  Поиск свечи с максимальной ценой
      llb1 = iLowest(NULL,Period(),MODE_LOW,dist1,i);   // Поиск свечи с минимальной ценой

      double tr=iATR(NULL,0,5,i)*0.5;

      if(i==hhb1)   b1[i]=High[hhb1] + tr;
      if(i==llb1)  b2[i]=Low[llb1] -tr;

     }

   return(0);
  }
//+------------------------------------------------------------------+
 

Проверил конечно на графике, то что не перерисовывает и оставляет старые сигналы думаю это дело вкуса

Не знаю лучше так или легче так.

Но я искренне не понимаю, почему так и зачем так, ведь есть что-то подобное в первом super-signals.mq4 
может от просто к сложному, упростить и снова от простого к сложному. Надо делать.

вроде нашел нужную функцию 

EventSetTimer

https://docs.mql4.com/ru/eventfunctions/eventsettimer
хоть по чуть чуть стараюсь познавать.
Уважаемые пользователи ресурса, добавляйте пожалуйста ваши знания, при многом благодарен.
 
Хоть по чуть чуть познаю расписываю на бумаге. Познавая язык mql4 понимаю что достаточно одной торговой функции по закрытию бара, ведь он закроется автоматически, а когда откроется 2 торговая операция то она это сможет сделать только после закрытия первой. Вроде и на поверхности но не зная основ и сформулировать сложно, только в процессе изучения появляются вопросы и ответы. Если что поправьте. Спасибо.
 

Здравствуйте друзья! Зря вы отказываетесь помочь. почему? Ваша не уверенность в том что именно эта стратегия не к чему хорошему вас не приведет или ну взял ну попробовал ошибся он(я), а кто-то время потратил репутацию не заработал. Лучше продать свое и подороже. 

Да да знаю что не грааль, и сливает при определенных условиях, условия два(я вижу два).

Может кто ссылкой полезной поделится, хотя не дурак поисковом пользоваться умею. Главное правильно сформулировать вопросы и забить куда надо.

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

Открытие одного ордера, если цена выше или ниже по закрытию сигнальной свечи(бара). (hhb1,llb1;)

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

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

Скайп: xeon5923 

 
for (int i=OrdersTotal()-1; i!=0; i--)

Проверка открытого ордера истина =(равно) 0; != (не больше) 0                  (ПО замыслу должен быть максимум 1 открытый ордер)

То 

OrderSend

(Открытие ордера)

     ЕСЛИ  

           ticket==0(количество ордеров рано 0) И значения hhb1>(больше) llb1 

       ТО ордер открывается OP_BUY(покупка) по PRICE_CLOSE (цена закрытия бара);

        ИНАЧЕ

            ЕСЛИ  

                ticket==0(количество ордеров рано 0)  И  если значение hhb1<(меньше) llb1 

        ТО ордер открывается OP_SELL(продажа) по PRICE_CLOSE (цена закрытия бара);

        ЕСЛИ цена OP_BUY(покупка) закрылась hhb1<(меньше) llb1 по PRICE_CLOSE (цена закрытия бара) То возвращаем OrderSend+lot*1,5 (первоначальные открытие ордера увеличенное в полтора раза);

        ИЛИ цена OP_SELL(продажа) закрылась hhb1>(больше) llb1 по PRICE_CLOSE (цена закрытия бара) То возвращаем OrderSend+lot*1,5 (первоначальные открытие ордера увеличенное в полтора раза);

 

  return(0);

Наверное примерно так должна быть периодичность со скобками () и операторами  if, OrderSelect, true, false, И где и как лучше обозначить что OrderSend+lot*1,5 не должно превышать 4-5 раз.

double tr = iATR(NULL,0,5,i);       // технический индикатор
 

С компилировалось нормально. Мартина нет.

На график не добавляется.  Что-то не так сделал пока не могу понять что.

часть взял от сюда https://www.mql5.com/ru/forum/149243 

 

//+------------------------------------------------------------------+
//|                                             super-signals_v2.mq4 |
//|                Copyright © 2006, Nick Bilak, beluck[AT]gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Nick Bilak"
#property copyright "alterations by Mark Tomlinson"
#property link      "https://www.forex-tsd.com/"

#property indicator_chart_window  // Свойства программ Выводить индикатор в окно графика
#property indicator_buffers 2     // Свойства программ Количество буферов для расчета индикатора 2 Тип int
#property indicator_color1 Red    // Свойства программ Цвет для вывода линии 1 красный
#property indicator_color2 Yellow // Свойства программ Цвет для вывода линии 2 желтый
#property indicator_width1 5      // Свойства программ Толщина линии в графической серии 1
#property indicator_width2 5      // Свойства программ Толщина линии в графической серии 2


// input properties Вводные свойства 

extern int  dist2           = 59;// was 21 250 //переменные на нулевом баре (т.е. на текущем) запрашиваются и обрабатываются максимальное и минимальное значения курсов на барах с положительным индексом.
extern int  dist1           = 59;// was 14     //переменные на нулевом баре (т.е. на текущем) запрашиваются и обрабатываются максимальное и минимальное значения курсов на барах с положительным индексом
double alertBar;                               //дробная часть оповещения бара
extern int SignalGap        = 3;               //переменная разрыв цены в потоке котировок
extern double Lots          = 1.0;             //----цена лота  совершается ставка в валюте депозита (не в лотах) OrderProfit(). MarketInfo()- MODE_TICKVALUE
extern int  Slippage        = 6;
extern int    MagicNumber   = 321; 



double b1[];
double b2[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init() //для инициализации переменных которые предопределены, для проверок.
  {
//настройка параметров отрисовки
   SetIndexBuffer(0,b1);                              //буфер для первой линии
   SetIndexBuffer(1,b2);                              //буфер для второй линии
   SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,222); //Устанавливает стрелку, стиль, ширину и цвет для указанной линии индикатора
   SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,221); //Устанавливает стрелку, стиль, ширину и цвет для указанной линии индикатора

   SetIndexEmptyValue(0,0);
   SetIndexEmptyValue(1,0);
   if (Digits == 5 || Digits == 6)
   
   return(0);                                          //
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted();                  // последний посчитанный бар будет пересчитан // проверка на возможные ошибки
   int i,limit,hhb1,llb1,ticket;

   if(Bars<MathMax(dist1,dist2)) return(-1);             // Недостаточно баров для расчета

   limit=Bars-counted_bars;                               // основной цикл

   if(limit>1) 
     {
      limit=Bars-MathMax(dist1,dist2)-1;
     }      
      for(i=limit;i>=0;i--)
   
      b1[i] = 0;                          //присваивается пустое значение в индикаторном буфере Значение 2147483647 (0x7FFFFFFF)
      b2[i] = 0;                          //присваивается пустое значение в индикаторном буфере Значение 2147483647 (0x7FFFFFFF)

      hhb1 = iHighest(NULL,Period(),MODE_HIGH,dist2,i);          //  Поиск свечи с максимальной ценой
      llb1 = iLowest(NULL,Period(),MODE_LOW,dist1,i);            // Поиск свечи с минимальной ценой

      if (CountTrades() == 0)                    //--- подсчет количества ордеров открытых советником
    {
      double tr=iATR(NULL,0,5,i)*0.5;

      if(i==hhb1)   b1[i]=High[hhb1] + tr;
      if(i==llb1)  b2[i]=Low[llb1] -tr;
      
      if(CountTrades() == 0 && Ask < tr)                      // открытие ордеров бай  
      {
      ticket = OrderSend(Symbol(),OP_BUY, Lots, PRICE_CLOSE, Slippage, 0, 0, "Buy", MagicNumber, 0, Blue); 
      if (ticket>0)
        {
        OrderModify(ticket, OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit()+tr*Point,0,Blue);  // установка тейкпрофита  
        }
      }  
       else if(CountTrades() == 0 && Bid > tr)                // открытие ордеров селл 
       {
      ticket = OrderSend(Symbol(),OP_SELL, Lots, PRICE_CLOSE, Slippage, 0, 0, "Sell", MagicNumber, 0, Red); 
      if (ticket>0)
        {
        OrderModify(ticket, OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit()-tr*Point,0,Blue);  // установка тейкпрофита  
        }
       }  
     }
   return(0);
  }
//+------------------------------------------------------------------+
int CountTrades()                     // подсчет количества ордеров открытых советником 
{
   int count = 0;
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
        count++;
     }
   }
   return(count);
 
xeon5923:

С компилировалось нормально. Марина нет.

На график не добавляется.  Что-то не так сделал пока не могу понять что.

часть взял от сюда https://www.mql5.com/ru/forum/149243 

 

У Вас индикатор, а не советник. Положите код в соответствующую папку. И торговые функции в индикаторе не работают.
Причина обращения: