Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 683

 
Igor Makanu:

Вы их ни разу не инициализировали ни в начале ни еще где то, Вы их просто обьявили

я же писал перед использованием, т.е. если у Вас переменные SredRazmax, SredRazmin, Sredn являются суммами значений массивов, то чтобы корректно посчитать сумму, нужно переменную обнулить и в дальнейшем складывать эл-ты массива и сохранять в эту переменную

т.е. 

ну и второе, в чем у Вас возникнет вопрос, в индикаторе каждый тик будет вызываться OnCalculate() и значит Вы постоянно будет считать вершины ЗигЗага на каждом тике, т.е. примерно 40-60 раз в секунду.

Спасибо, но я пробовал их обнулять и пробовал вместо OnCalculate() использовать OnStart, все равно прыгают значения и мне непонятно если ww=0 (значение массива постоянно отображается) , то почему прыгают значения в средней, как сделать, чтобы не учитывался каждый тик, а учитывались только значения из массива? 

 
Dmitry Belov:

Спасибо, но я пробовал их обнулять и пробовал вместо OnCalculate() использовать OnStart

думаю, что не смогу объяснить Вам почему так происходит, дело в том, что OnStart() используется в скриптах, а OnCalculate() в индикаторах, Вам нужно разобраться чем скрипты от индикаторов отличаются в MQL

не совсем понятно какая задача у Вас стоит?  Вы хотите вывести значения чего? в коде Вы складываете цены на которых вершины ЗигЗага находятся на всем графике, в выводе пишите  "Средний размах" и выводите значение (SredRazmax-SredRazmin)/nn, а расчет ведете по всем барам

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

 
Igor Makanu:

думаю, что не смогу объяснить Вам почему так происходит, дело в том, что OnStart() используется в скриптах, а OnCalculate() в индикаторах, Вам нужно разобраться чем скрипты от индикаторов отличаются в MQL

не совсем понятно какая задача у Вас стоит?  Вы хотите вывести значения чего? в коде Вы складываете цены на которых вершины ЗигЗага находятся на всем графике, в выводе пишите  "Средний размах" и выводите значение (SredRazmax-SredRazmin)/nn, а расчет ведете по всем барам

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

Честно говоря я это просто упростил задачу(изначально формула выглядит немного по другому), думал получится понять почему прыгают значения среднего, если нулевое значение в массиве остается постоянным. У меня два цикла, один на заполнение массива, а другой на расчет среднего, там же ограничение nn, а вывести я вообщето хотел и график - это стандартный зиг заг, но через iCustom у меня рисует черти что, и среднее... От нулевой вершины, если она больше предыдущей отнять предыдущую и от предыдущей отнят предпредыдущую(она будет со знаком минус, следовательно ее надо умножать на минус 1) и все это суммируется и делится на задаваемое количество вершин nn. Мы получаем средний размах вершин. В дальнейшем хотел получить и другие средние по зигзагу, но у меня возникла загвоздка с "прыганьем" значений.  

Вот так примерно было изначально:

//+------------------------------------------------------------------+
//|                                                           01.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
extern int nn=30;

int shift, ww=0;
double zz, SredRazmax=0.0; 
double HZZ[];


int OnInit()
  {
//--- indicator buffers mapping
    SetIndexBuffer(0,HZZ);
  SetIndexStyle(0,DRAW_SECTION);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  for(shift = 0; shift <= Bars-1; shift++){
      zz = iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, shift);
           if(zz > 0.0)   {
           HZZ[ww]=zz;
            ww++;          }
           else {
           continue;
           }
    }
//---------------------------------------------+
//расчет среднего значения           
//---------------------------------------------+      
  for(ww=0;ww<=nn;ww++){
       if(HZZ[ww]>HZZ[ww+1]){
          SredRazmax += (HZZ[ww]- HZZ[ww+1]);      
         }     
        else if(HZZ[ww]<HZZ[ww+1]){
         SredRazmax += (HZZ[ww]- HZZ[ww+1])*(-1);
        }
        else{
        continue;
           }
     }  
        
  if(SredRazmax>0){    
   
      Comment("Средний размах = ", SredRazmax/nn,",",HZZ[0],",",HZZ[1],",",HZZ[2],",",HZZ[3],",",HZZ[4]);      
        }
   
       
//--- return value of prev_calculated for next call
 return(0);

  
 
  }
 
Dmitry Belov:

Честно говоря я это просто упростил задачу(изначально формула выглядит немного по другому), думал получится понять почему прыгают значения среднего, если нулевое значение в массиве остается постоянным. У меня два цикла, один на заполнение массива, а другой на расчет среднего, там же ограничение nn, а вывести я вообщето хотел и график - это стандартный зиг заг, но через iCustom у меня рисует черти что, и среднее... От нулевой вершины, если она больше предыдущей отнять предыдущую и от предыдущей отнят предпредыдущую(она будет со знаком минус, следовательно ее надо умножать на минус 1) и все это суммируется и делится на задаваемое количество вершин nn. Мы получаем средний размах вершин. В дальнейшем хотел получить и другие средние по зигзагу, но у меня возникла загвоздка с "прыганьем" значений.  

Вот так примерно было изначально:

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

//+------------------------------------------------------------------+
//|                                                           01.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
extern int nn=30;

int  ww=0;
double zz,SredRazmax;
double HZZ[];
bool up,dn;
double lastzz;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,HZZ);
   SetIndexStyle(0,DRAW_SECTION);
   SetIndexEmptyValue(0,0.0);
   up = false;
   dn = false;
   lastzz=0.0;
   SredRazmax=0.0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int shift,limit;
//--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
   if(prev_calculated==0)
     {
      limit=rates_total-1;
      up = false;
      dn = false;
      lastzz=0.0;
      SredRazmax=0.0;
      ArrayInitialize(HZZ,0.0);
     }
   else limit=rates_total-prev_calculated+1;
   for(shift=limit; shift>=0; shift--)
     {
      zz=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,shift);
      if(zz>0.0)
        {
         HZZ[shift]=zz;
         if(lastzz>zz) {up=true;  dn=false;}
         if(lastzz<zz) {up=false; dn=true;}
         if(up) SredRazmax+=zz-lastzz;
         if(dn) SredRazmax+=(zz- lastzz)*(-1);
         lastzz=zz;
        }
      else HZZ[shift]=0.0;
     }
   Comment("Средний размах = ",SredRazmax/nn,",",HZZ[0],",",HZZ[1],",",HZZ[2],",",HZZ[3],",",HZZ[4]);
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Помогите решить такую задачу? (Если возможно.)

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

 
Vatal:

Помогите решить такую задачу? (Если возможно.)

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

В документации есть пример. Надо получить ID графика на котором работает советник и вперёд...
Примеры работы с графиком - Константы графиков - Константы, перечисления и структуры - Справочник MQL4
Примеры работы с графиком - Константы графиков - Константы, перечисления и структуры - Справочник MQL4
  • docs.mql4.com
В этом разделе представлены примеры для работы со свойствами графика. Для каждого свойства приведены одна или две законченные функции, которые позволяют задавать/получать значение этого свойства. Эти функции можно использовать в своих MQL4 программах как есть. На рисунке показана графическая панель для наглядной демонстрации того, как изменение...
 
Igor Makanu:

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

Да, спасибо Вам что уделяете мне время, у Вас действительно рисует, я наверное что то неправильно делал. Но вот не выводит в коменте массив(ведь там только вершины должны быть?) и считает неправильно с минусом и число..., у зигзага размах между вершинами не такой. Идея в том, чтобы от большей последней(которая только сформировалась) вершина отнять предыдущую меньшую, а от предыдущей меньшей отнять еще более предыдущую, которая больше и число будет со знаком минус, его мы умножаем на (-1) и так далее, а все это складывается nn раз и делится на nn, получаем средний вылет. Примерно на 4 часовках это будет 1,69(от до) на USDJPY. В дальнейшем я хотел посчитать количество баров среднее между вершинами. Попробую теперь разобраться в вашем коде, что я делал не так, почему у меня не рисовал и почему неправильно считает может получится...

 
Dmitry Belov:
Да, спасибо Вам что уделяете мне время, у Вас действительно рисует, я наверное что то неправильно делал. Но вот не выводит в коменте массив(ведь там только вершины должны быть?) и считает неправильно с минусом и число..., у зигзага размах между вершинами не такой. Идея в том, чтобы от большей последней(которая только сформировалась) вершина отнять предыдущую меньшую, а от предыдущей меньшей отнять еще более предыдущую, которая больше и число будет со знаком минус, его мы умножаем на (-1) и так далее, а все это складывается nn раз и делится на nn, получаем средний вылет. Примерно на 4 часовках это будет 1,69(от до) на USDJPY. В дальнейшем я хотел посчитать количество баров среднее между вершинами. Попробую теперь разобраться в вашем коде, что я делал не так, почему у меня не рисовал и почему неправильно считает может получится...

Вершины в комменте не будет выводить, т.к. индикаторный буфер HZZ[] содержит скопированные значения индикаторного буфера ZigZag, иначе не сумеем нарисовать, я специально разнес на 2 условия обнаружения вершины вверх и вниз:

if(up) SredRazmax+=zz-lastzz;
if(dn) SredRazmax+=(zz- lastzz)*(-1);

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

ЗЫ: код мой пример, и думаю, что там нужно цикл до 1-го бара производить, а не до 0, будет пересчитывать постоянно значения SredRazmax, проверять не могу сейчас, нет терминала в ПК

 
Igor Makanu:

Вершины в комменте не будет выводить, т.к. индикаторный буфер HZZ[] содержит скопированные значения индикаторного буфера ZigZag, иначе не сумеем нарисовать, я специально разнес на 2 условия обнаружения вершины вверх и вниз:

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

ЗЫ: код мой пример, и думаю, что там нужно цикл до 1-го бара производить, а не до 0, будет пересчитывать постоянно значения SredRazmax, проверять не могу сейчас, нет терминала в ПК

Мой индикатор как только загружается показывает правильные значения, затем при каждом тике увеличивает значение среднего, хотя в выводимых значениях массива зиг зага нет изменений вершины держутся. Вот что я понять не могу, почему так? Не хватает опыта и знания языка. От отрисовки я откажусь - это же обычный зигзаг берется по iCustum (я понимаю теперь что массив не может он наложить на график, поэтому и рисует черти что.). Массив "сползет", но тогда значения просто пересчитаются же? я так понимаю Спасибо Вам... Буду пробовать...Учиться...
 
Как объяснить советнику (стандартному ма), что покупать (продавать), надо только в момент пересечения средних, а не вобщем, когда ма_1>ма_2. А  он постоянно покупает, остановиться не может
Причина обращения: