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

 

Помогите пожалуйста поставить отрезок на нужное место

нужно вот так

у меня выходит вот так

зелёную линию (под цифрой 1) поставить так, чтобы она начиналась с нижнего  разворотного  экстремума (зелёный круг), и проходил через следующий нижний экстремум (голубой круг)

вот код всей внешней функции

void DrawTrendLines()
{
   if(!Show_Trendlines) 
   {
      CleanObjectsByType("ZZ_TL_");
      return;
   }
   
   Print("=== DrawTrendLines вызвана ===");
   
   // Ищем последние 2 максимума и 2 минимума с приоритетом FP>NP>HP
   int maxFound = 0, minFound = 0;
   datetime upperTimes[2] = {0, 0};
   datetime lowerTimes[2] = {0, 0};
   double upperPrices[2] = {0.0, 0.0};
   double lowerPrices[2] = {0.0, 0.0};
   
   int total_bars = Bars(_Symbol, _Period);
   
   // Проходим от новых к старым барам
   for(int i = 0; i < total_bars && i < 1000; i++) // Ограничиваем поиск 1000 барами
   {
      // Ищем максимумы (сопротивление)
      if(maxFound < 2)
      {
         // 1. Сначала проверяем Buffer1 (FP - самый высокий приоритет)
         if(HighBuffer1[i] != 0 && HighBuffer1[i] != EMPTY_VALUE)
         {
            upperTimes[maxFound] = iTime(_Symbol, _Period, i);
            upperPrices[maxFound] = HighBuffer1[i];
            maxFound++;
         }
         // 2. Затем проверяем Buffer2 (NP - средний приоритет)
         else if(HighBuffer2[i] != 0 && HighBuffer2[i] != EMPTY_VALUE)
         {
            upperTimes[maxFound] = iTime(_Symbol, _Period, i);
            upperPrices[maxFound] = HighBuffer2[i];
            maxFound++;
         }
         // 3. В последнюю очередь проверяем Buffer3 (HP - низкий приоритет)
         else if(HighBuffer3[i] != 0 && HighBuffer3[i] != EMPTY_VALUE)
         {
            upperTimes[maxFound] = iTime(_Symbol, _Period, i);
            upperPrices[maxFound] = HighBuffer3[i];
            maxFound++;
         }
      }
      
      // Ищем минимумы (поддержка)
      if(minFound < 2)
      {
         // 1. Сначала проверяем Buffer1 (FP - самый высокий приоритет)
         if(LowBuffer1[i] != 0 && LowBuffer1[i] != EMPTY_VALUE)
         {
            lowerTimes[minFound] = iTime(_Symbol, _Period, i);
            lowerPrices[minFound] = LowBuffer1[i];
            minFound++;
         }
         // 2. Затем проверяем Buffer2 (NP - средний приоритет)
         else if(LowBuffer2[i] != 0 && LowBuffer2[i] != EMPTY_VALUE)
         {
            lowerTimes[minFound] = iTime(_Symbol, _Period, i);
            lowerPrices[minFound] = LowBuffer2[i];
            minFound++;
         }

         // 3. В последнюю очередь проверяем Buffer3 (HP - низкий приоритет)
         else if(LowBuffer3[i] != 0 && LowBuffer3[i] != EMPTY_VALUE)
         {
            lowerTimes[minFound] = iTime(_Symbol, _Period, i);
            lowerPrices[minFound] = LowBuffer3[i];
            minFound++;
         }
      }
      
      // Если нашли достаточно точек, выходим
      if(maxFound >= 2 && minFound >= 2)
         break;
   }
   
   Print("Найдено максимумов: ", maxFound, ", минимумов: ", minFound);
   
   // Проверяем наличие достаточного количества точек
   if(maxFound < 2 || minFound < 2)
   {
      Print("Недостаточно экстремумов для рисования трендовых линий");
      return;
   }
   
   // Упорядочиваем точки по времени (от старых к новым)
   if(upperTimes[0] > upperTimes[1])
   {
      datetime tempTime = upperTimes[0];
      double tempPrice = upperPrices[0];
      upperTimes[0] = upperTimes[1];
      upperPrices[0] = upperPrices[1];
      upperTimes[1] = tempTime;
      upperPrices[1] = tempPrice;
   }
   
   if(lowerTimes[0] > lowerTimes[1])
   {
      datetime tempTime = lowerTimes[0];
      double tempPrice = lowerPrices[0];
      lowerTimes[0] = lowerTimes[1];
      lowerPrices[0] = lowerPrices[1];
      lowerTimes[1] = tempTime;
      lowerPrices[1] = tempPrice;
   }
   
   // Теперь:
   // upperTimes[1] - новый верхний экстремум (синий круг)
   // lowerTimes[0] - старый нижний экстремум (желтый круг)
   
   // Получаем текущее время для горизонтальных линий
   datetime currentTime = TimeCurrent();
   
   // 1. КРАСНАЯ диагональная линия: от старого верхнего к новому верхнему
   string upperDiagName = "ZZ_TL_UpperDiag";
   CreateTrendLine(upperDiagName, upperTimes[0], upperPrices[0], upperTimes[1], upperPrices[1],
                  myUpperTrendLineColor, myUpperTrendLineStyle, myUpperTrendLineWidth);
   
   // 2. КРАСНАЯ горизонтальная линия: от последнего верхнего экстремума вправо
   string upperHorizName = "ZZ_TL_UpperHoriz";
   CreateTrendLine(upperHorizName, upperTimes[1], upperPrices[1], currentTime, upperPrices[1],
                  myUpperTrendLineColor, myUpperTrendLineStyle, myUpperTrendLineWidth);
   
   // 3. ЗЕЛЕНАЯ диагональная линия: от нового нижнего (зеленый круг) к новому верхнему (голубой круг)
string lowerDiagName = "ZZ_TL_LowerDiag";
CreateTrendLine(lowerDiagName, lowerTimes[1], lowerPrices[1], upperTimes[1], upperPrices[1],
               myLowerTrendLineColor, myLowerTrendLineStyle, myLowerTrendLineWidth);
               
   // 4. ЗЕЛЕНАЯ горизонтальная линия: от последнего нижнего экстремума вправо
   string lowerHorizName = "ZZ_TL_LowerHoriz";
   CreateTrendLine(lowerHorizName, lowerTimes[1], lowerPrices[1], currentTime, lowerPrices[1],
                  myLowerTrendLineColor, myLowerTrendLineStyle, myLowerTrendLineWidth);
   
   Print("Трендовые линии построены успешно");
   Print("Верхние точки (FP>NP>HP): ", TimeToString(upperTimes[0]), "(", DoubleToString(upperPrices[0], 5), 
         " приоритет: ", GetBufferPriority(upperPrices[0], upperTimes[0]), ") -> ", 
         TimeToString(upperTimes[1]), "(", DoubleToString(upperPrices[1], 5), 
         " приоритет: ", GetBufferPriority(upperPrices[1], upperTimes[1]), ")");
   Print("Нижние точки (FP>NP>HP): ", TimeToString(lowerTimes[0]), "(", DoubleToString(lowerPrices[0], 5),
         " приоритет: ", GetBufferPriority(lowerPrices[0], lowerTimes[0]), ") -> ", 
         TimeToString(lowerTimes[1]), "(", DoubleToString(lowerPrices[1], 5),
         " приоритет: ", GetBufferPriority(lowerPrices[1], lowerTimes[1]), ")");
}

Что, я не могу, это подправить  пункт №3, что бы отрезок располагалась правильно

// 3. ЗЕЛЕНАЯ диагональная линия: от нового нижнего (зеленый круг) к новому верхнему (голубой круг)
string lowerDiagName = "ZZ_TL_LowerDiag";
CreateTrendLine(lowerDiagName, lowerTimes[1], lowerPrices[1], upperTimes[1], upperPrices[1],
               myLowerTrendLineColor, myLowerTrendLineStyle, myLowerTrendLineWidth);
 
Igor Nagorniuk:

Помогите пожалуйста поставить отрезок на нужное место

нужно вот так

у меня выходит вот так

зелёную линию (под цифрой 1) поставить так, чтобы она начиналась с нижнего  разворотного  экстремума (зелёный круг), и проходил через следующий нижний экстремум (голубой круг)

вот код всей внешней функции

Что, я не могу, это подправить  пункт №3, что бы отрезок располагалась правильно

1) У вас в линии № 3 получился копипаст второй координаты с линии №1.

2) Видно, что "нижний фрактал", откуда сейчас исходит зеленая линия, как структурный паттерн найден верно. Просто добавьте в цикле проверку, чтобы lowerPrices зеленого кружка был ниже lowerPrices синего кружка - тогда цикл пойдет глубже в историю и найдет следующий правильный "нижний фрактал"

 
Vasiliy Pushkaryov #:

1) У вас в линии № 3 получился копипаст второй координаты с линии №1.

2) Видно, что "нижний фрактал", откуда сейчас исходит зеленая линия, как структурный паттерн найден верно. Просто добавьте в цикле проверку, чтобы lowerPrices зеленого кружка был ниже lowerPrices синего кружка - тогда цикл пойдет глубже в историю и найдет следующий правильный "нижний фрактал"

спасибо, буду пробовать.