Нужна помошь

 

Подскажите как можно сделать так, что бы, при смене тренда, в комментарии менялись параметры? Проблема вот в чём при смене тренда по фибо, в комментарии не меняются данные.

void CreateTrendLabel(string name, string text, int yOffset, color labelColor)
{
   if (ObjectFind(0, name) < 0)
   {
      if (!ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0))
         return;
      ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_LOWER);
      ObjectSetInteger(0, name, OBJPROP_XDISTANCE, 10);
      ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 10);
      ObjectSetInteger(0, name, OBJPROP_COLOR, labelColor);
      ObjectSetString(0, name, OBJPROP_FONT, "Arial");
      ObjectSetInteger(0, name, OBJPROP_BORDER_TYPE, BORDER_FLAT);
   }
   ObjectSetInteger(0, name, OBJPROP_YDISTANCE, yOffset);
   ObjectSetString(0, name, OBJPROP_TEXT, text);
}
//+------------------------------------------------------------------+
void DisplayTrendComment(bool isUpTrend, double highPrice, double lowPrice)
{
   string line1 = isUpTrend ? "Восходящий тренд" : "Нисходящий тренд";
   string line2 = "  Максимум: " + DoubleToString(highPrice, _Digits);
   string line3 = "  Минимум: " + DoubleToString(lowPrice, _Digits);

   color labelColor = isUpTrend ? clrGreen : clrRed;

   CreateTrendLabel(labelNames[0], "Тренд: " + line1, 50, labelColor);
   CreateTrendLabel(labelNames[1], line2, 65, labelColor);
   CreateTrendLabel(labelNames[2], line3, 80, labelColor);
}
//+------------------------------------------------------------------+
bool DetermineTrend(double highPrice, double lowPrice)
{
   return (highPrice > lowPrice);
}
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   // Проверка смены периода
   if (TrendPeriod != prevTrendPeriod)
   {
      prevTrendPeriod = TrendPeriod;
      ClearObjects();
   }

   int totalBars = iBars(_Symbol, TrendPeriod);
   if (totalBars < LookbackBars)
      return rates_total;

   // Получаем данные с TrendPeriod
   double highTF[], lowTF[], closeTF[];
   datetime timeTF[];

   if (!CopyHigh(_Symbol, TrendPeriod, 0, LookbackBars, highTF) ||
       !CopyLow(_Symbol, TrendPeriod, 0, LookbackBars, lowTF) ||
       !CopyClose(_Symbol, TrendPeriod, 0, LookbackBars, closeTF) ||
       !CopyTime(_Symbol, TrendPeriod, 0, LookbackBars, timeTF))
      return rates_total;

   int maxIndex = ArrayMaximum(highTF, 0, LookbackBars);
   int minIndex = ArrayMinimum(lowTF, 0, LookbackBars);
   double highPrice = highTF[maxIndex];
   double lowPrice = lowTF[minIndex];
   datetime highTime = timeTF[maxIndex];
   datetime lowTime = timeTF[minIndex];

   bool isUpTrend = DetermineTrend(highPrice, lowPrice);

   // Построение Фибо
   ObjectDelete(0, fiboObjectName);
   bool created = isUpTrend
      ? ObjectCreate(0, fiboObjectName, OBJ_FIBO, 0, lowTime, lowPrice, highTime, highPrice)
      : ObjectCreate(0, fiboObjectName, OBJ_FIBO, 0, highTime, highPrice, lowTime, lowPrice);

   if (!created)
      return rates_total;

   ObjectSetInteger(0, fiboObjectName, OBJPROP_RAY, false);
   ObjectSetInteger(0, fiboObjectName, OBJPROP_COLOR, FiboColor);
   ObjectSetInteger(0, fiboObjectName, OBJPROP_WIDTH, 2);
   ObjectSetInteger(0, fiboObjectName, OBJPROP_STYLE, STYLE_SOLID);

   int levelCount = 6 + (ShowExtensions ? 2 : 0);
   double levels[] = {0.0, 0.236, 0.382, 0.5, 0.618, 1.0, 1.618, 2.618};
   string levelTexts[] = {"0.0%", "23.6%", "38.2%", "50.0%", "61.8%", "100.0%", "161.8%", "261.8%"};

   for (int i = 0; i < levelCount; i++)
   {
      ObjectSetDouble(0, fiboObjectName, OBJPROP_LEVELVALUE, i, levels[i]);
      ObjectSetString(0, fiboObjectName, OBJPROP_LEVELTEXT, i, levelTexts[i]);
      ObjectSetInteger(0, fiboObjectName, OBJPROP_LEVELCOLOR, i, FiboColor);
      ObjectSetInteger(0, fiboObjectName, OBJPROP_LEVELSTYLE, i, STYLE_SOLID);
   }

   // Линия тренда
   if (ShowTrendLine)
   {
      ObjectDelete(0, "TrendLine");
      if (isUpTrend)
         ObjectCreate(0, "TrendLine", OBJ_TREND, 0, lowTime, lowPrice, highTime, highPrice);
      else
         ObjectCreate(0, "TrendLine", OBJ_TREND, 0, highTime, highPrice, lowTime, lowPrice);

      ObjectSetInteger(0, "TrendLine", OBJPROP_COLOR, FiboColor);
      ObjectSetInteger(0, "TrendLine", OBJPROP_WIDTH, 2);
   }

   // Алерты
   if (ShowAlerts && LookbackBars >= 2)
   {
      for (int i = 0; i < levelCount; i++)
      {
         double levelPrice = isUpTrend
            ? lowPrice + (highPrice - lowPrice) * levels[i]
            : highPrice - (highPrice - lowPrice) * levels[i];

         if (closeTF[0] > levelPrice && closeTF[1] <= levelPrice)
            Alert("Цена пересекла уровень ", levelTexts[i], " (", EnumToString(TrendPeriod), "): ", DoubleToString(levelPrice, _Digits));
      }
   }

   // Комментарий
   DisplayTrendComment(isUpTrend, highPrice, lowPrice);

   return rates_total;
}


 

Основную проблему я вижу в функции DetermineTrend. Цена максимума по определению будет больше цены минимума. Сравнивать нужно индексы:

bool DetermineTrend(int highIndex, int lowIndex)
{
   return (highIndex > lowIndex);
}

И, соответственно. поменять 

// Было: 
// bool isUpTrend = DetermineTrend(highPrice, lowPrice);

// Нужно:
bool isUpTrend = DetermineTrend(maxIndex, minIndex);

Ну, и вторая небольшая проблема (не связанная с вопросом) - "мерцание" элементов на каждом тике. Чтобы этого не было, лучше графические элементы не удалять, а перемещать с помощью функции ObjectMove. Ну, или как-нибудь так:

static int lastHighIndex = -1, lastLowIndex = -1;
if (highIndex != lastHighIndex || lowIndex != lastLowIndex) {
    // Перестраиваем Фибо только при смене экстремумов
    ObjectDelete(0, fiboObjectName);
    // ... создание нового объекта ...
    lastHighIndex = highIndex;
    lastLowIndex = lowIndex;
}
 
Oleh Fedorov #:

Основную проблему я вижу в функции DetermineTrend. Цена максимума по определению будет больше цены минимума. Сравнивать нужно индексы:

И, соответственно. поменять 

Ну, и вторая небольшая проблема (не связанная с вопросом) - "мерцание" элементов на каждом тике. Чтобы этого не было, лучше графические элементы не удалять, а перемещать с помощью функции ObjectMove. Ну, или как-нибудь так:

спасибо, всё получилось