MACD в индикаторе ведёт себя странно...

 

Добрый День. 




Пишу торговую систему, которая, в частности, использует MACD. Условия вывода значений в буфер одинаковые (зеркальные) для лонга и для шорта.
НО!
При индикации шорта всё работает как я задумал, а вот на лонге -- полный бардак! Стрелки рисуются на нескольких барах, хотя условие входа выполняется только для одного. Используется три значения MACD: i+1, i+2, i+3. 1 и 2 должны быть больше (на лонге) определённой величины, 3-й  -- меньше. На шорте -- наоборот. 

Подскажите, пожалуйста, почему стрелки плодятся вообще, и на лонге - в особенности???  !!! При том, что в шорте -- всё как надо.

//MACD
 int Fast_EMA = 8;
 int Slow_EMA = 17;
 int Signal_SMA = 5;
extern double min_MACD = 0.0007; 

//=====================================================
//---- indicator settings
#property  indicator_chart_window
#property  indicator_buffers 6
#property  indicator_color1  Aqua
#property  indicator_color2  Coral
#property  indicator_color3  Aqua
#property  indicator_color4  Coral
#property  indicator_color5  Aqua
#property  indicator_color6  Coral

//   White//
//---- indicator parameters

int i = 0; 

double ODb, ODs;
double WayUp, WayDown;
double SLB, SLS;
int st, N;
int nA,clb1,cls1,clb2,cls2,clb3,cls3;
int spread;
double PPoint;
//---- indicator buffers
double BufferUp[],BufferDn[],BufferClBuy[],BufferClSell[],BufferBTg[],BufferSTg[];
double BuyTg[],SellTg[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//Drawing settings-------------------------
   IndicatorBuffers(10);

   SetIndexStyle(0,DRAW_ARROW,2,1);
   SetIndexArrow(0,233);
   SetIndexStyle(1,DRAW_ARROW,2,1);
   SetIndexArrow(1,234);
   SetIndexStyle(2,DRAW_ARROW,2,3);
   SetIndexArrow(2,251);   
   SetIndexStyle(3,DRAW_ARROW,2,3);
   SetIndexArrow(3,251);   
   SetIndexStyle(4,DRAW_ARROW,2,1);
   SetIndexArrow(4,232);   
   SetIndexStyle(5,DRAW_ARROW,2,1);
   SetIndexArrow(5,232);   
   
   SetIndexBuffer(0,BufferUp);//стрелка синяя верх
   SetIndexBuffer(1,BufferDn);//стрелка красная вниз
   SetIndexBuffer(2,BufferClBuy);//крестик
   SetIndexBuffer(3,BufferClSell);//крестик
   SetIndexBuffer(4,BuyTg);//стрелка вправо
   SetIndexBuffer(5,SellTg);//стрелка вправо

   SetIndexLabel(0,"LONG");
   SetIndexLabel(1,"SHORT");
   SetIndexLabel(2,"Close Buy");
   SetIndexLabel(3,"Close Sell");
   SetIndexLabel(4,"Buy TP");
   SetIndexLabel(5,"Sell TP");
      
//Drawing settings=========================
//---- initialization done
//Digits-----------------------------------
if(Digits==5) 
  { st = 35; N = 5; }
if(Digits==3) 
  { st = 30; N = 3; }  
//Digits===================================
   IndicatorShortName("НИКОДИМ");                //<<<<<<<<<<<<<<<<<<<<     NAME

return(0);
  }
int start()
  {
//---- ArraySetAsSeries --------------------------------------------------  
double MACD1[1000],MACD2[1000],MACD3[1000];

//---- IndicatorCounted ------------------------------
int    counted_bars=IndicatorCounted();
int    limit1=Bars-counted_bars;
       if (limit1>1){limit1=Bars;} 
//ПОЕХАЛИ!--------------------------------------------
for(i=limit1; i>=0; i--)  
   {//limit
//if(TimeHour(Time[i]) < 7  ||  TimeHour(Time[i])> 17) continue;      
//Set EMPTY_VALUE-------------------------------------
BuyTg[i]= EMPTY_VALUE; BufferUp[i]= EMPTY_VALUE; 
SellTg[i]= EMPTY_VALUE; BufferDn[i]= EMPTY_VALUE; 
//Indicators------------------------------------------
  
   MACD1[i] = iMACD(NULL,0,Fast_EMA,Slow_EMA,Signal_SMA,PRICE_CLOSE,MODE_MAIN,i+1);
   MACD2[i] = iMACD(NULL,0,Fast_EMA,Slow_EMA,Signal_SMA,PRICE_CLOSE,MODE_MAIN,i+2);
   MACD3[i] = iMACD(NULL,0,Fast_EMA,Slow_EMA,Signal_SMA,PRICE_CLOSE,MODE_MAIN,i+3);
   

//Open Buy---------------------------------
       if(MACD1[i] > min_MACD
       && MACD2[i] > min_MACD
       && MACD3[1] < min_MACD)
         {//buy
         BuyTg[i+1] = Low[i+1] + WayUp;
         BufferUp[i+1] = Low[i+1]-st*PPoint;
         }//buy
//====================================================
//Open Sell-------------------------------------------
       if(MACD1[i] < min_MACD*(-1)
       && MACD2[i] < min_MACD*(-1)
       && MACD3[i] > min_MACD*(-1))
         {//sell
         SellTg[i+1] = High[i+1] - WayDown + spread*Point;
         BufferDn[i+1] = High[i+1]+st*Point;
         }//sell
//====================================================
   }//limit
//---- done
return(0);}
//+---------------------------------------------------------------------+

 
Artemij:

Добрый День. 




Пишу торговую систему, которая, в частности, использует MACD. Условия вывода значений в буфер одинаковые (зеркальные) для лонга и для шорта.
НО!
При индикации шорта всё работает как я задумал, а вот на лонге -- полный бардак! Стрелки рисуются на нескольких барах, хотя условие входа выполняется только для одного. Используется три значения MACD: i+1, i+2, i+3. 1 и 2 должны быть больше (на лонге) определённой величины, 3-й  -- меньше. На шорте -- наоборот. 

Подскажите, пожалуйста, почему стрелки плодятся вообще, и на лонге - в особенности???  !!! При том, что в шорте -- всё как надо.

Из-за опечатки:

MACD3[1] < min_MACD

Должно быть:

MACD3[i] < min_MACD
 
Ihor Herasko:

Из-за опечатки:

Должно быть:

АФФФФФФФИГЕТЬ!!!!!!
БОЛЬШОЕ СПАСИБО!
ВОТ, ЧТО ЗНАЧИТ -- СВЕЖИЙ, НЕЗАМЫЛЕННЫЙ ВЗГЛЯД)))))))))))))))))

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