нужна помощь по графике

 

Здравствуйте. Нужна Ваша помощь по графике в mql5. Дело в том, что я не могу поставить два луча в индикаторе с лева на право(из истории в будущее).                                                                                        Что у меня получается


А нужно, что бы вот это получилось


Проблема в том что если я исправляю на диагонали, то у меня получаются они в линии место лучей. Если получаются учи, то они уходят в будущее не так как я хотел.

Вот код этого флага

//+------------------------------------------------------------------+
//| Функция для отображения трендовых лучей 3 (диагональные лучи + горизонтальные)|
//+------------------------------------------------------------------+
void DrawTrendLines3()
{
   if(!Show_TrendLines3) 
   {
      CleanObjectsByType("ZZ_TL3_");
      return;
   }
   
   Print("=== DrawTrendLines3 started ===");
   
   // Получаем экстремумы ZigZag
   double zzHighValues[], zzLowValues[];
   datetime zzHighTimes[], zzLowTimes[];
   ArrayResize(zzHighValues, 0);
   ArrayResize(zzHighTimes, 0);
   ArrayResize(zzLowValues, 0);
   ArrayResize(zzLowTimes, 0);
   
   // Собираем экстремумы
   for(int i = Bars(_Symbol, _Period) - 1; i >= 0; i--)
   {
      if(HighBuffer3[i] != 0 && HighBuffer3[i] != EMPTY_VALUE)
      {
         int size = ArraySize(zzHighValues);
         ArrayResize(zzHighValues, size + 1);
         ArrayResize(zzHighTimes, size + 1);
         zzHighValues[size] = HighBuffer3[i];
         zzHighTimes[size] = iTime(_Symbol, _Period, i);
      }
      
      if(LowBuffer3[i] != 0 && LowBuffer3[i] != EMPTY_VALUE)
      {
         int size = ArraySize(zzLowValues);
         ArrayResize(zzLowValues, size + 1);
         ArrayResize(zzLowTimes, size + 1);
         zzLowValues[size] = LowBuffer3[i];
         zzLowTimes[size] = iTime(_Symbol, _Period, i);
      }
   }
   
   if(ArraySize(zzHighValues) < 2 || ArraySize(zzLowValues) < 2) 
   {
      Print("Недостаточно точек ZigZag3");
      return;
   }
   
   // Сортируем по времени
   SortExtremumsByTime(zzHighTimes, zzHighValues);
   SortExtremumsByTime(zzLowTimes, zzLowValues);
   
   // Удаляем старые линии
   CleanObjectsByType("ZZ_TL3_");
   
   datetime currentTime = TimeCurrent();
   
   // 1. Верхний диагональный ЛУЧ - через два последних максимума
   if(ArraySize(zzHighValues) >= 2)
   {
      string upperRayName = "ZZ_TL3_UpperRay";
      
      // Берем два последних максимума
      int lastIndex = ArraySize(zzHighValues) - 1;
      int prevIndex = lastIndex - 1;
      
      // Создаем луч от предпоследнего максимума через последний максимум
      if(ObjectCreate(0, upperRayName, OBJ_TREND, 0, zzHighTimes[prevIndex], zzHighValues[prevIndex], 
                     zzHighTimes[lastIndex], zzHighValues[lastIndex]))
      {
         ObjectSetInteger(0, upperRayName, OBJPROP_COLOR, myUpperTrendLine3Color);
         ObjectSetInteger(0, upperRayName, OBJPROP_STYLE, myUpperTrendLine3Style);
         ObjectSetInteger(0, upperRayName, OBJPROP_WIDTH, myUpperTrendLine3Width);
         ObjectSetInteger(0, upperRayName, OBJPROP_RAY_RIGHT, true);  // Луч продолжается вправо
         ObjectSetInteger(0, upperRayName, OBJPROP_BACK, false);
      }
   }
   
   // 2. Нижний диагональный ЛУЧ - через два последних минимума
   if(ArraySize(zzLowValues) >= 2)
   {
      string lowerRayName = "ZZ_TL3_LowerRay";
      
      // Берем два последних минимума
      int lastIndex = ArraySize(zzLowValues) - 1;
      int prevIndex = lastIndex - 1;
      
      // Создаем луч от предпоследнего минимума через последний минимум
      if(ObjectCreate(0, lowerRayName, OBJ_TREND, 0, zzLowTimes[prevIndex], zzLowValues[prevIndex], 
                     zzLowTimes[lastIndex], zzLowValues[lastIndex]))
      {
         ObjectSetInteger(0, lowerRayName, OBJPROP_COLOR, myLowerTrendLine3Color);
         ObjectSetInteger(0, lowerRayName, OBJPROP_STYLE, myLowerTrendLine3Style);
         ObjectSetInteger(0, lowerRayName, OBJPROP_WIDTH, myLowerTrendLine3Width);
         ObjectSetInteger(0, lowerRayName, OBJPROP_RAY_RIGHT, true);  // Луч продолжается вправо
         ObjectSetInteger(0, lowerRayName, OBJPROP_BACK, false);
      }
   }
   
   // 3. Верхняя горизонтальная линия - по последнему максимуму
   double lastHigh = zzHighValues[ArraySize(zzHighValues)-1];
   datetime lastHighTime = zzHighTimes[ArraySize(zzHighTimes)-1];
   string upperHorizName = "ZZ_TL3_UpperHoriz";
   
   if(ObjectCreate(0, upperHorizName, OBJ_TREND, 0, lastHighTime, lastHigh, currentTime, lastHigh))
   {
      ObjectSetInteger(0, upperHorizName, OBJPROP_COLOR, myUpperTrendLine3Color);
      ObjectSetInteger(0, upperHorizName, OBJPROP_STYLE, myUpperTrendLine3Style);
      ObjectSetInteger(0, upperHorizName, OBJPROP_WIDTH, myUpperTrendLine3Width);
      ObjectSetInteger(0, upperHorizName, OBJPROP_RAY_RIGHT, true);
      ObjectSetInteger(0, upperHorizName, OBJPROP_BACK, false);
   }
   
   // 4. Нижняя горизонтальная линия - по последнему минимуму
   double lastLow = zzLowValues[ArraySize(zzLowValues)-1];
   datetime lastLowTime = zzLowTimes[ArraySize(zzLowTimes)-1];
   string lowerHorizName = "ZZ_TL3_LowerHoriz";
   
   if(ObjectCreate(0, lowerHorizName, OBJ_TREND, 0, lastLowTime, lastLow, currentTime, lastLow))
   {
      ObjectSetInteger(0, lowerHorizName, OBJPROP_COLOR, myLowerTrendLine3Color);
      ObjectSetInteger(0, lowerHorizName, OBJPROP_STYLE, myLowerTrendLine3Style);
      ObjectSetInteger(0, lowerHorizName, OBJPROP_WIDTH, myLowerTrendLine3Width);
      ObjectSetInteger(0, lowerHorizName, OBJPROP_RAY_RIGHT, true);
      ObjectSetInteger(0, lowerHorizName, OBJPROP_BACK, false);
   }
   
   Print("Трендовые лучи 3 построены: 2 диагональных луча + 2 горизонтальные линии");
   Print("Верхний луч: от ", TimeToString(zzHighTimes[ArraySize(zzHighTimes)-2]), "(", 
         DoubleToString(zzHighValues[ArraySize(zzHighValues)-2], digits), ") к ", 
         TimeToString(zzHighTimes[ArraySize(zzHighTimes)-1]), "(", 
         DoubleToString(zzHighValues[ArraySize(zzHighValues)-1], digits), ")");
   Print("Нижний луч: от ", TimeToString(zzLowTimes[ArraySize(zzLowTimes)-2]), "(", 
         DoubleToString(zzLowValues[ArraySize(zzLowValues)-2], digits), ") к ", 
         TimeToString(zzLowTimes[ArraySize(zzLowTimes)-1]), "(", 
         DoubleToString(zzLowValues[ArraySize(zzLowValues)-1], digits), ")");
}

