Нужна помощь по графике (не могу построить медиану правельно)

 

Помогите, если не сложно поставить правильно медиану

должно быть так


а вот что у меня получается


Вот внешняя функция медианы

void DrawMedianLine()
{
    if (!Show_Medianline)
    {
        ObjectDelete(0, "MedianLine");
        return;
    }
    
    if (!Show_Trendlines)
    {
        ObjectDelete(0, "MedianLine");
        return;
    }
    
    // Получаем верхнюю диагональ
    string upperDiagName = "ZZ_TL_UpperDiag";
    string lowerDiagName = "ZZ_TL_LowerDiag";
    
    // Проверяем, существуют ли диагонали
    if(ObjectFind(0, upperDiagName) < 0 || ObjectFind(0, lowerDiagName) < 0)
    {
        Print("Диагонали не найдены");
        return;
    }
    
    // Получаем точки верхней диагонали
    datetime upperTime1 = (datetime)ObjectGetInteger(0, upperDiagName, OBJPROP_TIME, 0);
    double upperPrice1 = ObjectGetDouble(0, upperDiagName, OBJPROP_PRICE, 0);
    datetime upperTime2 = (datetime)ObjectGetInteger(0, upperDiagName, OBJPROP_TIME, 1);
    double upperPrice2 = ObjectGetDouble(0, upperDiagName, OBJPROP_PRICE, 1);
    
    // Получаем точки нижней диагонали
    datetime lowerTime1 = (datetime)ObjectGetInteger(0, lowerDiagName, OBJPROP_TIME, 0);
    double lowerPrice1 = ObjectGetDouble(0, lowerDiagName, OBJPROP_PRICE, 0);
    datetime lowerTime2 = (datetime)ObjectGetInteger(0, lowerDiagName, OBJPROP_TIME, 1);
    double lowerPrice2 = ObjectGetDouble(0, lowerDiagName, OBJPROP_PRICE, 1);
    
    // Вычисляем коэффициенты верхней диагонали
    double k_upper = (upperPrice2 - upperPrice1) / (double)(upperTime2 - upperTime1);
    double b_upper = upperPrice1 - k_upper * (double)upperTime1;
    
    // Вычисляем коэффициенты нижней диагонали
    double k_lower = (lowerPrice2 - lowerPrice1) / (double)(lowerTime2 - lowerTime1);
    double b_lower = lowerPrice1 - k_lower * (double)lowerTime1;
    
    // НАХОДИМ ПОСЛЕДНИЙ МИНИМУМ - ЭТО СИНИЙ КВАДРАТ
    datetime lastMinTime = 0;
    double lastMinPrice = 0;
    
    // Ищем в буферах Low (синие квадраты на минимумах)
    for(int i = 0; i < 500; i++)
    {
        if(LowBuffer1[i] != 0 && LowBuffer1[i] != EMPTY_VALUE)
        {
            lastMinTime = iTime(_Symbol, _Period, i);
            lastMinPrice = LowBuffer1[i];
            break;
        }
    }
    
    if(lastMinTime == 0)
    {
        for(int i = 0; i < 500; i++)
        {
            if(LowBuffer2[i] != 0 && LowBuffer2[i] != EMPTY_VALUE)
            {
                lastMinTime = iTime(_Symbol, _Period, i);
                lastMinPrice = LowBuffer2[i];
                break;
            }
        }
    }
    
    if(lastMinTime == 0)
    {
        for(int i = 0; i < 500; i++)
        {
            if(LowBuffer3[i] != 0 && LowBuffer3[i] != EMPTY_VALUE)
            {
                lastMinTime = iTime(_Symbol, _Period, i);
                lastMinPrice = LowBuffer3[i];
                break;
            }
        }
    }
    
    if(lastMinTime == 0)
    {
        Print("Не найден синий квадрат (последний минимум)");
        return;
    }
    
    // НАЧАЛЬНАЯ ТОЧКА - СИНИЙ КВАДРАТ
    datetime startTime = lastMinTime;
    
    // Вычисляем цены на диагоналях в точке старта
    double upperPriceAtStart = k_upper * (double)startTime + b_upper;
    double lowerPriceAtStart = k_lower * (double)startTime + b_lower;
    
    // Медианная цена в точке старта
    double startPrice = (upperPriceAtStart + lowerPriceAtStart) * 0.5;
    midpoint = startPrice;
    
    // Конечная точка - продолжаем в будущее
    datetime endTime = TimeCurrent() + PeriodSeconds(_Period) * 100;
    
    // Вычисляем цены на диагоналях в конечной точке
    double upperPriceAtEnd = k_upper * (double)endTime + b_upper;
    double lowerPriceAtEnd = k_lower * (double)endTime + b_lower;
    
    // Медианная цена в конечной точке
    double endPrice = (upperPriceAtEnd + lowerPriceAtEnd) * 0.5;
    
    Print("=== DrawMedianLine (начало в СИНЕМ КВАДРАТЕ) ===");
    Print("СИНИЙ КВАДРАТ: ", TimeToString(startTime), " цена минимума: ", DoubleToString(lastMinPrice, _Digits));
    Print("  Медиана в этой точке: ", DoubleToString(startPrice, _Digits));
    
    string medianName = "MedianLine";
    ObjectDelete(0, medianName);
    
    // СОЗДАЕМ НАКЛОННУЮ ЛИНИЮ ОТ СИНЕГО КВАДРАТА
    if (ObjectCreate(0, medianName, OBJ_TREND, 0, startTime, startPrice, endTime, endPrice))
    {
        ObjectSetInteger(0, medianName, OBJPROP_COLOR, myMedianLineColor);
        ObjectSetInteger(0, medianName, OBJPROP_STYLE, myMedianLineStyle);
        ObjectSetInteger(0, medianName, OBJPROP_WIDTH, myMedianLineWidth);
        ObjectSetInteger(0, medianName, OBJPROP_RAY_RIGHT, true);
        ObjectSetInteger(0, medianName, OBJPROP_BACK, true);
        ObjectSetInteger(0, medianName, OBJPROP_SELECTABLE, false);
        
        Print("✓ Медианная линия создана от СИНЕГО КВАДРАТА");
    }
    else
    {
        Print("✗ Ошибка создания линии: ", GetLastError());
    }
}

Если нужно построение трендовых, то вот 

string upperDiagName = "ZZ_TL_UpperDiag";
   CreateTrendLine(upperDiagName, upperTimes[0], upperPrices[0], upperTimes[1], upperPrices[1],
                  myUpperTrendLineColor, myUpperTrendLineStyle, myUpperTrendLineWidth);

и   

string lowerDiagName = "ZZ_TL_LowerDiag";
   CreateTrendLine(lowerDiagName, lowerTimes[0], lowerPrices[0], lowerTimes[1], lowerPrices[1],
                  myLowerTrendLineColor, myLowerTrendLineStyle, myLowerTrendLineWidth);
 

Всё добил я эту проблему).