Unproper creation of support and resistance lines

 

Hi everybody,

I've created robot which shall draw trendlines based on two closest fractals. If new fractal is true lines shall be redrawed. Unfortunately tester shows that just the closest fractal is taken into consideration the second fractal is as initial one and unchanged during whole test. Therefore after while I have wrong trendlines.


Will appreciate your comments.

input color Resistance_Color=Blue;
input ENUM_LINE_STYLE Resistance_Style;
input int Resistance_Width=1;
input color Support_Color=Red;
input ENUM_LINE_STYLE Support_Style;
input int Support_Width=1;

//--- хендл  индикатора iFractals 
int Fractal;

datetime UpTime_1[], UpTime_2[], LowTime_1[], LowTime_2[];
double FractalDown[],FractalUp[];


bool NewBar()
  {
   static datetime time;   
   datetime newTime[1];        

   bool flag=false;

   int timecount=CopyTime(_Symbol,_Period,0,1,newTime);

   if(timecount>0) 
     {

      if(time!=newTime[0]) 
        {
         if(time!=0) 
            flag=true;

         time=newTime[0];      
        }
     }
   return (flag);

  }


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- получаем хендл индикатора iFractals
   Fractal=iFractals(Symbol(),_Period);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete(0,"Resistance");
   ObjectDelete(0,"Support");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//  удаляем все линии и очищаем массивы при появлении нового бара
if(NewBar())
{  
if (ObjectFind(0,"Support"))
ObjectDelete(0,"Support");
  
if (ObjectFind(0,"Resistance"))
ObjectDelete(0,"Resistance");

ArrayFree(UpTime_1);
ArrayFree(UpTime_2);
ArrayFree(LowTime_1);
ArrayFree(LowTime_2);
ArrayFree(FractalDown);
ArrayFree(FractalUp);


}

//--- объявление переменных
   int n,UpIndFractal_1,UpIndFractal_2,LowIndFractal_1,LowIndFractal_2;
//--- объявление массивов для записи значений буферов индикатора iFractal
  // double FractalDown[],FractalUp[];
   double UpFractal_1,UpFractal_2,LowFractal_1,LowFractal_2;
//--- сначала нужно записать в массивы значения буферов индиктора Fractal
//--- заполнение данными буфера
   CopyBuffer(Fractal,0,0,Bars(Symbol(),_Period),FractalUp);
   CopyBuffer(Fractal,1,0,Bars(Symbol(),_Period),FractalDown);
//--- индексация как в таймсериях
   ArraySetAsSeries(FractalUp,true);
   ArraySetAsSeries(FractalDown,true);
   
   
//Поиск и запись первых двух фракталов
   
//--- далее используем оператор цикла for для поиска первого верхнего фрактала
   for(n=0; n<Bars(Symbol(),_Period); n++)
     {
      //--- если непустое значение, прерываем цикл
      if(FractalUp[n]!=EMPTY_VALUE)
         break;
     }
//--- запишем ценовое значение первого фрактала в переменную
   UpFractal_1=FractalUp[n];
//--- запишем индекс первого фрактала в переменную
   UpIndFractal_1=n;
//--- поиск второго верхнего фрактала 
   for(n=UpIndFractal_1+1; n<Bars(Symbol(),_Period); n++)
     {
      if(FractalUp[n]!=EMPTY_VALUE) //если непустое значение, прерываем цикл
         break;
     }
//--- запишем ценовое значение первого фрактала в переменную
   UpFractal_2=FractalUp[n];
//--- запишем индекс первого фрактала в переменную
   UpIndFractal_2=n;
//--- поиск значений нижних фракталов
//--- поиск первого нижнего фрактала
   for(n=0; n<Bars(Symbol(),_Period); n++)
     {
      //--- если непустое значение, прерываем цикл
      if(FractalDown[n]!=EMPTY_VALUE)
         break;
     }
//--- запишем ценовое значение первого фрактала в переменную
   LowFractal_1=FractalDown[n];
//--- запишем индекс первого фрактала в переменную
   LowIndFractal_1=n;
//--- поиск второго нижнего фрактала 
   for(n=LowIndFractal_1+1; n<Bars(Symbol(),_Period); n++)
     {
      if(FractalDown[n]!=EMPTY_VALUE)
         break;
     }
//--- запишем ценовое значение второго фрактала в переменную
   LowFractal_2=FractalDown[n];
//--- запишем индекс второго фрактала в переменную
   LowIndFractal_2=n;


//Получаем время для экстремумов
//datetime UpTime_1[], UpTime_2[], LowTime_1[], LowTime_2[];

CopyTime(_Symbol,_Period,UpIndFractal_1,1,UpTime_1);
CopyTime(_Symbol,_Period,UpIndFractal_2,1,UpTime_2);
CopyTime(_Symbol,_Period,LowIndFractal_1,1,LowTime_1);
CopyTime(_Symbol,_Period,LowIndFractal_2,1,LowTime_2);


// Создаем линию поддержки
ObjectCreate(0,"Support",OBJ_TREND,0,LowTime_2[0],LowFractal_2,LowTime_1[0],LowFractal_1);
ObjectSetInteger(0,"Support",OBJPROP_RAY_RIGHT,true);
ObjectSetInteger(0,"Support",OBJPROP_COLOR,Support_Color);
ObjectSetInteger(0,"Support",OBJPROP_STYLE,Support_Style);
ObjectSetInteger(0,"Support",OBJPROP_WIDTH,Support_Width);

// Создаем лини сопротивления
ObjectCreate(0,"Resistance",OBJ_TREND,0,UpTime_2[0],UpFractal_2,UpTime_1[0],UpFractal_1);
ObjectSetInteger(0,"Resistance",OBJPROP_RAY_RIGHT,true);
ObjectSetInteger(0,"Resistance",OBJPROP_COLOR,Resistance_Color);
ObjectSetInteger(0,"Resistance",OBJPROP_STYLE,Resistance_Style);
ObjectSetInteger(0,"Resistance",OBJPROP_WIDTH,Resistance_Width);


  }
 
MaksGroup: I've created robot which shall draw trendlines based on two closest fractals. If new fractal is true lines shall be redrawed.
You create one trendline for support and one for resistance. No where do you create the second. No where do you delete the old ones.
 
whroeder1:
You create one trendline for support and one for resistance. No where do you create the second. No where do you delete the old ones.


There is deletion of all existing lines if New Bar is true. Please see first lines of OnTick () function.


void OnTick()
  {
//  удаляем все линии и очищаем массивы при появлении нового бара
if(NewBar())
{  
if (ObjectFind(0,"Support"))
ObjectDelete(0,"Support");
  
if (ObjectFind(0,"Resistance"))
ObjectDelete(0,"Resistance");

ArrayFree(UpTime_1);
ArrayFree(UpTime_2);
ArrayFree(LowTime_1);
ArrayFree(LowTime_2);
ArrayFree(FractalDown);
ArrayFree(FractalUp);


}
Reason: