Как посчитать количество баров?

 

Привет. Помогите новенькому. Задача состоит в том чтобы посчитать количество баров начиная от текущего момента(в обратную сторону)  при выполнении условия.  Например, быстрая МА выше медленной МА на протяжении Х баров после пересечения. Как такое можно реализовать в mql5? 

 
Александр Князев:

Привет. Помогите новенькому. Задача состоит в том чтобы посчитать количество баров начиная от текущего момента(в обратную сторону)  при выполнении условия.  Например, быстрая МА выше медленной МА на протяжении Х баров после пересечения. Как такое можно реализовать в mql5? 

Самый лучший алгоритм такой: проверяете пересечение на баре #1 (а не #0) - таким образом гарантируется что пересечение не перерисуется. Запоминаете дату этого бара. При новом пересечении запоминаете новую дату. Остаётся теперь каждый раз копировать бары от сохранённой даты до текущей - количество скопированных баров и будет количество баров с момента последнего пересечения.

 
double ma1[];
double ma2[];
int handle1, handle2;

int OnInit()
{
handle1 = iMA(_Symbol,PERIOD_CURRENT,PEriod_Fast,0,MODE_EMA,PRICE_CLOSE);
handle2 = iMA(_Symbol,PERIOD_CURRENT,PEriod_Slow,0,MODE_EMA,PRICE_CLOSE);
   ArraySetAsSeries(ma1,true);
   ArraySetAsSeries(ma2,true);
   ArrayResize(ma1,20);
   ArrayResize(ma2,20);
}


OnTick()
{
CopyBuffer(handle1,0,1,20,ma1);
   CopyBuffer(handle2,0,1,20,ma2);
   
   for (int i = 0 ;i<=20;i++);
   {
    if (ma1[i]>ma2[i]) 
    continue;
    else break;
   }
        Print ("Персечение на " i+1 ,"  баре");
}

Примерно так. 

 
Dmitiry Ananiev:

Примерно так. 

Спасибо Большое. Как раз то что нужно было. Хотя я столкнулся с проблемой. Посчитать количество баров мне нужно было для того чтоб полученное значение вбить в качестве " периода стохастика".  Все получилось, но стохастик сам по себе не поддерживает динамические значения. Т.е.  при изменении периода, открывается дополнительное подвальное окно с новым периодом. И сколько баров после пересечения проходит(сколько раз изменяется значение в стохастике) столько и окон открывается.  Кто нить знает как обойти эту проблему?

void OnTick()
  {
int L =0;
int S =0;
int period = 0; 
double MAY[];
double MAO[];
int MADefinition, MODefinition;

MADefinition = iMA(_Symbol,PERIOD_CURRENT,6,0,MODE_EMA,PRICE_CLOSE);
MODefinition = iMA(_Symbol,PERIOD_CURRENT,12,0,MODE_EMA,PRICE_CLOSE);
ArraySetAsSeries(MAY,true);
ArraySetAsSeries(MAO,true);
ArrayResize(MAY,20);
ArrayResize(MAO,20);

CopyBuffer(MADefinition,0,1,20,MAY);
CopyBuffer(MODefinition,0,1,20,MAO);

for(int l = 0; l <= 20; l++ )
{
   if (MAY[l] > MAO[l])
   {
      L=l+1;
      continue;
   }
   else break;
}

for(int s = 0; s <= 20; s++ )
{
   if (MAY[s] <  MAO[s])
   {
      S=s+1;
      continue;
   }
   else break;
}

if (MAY[0] > MAO[0]) period = L;
if (MAY[0] < MAO[0]) period = S;


int StochasticDefinitionH=iStochastic(_Symbol,PERIOD_H1,period,NormalizeDouble(period/2,0),NormalizeDouble(period/2,0),MODE_EMA,STO_LOWHIGH);
}
 
Александр Князев:

Спасибо Большое. Как раз то что нужно было. Хотя я столкнулся с проблемой. Посчитать количество баров мне нужно было для того чтоб полученное значение вбить в качестве " периода стохастика".  Все получилось, но стохастик сам по себе не поддерживает динамические значения. Т.е.  при изменении периода, открывается дополнительное подвальное окно с новым периодом. И сколько баров после пересечения проходит(сколько раз изменяется значение в стохастике) столько и окон открывается.  Кто нить знает как обойти эту проблему?

Неправильно. Запомните: в MQL5 хендл индикатора создаётся ОДИН РАЗ! И делается это в OnInit!!!

 
Vladimir Karputov:

Неправильно. Запомните: в MQL5 хендл индикатора создаётся ОДИН РАЗ! И делается это в OnInit!!!

Т.е. вы хотите сказать, что нельзя сделать стохастик с динамическими значениями периода? Ведь в OnInit менять ничего нельзя. Или я ошибаюсь снова и есть обходные пути?
 
Александр Князев:
Т.е. вы хотите сказать, что нельзя сделать стохастик с динамическими значениями периода? Ведь в OnInit менять ничего нельзя. Или я ошибаюсь снова и есть обходные пути?

Никто не запрещает создать множество хендлов.

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