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

 
Sergei Gurov #:

У меня нет конкретного числа баров. Оно может быть в приделах от единицы до восьми


Пример запроса количества баров в заданном интервале:
   int n; 
   datetime date1 = D'2016.09.02 23:55'; // пятница 
   datetime date2 = D'2016.09.05 00:00'; // понедельник 
   datetime date3 = D'2016.09.08 00:00'; // четверг 
   //--- 
   n=Bars(_Symbol,PERIOD_H1,D'2016.09.02 02:05',D'2016.09.02 10:55'); 
   Print("Количество баров: ",n); // Выведет "Количество баров: 8", в подсчете будет учтен двухчасовой бар, а одиннадцатичасовой - не будет 
   n=Bars(_Symbol,PERIOD_D1,date1,date2); 
   Print("Количество баров: ",n); // Выведет "Количество баров: 1", поскольку в диапазон попало время открытия только одного дневного бара — за понедельник 
   n=Bars(_Symbol,PERIOD_W1,date2,date3); 
   Print("Количество баров: ",n); // Выведет "Количество баров: 0", поскольку в заданный диапазон не попадает время открытия ни одного недельного бара

Суть такова: если более 8 баров - не рисуем

 
Vitaly Muzichenko #:


Так как мне узнать date1,date2,date3?

Есть появления сигнала А, далее сигнал В, но т.к и там и там используется high and low только текущего бара, то и значения time одинаковые. Как исправить одинаковые time, зная что между сигналами А и В не может быть меньше одного бара и больше восьми баров? 

 
Sergei Gurov #:

Так как мне узнать date1,date2,date3?

Есть появления сигнала А, далее сигнал В, но т.к и там и там используется high and low только текущего бара, то и значения time одинаковые. Как исправить одинаковые time, зная что между сигналами А и В не может быть меньше одного бара и больше восьми баров? 

int a=0,b=0; 
//+------------------------------------------------------------------+
int OnCalculate(...)
  {
   ...
   if(p)
     {
      //Signal A
      if(a<1&&high[bar]>high[bar+1]&&low[bar]<low[bar+1]) a=bar;
      //Signal B           
      if(a>0&&time[a]<time[bar]&&high[bar]>high[bar+1]&&low[bar]<low[bar+1]) b=bar;
      //Line
      if(a>0&&b>0)
        {
         ObjectCreate(0,"LINE",OBJ_TREND,0,time[a],high[a],time[b],high[b]);
         a=0; b=0;
        }
     }
  }
 
Tretyakov Rostyslav #:

Спасибо!

 
Tretyakov Rostyslav #:
//+------------------------------------------------------------------+ //| ZigZag calculation One                                           | //+------------------------------------------------------------------+ int OnCalculateOne(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    i=0;    int    start=0,extreme_counter=0,extreme_search=Extremum;    int    shift=0,back=0,last_high_pos=0,last_low_pos=0;    double val=0,res=0;    double curlow=0,curhigh=0,last_high=0,last_low=0; //--- initializing    if(prev_calculated==0)      {       ArrayInitialize(ZigZagBuffer,0.0);       ArrayInitialize(HighMapBuffer,0.0);       ArrayInitialize(LowMapBuffer,0.0);       start=InpDepth;      } //--- ZigZag was already calculated before    if(prev_calculated>0)      {       i=rates_total-1;       //--- searching for the third extremum from the last uncompleted bar       while(extreme_counter<ExtRecalc && i>rates_total-100)         {          res=ZigZagBuffer[i];          if(res!=0.0)             extreme_counter++;          i--;         }       i++;       start=i;       //--- what type of exremum we search for       if(LowMapBuffer[i]!=0.0)         {          curlow=LowMapBuffer[i];          extreme_search=Peak;         }       else         {          curhigh=HighMapBuffer[i];          extreme_search=Bottom;         }       //--- clear indicator values       for(i=start+1; i<rates_total && !IsStopped(); i++)         {          ZigZagBuffer[i] =0.0;          LowMapBuffer[i] =0.0;          HighMapBuffer[i]=0.0;         }      } //--- searching for high and low extremes    for(shift=start; shift<rates_total && !IsStopped(); shift++)      {       //--- low       val=low[Lowest(low,InpDepth,shift)];       if(val==last_low)          val=0.0;       else         {          last_low=val;          if((low[shift]-val)>InpDeviation*_Point)             val=0.0;          else            {             for(back=1; back<=InpBackstep; back++)               {                res=LowMapBuffer[shift-back];                if((res!=0) && (res>val))                   LowMapBuffer[shift-back]=0.0;               }            }         }       if(low[shift]==val)          LowMapBuffer[shift]=val;       else          LowMapBuffer[shift]=0.0;       //--- high       val=high[Highest(high,InpDepth,shift)];       if(val==last_high)          val=0.0;       else         {          last_high=val;          if((val-high[shift])>InpDeviation*_Point)             val=0.0;          else            {             for(back=1; back<=InpBackstep; back++)               {                res=HighMapBuffer[shift-back];                if((res!=0) && (res<val))                   HighMapBuffer[shift-back]=0.0;               }            }         }       if(high[shift]==val)          HighMapBuffer[shift]=val;       else          HighMapBuffer[shift]=0.0;      } //--- set last values    if(extreme_search==0) // undefined values      {       last_low=0.0;       last_high=0.0;      }    else      {       last_low=curlow;       last_high=curhigh;      } //--- final selection of extreme points for ZigZag    for(shift=start; shift<rates_total && !IsStopped(); shift++)      {       res=0.0;       switch(extreme_search)         {          case Extremum:             if(last_low==0.0 && last_high==0.0)               {                if(HighMapBuffer[shift]!=0)                  {                   last_high=high[shift];                   last_high_pos=shift;                   extreme_search=Bottom;                   ZigZagBuffer[shift]=last_high;                   res=1;                  }                if(LowMapBuffer[shift]!=0.0)                  {                   last_low=low[shift];                   last_low_pos=shift;                   extreme_search=Peak;                   ZigZagBuffer[shift]=last_low;                   res=1;                  }               }             break;          case Peak:             if(LowMapBuffer[shift]!=0.0 && LowMapBuffer[shift]<last_low && HighMapBuffer[shift]==0.0)               {                ZigZagBuffer[last_low_pos]=0.0;                last_low_pos=shift;                last_low=LowMapBuffer[shift];                ZigZagBuffer[shift]=last_low;                res=1;               }             if(HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]==0.0)               {                last_high=HighMapBuffer[shift];                last_high_pos=shift;                ZigZagBuffer[shift]=last_high;                extreme_search=Bottom;                res=1;               }             break;          case Bottom:             if(HighMapBuffer[shift]!=0.0 && HighMapBuffer[shift]>last_high && LowMapBuffer[shift]==0.0)               {                ZigZagBuffer[last_high_pos]=0.0;                last_high_pos=shift;                last_high=HighMapBuffer[shift];                ZigZagBuffer[shift]=last_high;               }             if(LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]==0.0)               {                last_low=LowMapBuffer[shift];                last_low_pos=shift;                ZigZagBuffer[shift]=last_low;                extreme_search=Peak;               }             break;          default:             return(rates_total);         }      } //--- return value of prev_calculated for next call    return(rates_total);   }
Tretyakov Rostyslav #:

