Нужна помощб для написания функции пересечения 2-х EMA

 

Никак не получается написать функцию для пересечения 2-х EMA. Подскажите как это сделать.

Пробывал так:


MA_1=iMA(NULL,0,4,0,MODE_EMA,PRICE_CLOSE,0);
MA_2=iMA(NULL,0,8,0,MODE_EMA,PRICE_CLOSE,0);

if (MA_1 == MA_2) // Проверка прохода
{
Alert("Пересечение.");// Сообщение
}



Но почемуто не получается, условие не выполняется. подскажите кто знает как найти это пересечение, буду благодарен.

 

1) Сравнивать на нулевом баре некорректно, т.к. данные постоянно меняются, и получите кучу ложных сигналов.

2) Сравниватьнапрямую тоже не корректно, т.к. пересечение может быть между барами, или значения (МА), в данном случае будут близки, но не равны

3) алгоритм такой: если есть пересечение, то где то есть и расхождение после пересечения, т.е. предположим такую формулу: МА1,1>МА2,1&&MA2.1<MA2.2

4)Если учест что пересечение может произойти и на одном баре то результируюзая формула должна выглядеть так: ((МА1,1>МА2,1&&MA2.1<MA2.2)||(МА1,1>МА2,1&&MA2.1==MA2.2&&МА1,3<МА2,3)) так что пересечение надо искать где то на втором баре,

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

должно получиться что то вроде этого:

//+------------------------------------------------------------------+
void MACD(){
for(int i=0;i<10;i++){
MacdMain[i]=iMACD(Symbol(),0,Fast,Slow,Signal,0,MODE_MAIN,MacdShift+i);}}
//+------------------------------------------------------------------+
bool MacdBuy(){
bool _MacdBuy=false;
   if(
     (MacdMain[3]>MacdMain[4]&&
      MacdMain[4]>MacdMain[5]&&
      MacdMain[5]==0&&
      MacdMain[5]>MacdMain[6]&&
      MacdMain[6]>MacdMain[7])||
     (MacdMain[3]>MacdMain[4]&&
      MacdMain[4]>MacdMain[5]&&
      MacdMain[5]>=0&&
      MacdMain[6]<=0&& 
      MacdMain[6]>MacdMain[7]&&
      MacdMain[7]>MacdMain[8])){_MacdBuy=true;}
return(_MacdBuy);}
 
sergesus писал (а) >>

Никак не получается написать функцию для пересечения 2-х EMA. Подскажите как это сделать.

Пробывал так:


MA_1=iMA(NULL,0,4,0,MODE_EMA,PRICE_CLOSE,0);
MA_2=iMA(NULL,0,8,0,MODE_EMA,PRICE_CLOSE,0);

if (MA_1 == MA_2) // Проверка прохода
{
Alert("Пересечение.");// Сообщение
}



Но почемуто не получается, условие не выполняется. подскажите кто знает как найти это пересечение, буду благодарен.

Вы только должны понимать что работая с пересечением на 0-ом баре вы рискуете поймать пересечение

которого потом на истории не будет


т е на работающем баре вы получите пересечение! но бар мог сильно приседать или сильно взлетать

а потом вернуться - пересечение вы зафиксируете а в истории потом его не будет!

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

т к мувинги слегка перерисовываются :-)

Причина обращения: