Глючит индикатор

 

Приветствую! Пишу индикатор по такому простому ТЗ:

Индикатор. Устанавливает метки(точки разным цветом для верхнего и нижнего) только вместо и в месте пропавших фракталов штатного индикатора.

Некоторые объекты то удаляются то нет, в чем может быть причина?  Точка должна быть только на месте пропавшего фрактала. Может быть возможно реализовать как то иначе?

 

#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_width1 2
#property indicator_color2 Blue
#property indicator_width2 2
//---- buffers
double up[];
double dn[];

datetime t=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,217);
   SetIndexBuffer(0,up);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,218);
   SetIndexBuffer(1,dn);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutArrow(string name,double price,int code,color clr)
  {
   ObjectCreate(0,name,OBJ_ARROW,0,Time[2],price);
//--- установим код стрелки
   ObjectSetInteger(0,name,OBJPROP_ARROWCODE,code);
//--- установим цвет стрелки
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- установим размер стрелки
   ObjectSetInteger(0,name,OBJPROP_WIDTH,2);
  }
//+------------------------------------------------------------------+
//| 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(int i=2;i<555;i++)
     {
      up[i]=iFractals(NULL,0,MODE_UPPER,i);
      dn[i]=iFractals(NULL,0,MODE_LOWER,i);
     }

   double upf=iFractals(NULL,0,MODE_UPPER,2);
   double dnf=iFractals(NULL,0,MODE_LOWER,2);
   if(upf!=0) PutArrow("UP"+(string)time[0],high[2],108,Blue);
   if(dnf!=0) PutArrow("DN"+(string)time[0],low[2],108,Red);

   if(t!=time[0])
     {
      if(low[3]<low[2] && low[3]<low[1] && low[3]<low[4] && low[3]<low[5]) ObjectDelete(0,ObjectName(ObjectsTotal()-1));
      if(high[3]>high[2] && high[3]>high[1] && high[3]>high[4] && high[3]>high[5]) ObjectDelete(0,ObjectName(ObjectsTotal()-1));
      t=time[0];
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+
 
AM2:   Индикатор. Устанавливает метки (точки разным цветом для верхнего и нижнего)  .... реализовать как то иначе?

А ларчик просто открывался... через буфер индикатора. Надо удалить точку --> Буфер2[i] =NULL

 
LRA:

А ларчик просто открывался... через буфер индикатора. Надо удалить точку --> Буфер2[i] =NULL

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

 

//---- buffers
double up[];
double dn[];
double upp[];
double dnp[];

datetime t=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,up);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,217);

   SetIndexBuffer(1,dn);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,218);

   SetIndexBuffer(2,upp);
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexArrow(2,108);

   SetIndexBuffer(3,dnp);
   SetIndexStyle(3,DRAW_ARROW);
   SetIndexArrow(3,108);

//---
   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(int i=2;i<555;i++)
     {
      up[i]=iFractals(NULL,0,MODE_UPPER,i);
      dn[i]=iFractals(NULL,0,MODE_LOWER,i);
      upp[i]=iFractals(NULL,0,MODE_UPPER,i);
      dnp[i]=iFractals(NULL,0,MODE_LOWER,i);
     }
 
AM2:     Если я сделаю таким образом, то точка будет пропадать вместе с фракталом, а нужно чтобы она оставалась.

Вы правильно поняли задания? Вот ссылка. Рисунок слева: появился знак фрактала. Но цена пробила фрактал, и знак исчез.

В этом месте в момент исчезновения знака фрактала и надо нарисовать точку.

 
AM2:

Приветствую! Пишу индикатор по такому простому ТЗ:

Индикатор. Устанавливает метки(точки разным цветом для верхнего и нижнего) только вместо и в месте пропавших фракталов штатного индикатора.

Некоторые объекты то удаляются то нет, в чем может быть причина?  Точка должна быть только на месте пропавшего фрактала. Может быть возможно реализовать как то иначе?

 

 

А зачем тебе штатный индикатор фракталов? Ведь у тебя задача проста как арифметика 3го класса. Всего лишь 2 условия

if(High[i+2] > High[i+3] && High[i+2] > High[i+4] && High[i+2] > High[i+1] && High[i+2] > Open[i] && High[i+2] < High[i])
 up[i+2] = High[i+2];
  else up[i+2] = 0; // или EMPTY_VALUE
if(Low[i+2] < Low[i+3] && Low[i+2] < Low[i+4] && Low[i+2] < Low[i+1] && Low[i+2] < Open[i] && Low[i+2] > Low[i])
 dn[i+2] = Low[i+2];
  else DN[i+2] = 0; // или EMPTY_VALUE

И зачем точки рисовать объектами??? Можно ведь выбрать какую-то звёздочку, точку или ещё чего-то, хоть бомбочку.

SetIndexArrow(0, 77);
 
LRA:

Вот в этом месте в момент исчезновения знака фрактала и надо нарисовать точку.

 

 

AlexeyVik:

А зачем тебе штатный индикатор фракталов? Ведь у тебя задача проста как арифметика 3го класса. Всего лишь 2 условия

И зачем точки рисовать объектами??? Можно ведь выбрать какую-то звёздочку, точку или ещё чего-то, хоть бомбочку.

if(High[i+2] > High[i+3] && High[i+2] > High[i+4] && High[i+2] > High[i+1] && High[i+2] > Open[i])
 up[i+2] = High[i+2];
if(Low[i+2] < Low[i+3] && Low[i+2] < Low[i+4] && Low[i+2] < Low[i+1] && Low[i+2] < Open[i])
 dn[i+2] = Low[i+2];

Благодарствую. Сделал с помощью подсказок )

 

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