//+------------------------------------------------------------------+
//| Функция сортировки экстремумов по времени                        |
//+------------------------------------------------------------------+
void SortExtremumsByTime(datetime &times[], double &values[])
{
   int size = ArraySize(times);
   for(int i = 0; i < size - 1; i++)
   {
      for(int j = i + 1; j < size; j++)
      {
         if(times[i] > times[j])
         {
            // Меняем местами времена
            datetime tempTime = times[i];
            times[i] = times[j];
            times[j] = tempTime;
            
            // Меняем местами значения
            double tempValue = values[i];
            values[i] = values[j];
            values[j] = tempValue;
         }
      }
   }
}
 
Igor Nagorniuk:

Здравствуйте. Нужна Ваша помощь по графике в mql5. Дело в том, что я не могу поставить два луча в индикаторе с лева на право(из истории в будущее).  

А нужно, что бы вот это получилось

Вот код этого флага

Скорее всего проблема с нахождением точек.

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

-----------

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

   // Собираем экстремумы
   for(int i = Bars(_Symbol, _Period) - 1; i >= 0; i--)
   {
      if(HighBuffer3[i] != 0 && HighBuffer3[i] != EMPTY_VALUE)
      {
         int size = ArraySize(zzHighValues);
         ArrayResize(zzHighValues, size + 1);
         ArrayResize(zzHighTimes, size + 1);
         zzHighValues[size] = HighBuffer3[i];
         zzHighTimes[size] = iTime(_Symbol, _Period, i);
      }
      


Не проще ли идти от i=0 до Bars()? Первые два и будут крайними.

 
Igor Nagorniuk:

Здравствуйте. Нужна Ваша помощь по графике в mql5. Дело в том, что я не могу поставить два луча в индикаторе с лева на право(из истории в будущее).                                                                                        Что у меня получается


А нужно, что бы вот это получилось


Проблема в том что если я исправляю на диагонали, то у меня получаются они в линии место лучей. Если получаются учи, то они уходят в будущее не так как я хотел.

Вот код этого флага

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

и распечатайте  полученные массивы цена-время. Больше печатайте, будет что почитать. Сортировка пузырьком у вас довольно странно написана :-)

 
Maxim Kuznetsov #:

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

и распечатайте  полученные массивы цена-время. Больше печатайте, будет что почитать. Сортировка пузырьком у вас довольно странно написана :-)

У меня там три зигзага с параметрами

input int    Period1            = 12;
input int    Period2            = 24;
input int    Period3            = 36;