Неправильно работает прорисовка трендовых линий в тестере

 

Добрый день.

Написал в теле советника прорисовку трендовых линий по последним двум барам.

Беда в том, что на тестере при перерисовке линий точки на старшем фрактале всегда остаются прежними, то есть не меняются. Соответственно прорисовка тренда является не корректной через определенное время.

Буду благодарен за комментарии.

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:

Написал в теле советника прорисовку трендовых линий по последним двум барам.

Беда в том, что на тестере при перерисовке линий точки на старшем фрактале всегда остаются прежними, то есть не меняются. Соответственно прорисовка тренда является не корректной через определенное время.

Сформулируйте вопрос конкретнее. Что именно находится или рисуется неправильно?
 
Andrey Khatimlianskii:
Сформулируйте вопрос конкретнее. Что именно находится или рисуется неправильно?
Добрый день. Изначально находим точки по которым будем рисовать линию: точка1(соответствует более приближенному к нулевому бару) и точка 2 (более дальний бар). В алгоритме заложил удаление объектов если появился новый бар и новый поиск точек прорисовки и соответственно создание новых линий. При тестировании точка 1 меняется при появлении новых удовлетворяющих условиях, но точка 2 всегда (даже через 200-300 новых баров) остаётся неизменной, а должна также меняться. 
 
MaksGroup:
Добрый день. Изначально находим точки по которым будем рисовать линию: точка1(соответствует более приближенному к нулевому бару) и точка 2 (более дальний бар). В алгоритме заложил удаление объектов если появился новый бар и новый поиск точек прорисовки и соответственно создание новых линий. При тестировании точка 1 меняется при появлении новых удовлетворяющих условиях, но точка 2 всегда (даже через 200-300 новых баров) остаётся неизменной, а должна также меняться. 

У вас не срабатывал вход в NewBar, из-за этого не было удаления и создания объектов.

Добавление строчек с указанием новых координат решает проблему:

// Создаем линию поддержки
ObjectCreate(0,"Support",OBJ_TREND,0,LowTime_2[0],LowFractal_2,LowTime_1[0],LowFractal_1);
ObjectMove( 0, "Support", 0, LowTime_2[0],LowFractal_2 );
ObjectMove( 0, "Support", 1, 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);
ObjectMove( 0, "Resistance", 0, UpTime_2[0],UpFractal_2 );
ObjectMove( 0, "Resistance", 1, 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:

Добрый день.

Написал в теле советника прорисовку трендовых линий по последним двум барам.

Беда в том, что на тестере при перерисовке линий точки на старшем фрактале всегда остаются прежними, то есть не меняются. Соответственно прорисовка тренда является не корректной через определенное время.

Буду благодарен за комментарии.

фракталы не перерисоваются начиная с 3-го бара. То есть цикл поиска фрактала начиная с бара n=0 в большинстве случаев поймает "незавершённый" фрактал и линия тренда построенная по нему будет некорректной
 
Andrey Khatimlianskii:

У вас не срабатывал вход в NewBar, из-за этого не было удаления и создания объектов.

Добавление строчек с указанием новых координат решает проблему:

Но вообще, вам, конечно, стоит подумать об оптимизации всего кода.

Спасибо. Буду пробовать код. Только пишу первые программы, потому выходит ещё не идеально

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