Вы так и не поняли, нельзя использовать два "int OnCalculatе" в одном индикаторе.

Вам предложили два варианта решения вопроса, но  Вы либо не понимаете принципа работы предложенных вариантов, либо не хотите понимать.

Повторюсь еще раз и надеюсь Вы поймете.


В "int OnCalculatе"добавляете обращение к двум функциям(выделил желтым) - это именно обращение(вызов функции), больше сюда ничего добавлять не надо!

Далее Вам надо прописать эти функции которые вызываются из "int OnCalculatе" и первую функцию я Вам расписал

Вам осталось сделать аналогичную функцию для второго зиг-зага, т.е. просто скопировать ее еще раз переименовать в "OnCalculateTwo" и естественно использовать имена буферов для второго зиг-зага.

Все остальные функции "int Highest", "int Lowest" оставить без изменений

Да я вас прекрасно понял с первого раза. Спасибо Вам за данный мне совет. Всё сделал как Вы сказали. Однако, ещё раз повторяю, компилятор ругается на конструкцию: extreme_search=Extremum;

extreme_search=Extremum;

 
Игорь #:
ругается на конструкцию: extreme_search=Extremum;

Пользуйтесь переводчиком!

'Extremum' - undeclared identifier (не объявленный идентификатор)


Вы вначале кода эту переменную удалили или изменили.

 
Tretyakov Rostyslav #:

Пользуйтесь переводчиком!

'Extremum' - undeclared identifier (не объявленный идентификатор)


Вы вначале кода эту переменную удалили или изменили.

Я эту переменную совсем не трогал

Я сравнил с обычным зигзагом, там стоит конструкция: exTreme_search=0, а у нас конструкция: extreme_search=Extremum;

Я так понял, что ошибка связана с целыми числами.
 
Игорь #:

Я эту переменную совсем не трогал

Я сравнил с обычным зигзагом, там стоит конструкция: exTreme_search=0, а у нас конструкция: extreme_search=Extremum;

Я так понял, что ошибка связана с целыми числами.
Покажите весь код.
 
Игорь #:
Я сравнил с обычным зигзагом

Скорее всего мы использовали разные зиг-заги.

Я использовал стандартный из папки "Examples"



 
Tretyakov Rostyslav #:

Ростислав, а как в таком случае учесть число баров между событиями А и В?

         if(a>0&&b>0 && time[a] < time[bar+8])
        {    
           ObjectCreate(0,"AN"+bar,OBJ_TREND,0,time[a],high[a],time[b],high[b]);
           a=0; b=0;
           }

Если между ними более 8 баров, то тогда линии не создаются, я попробовал сделать вот так, но у меня вышло не очень: