Нажатие кнопки «Обновить» иногда приводит к другим результатам пользовательского индикатора.

У меня странный случай, который я не могу понять. Я разработал собственный индикатор, который рассчитывает индекс, по которому я буду принимать торговые решения. Индикатор использует три периода времени, чтобы проверить, является ли тренд устойчивым или нет. Первый - одна минута, второй - 5 минут и, наконец, 30-минутный период времени. Я рассчитываю соответствующий бар, из которого проверяются большие периоды времени, чтобы они соответствовали минутному бару.

Мое тестирование показывает, что числа рассчитываются правильно.

Этот индикатор прикреплен к минутному графику. Много раз я щелкал правой кнопкой мыши и выбирал обновление, и индикатор менялся за последние 5-10 минут! Я не могу найти причину, почему это так. Я пытался нажимать «Обновить» после каждой минутной полосы, и иногда она менялась, а иногда нет. Однако, даже если я нажимаю каждую минуту на графике, иногда изменения будут происходить на 5-10 минут раньше.

Не могли бы вы мне помочь?

Я включаю свой код для вашей помощи:

int start()                         // Special function start()
  {
   int i,                        // Bar index                           
       iLook = 0,
       iCurrMinute = 0,
       iMinFloor = 0,
       iMinsAdd = 0,
       Counted_bars,                // Number of counted bars
       iCalcVal,
       iTrendConsistency;                    

   double EMA_1min_10_current, EMA_1min_10_prev,    
          EMA_5min_10_current, EMA_5min_10_prev,
          EMA_30min_10_current, EMA_30min_10_prev,
          EMA_1min_20_current, EMA_1min_20_prev,    
          EMA_5min_20_current, EMA_5min_20_prev,
          EMA_30min_20_current, EMA_30min_20_prev,
          dblMinRemain = 0;

   datetime dtBarTime;
//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Number of counted bars
   i=Bars-Counted_bars-1;           // Index of the first uncounted
   while(i>=0)                      // Loop for uncounted bars
     {
      iCalcVal = 0;
      iTrendConsistency = 0;
      dtBarTime = iTime(NULL,PERIOD_M1,i);

      //  Calculate trend consistency
      if (boolIncl1Min)
      {
         iLook = i;

         EMA_1min_10_current = iMA(NULL,PERIOD_M1,intMAShort,0,MODE_EMA,PRICE_CLOSE,iLook);
         EMA_1min_10_prev = iMA(NULL,PERIOD_M1,intMAShort,0,MODE_EMA,PRICE_CLOSE,iLook+1);    
         EMA_1min_20_current = iMA(NULL,PERIOD_M1,intMAMedium,0,MODE_EMA,PRICE_CLOSE,iLook);
         EMA_1min_20_prev = iMA(NULL,PERIOD_M1,intMAMedium,0,MODE_EMA,PRICE_CLOSE,iLook+1);

         if (EMA_1min_10_current > EMA_1min_20_current) iTrendConsistency++; 
         if (EMA_1min_10_current < EMA_1min_20_current) iTrendConsistency--;

         if (EMA_1min_10_current > EMA_1min_10_prev) iTrendConsistency++; 
         if (EMA_1min_10_current < EMA_1min_10_prev) iTrendConsistency--;

         if (EMA_1min_20_current > EMA_1min_20_prev) iTrendConsistency++; 
         if (EMA_1min_20_current < EMA_1min_20_prev) iTrendConsistency--;

         if (iClose(NULL,PERIOD_M1,iLook) > EMA_1min_10_current) iTrendConsistency++;
         if (iClose(NULL,PERIOD_M1,iLook) < EMA_1min_10_current) iTrendConsistency--;
      }

      if (boolIncl5Min) 
      {

         iLook = i;
         if (boolIncl1Min) iLook = iBarShift(NULL,PERIOD_M5,dtBarTime,true);

         EMA_5min_10_current = iMA(NULL,PERIOD_M5,intMAShort,0,MODE_EMA,PRICE_CLOSE,iLook);
         EMA_5min_10_prev = iMA(NULL,PERIOD_M5,intMAShort,0,MODE_EMA,PRICE_CLOSE,iLook+1);

         EMA_5min_20_current = iMA(NULL,PERIOD_M5,intMAMedium,0,MODE_EMA,PRICE_CLOSE,iLook);
         EMA_5min_20_prev = iMA(NULL,PERIOD_M5,intMAMedium,0,MODE_EMA,PRICE_CLOSE,iLook+1);

         if (EMA_5min_10_current > EMA_5min_20_current) iTrendConsistency++; 
         if (EMA_5min_10_current < EMA_5min_20_current) iTrendConsistency--;

         if (EMA_5min_10_current > EMA_5min_10_prev) iTrendConsistency++; 
         if (EMA_5min_10_current < EMA_5min_10_prev) iTrendConsistency--;

         if (EMA_5min_20_current > EMA_5min_20_prev) iTrendConsistency++; 
         if (EMA_5min_20_current < EMA_5min_20_prev) iTrendConsistency--;

         if (iClose(NULL,PERIOD_M5,iLook) > EMA_5min_10_current) iTrendConsistency++;
         if (iClose(NULL,PERIOD_M5,iLook) < EMA_5min_10_current) iTrendConsistency--;
      }

      if(boolIncl30Min)
      {  

         iLook = i;

         if (boolIncl1Min) iLook = iBarShift(NULL,PERIOD_M30,dtBarTime,true);

         EMA_30min_10_current = iMA(NULL,PERIOD_M30,intMAShort,0,MODE_EMA,PRICE_CLOSE,iLook);
         EMA_30min_10_prev = iMA(NULL,PERIOD_M30,intMAShort,0,MODE_EMA,PRICE_CLOSE,iLook+1);
         EMA_30min_20_current = iMA(NULL,PERIOD_M30,intMAMedium,0,MODE_EMA,PRICE_CLOSE,iLook);
         EMA_30min_20_prev = iMA(NULL,PERIOD_M30,intMAMedium,0,MODE_EMA,PRICE_CLOSE,iLook+1);

         if (EMA_30min_10_current > EMA_30min_20_current) iTrendConsistency++;
         if (EMA_30min_10_current < EMA_30min_20_current) iTrendConsistency--;

         if (EMA_30min_10_current > EMA_30min_10_prev) iTrendConsistency++; 
         if (EMA_30min_10_current < EMA_30min_10_prev) iTrendConsistency--;

         if (EMA_30min_20_current > EMA_30min_20_prev) iTrendConsistency++;
         if (EMA_30min_20_current < EMA_30min_20_prev) iTrendConsistency--;


         if (iClose(NULL,PERIOD_M30,iLook) > EMA_30min_10_current) iTrendConsistency++;
         if (iClose(NULL,PERIOD_M30,iLook) < EMA_30min_10_current) iTrendConsistency--;
      }



      Trend_Consistency[i]= iTrendConsistency;

      i--;                          // Calculating index of the next bar
     }

пс: boolIncl1Min всегда верно..


person Jean    schedule 31.01.2018    source источник


Ответы (1)


В конце концов я нашел ответ, который ускользал от меня в течение нескольких дней! Условия для 5-минутных или 30-минутных графиков изменяются во время последнего бара. Одноминутные столбцы записывают 5- и 30-минутные условия каждую минуту. Если я нажму кнопку «Обновить», прошлые бары станут твердыми и, следовательно, их можно будет окончательно рассчитать.

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

Спасибо, что решили помочь мне.

person Jean    schedule 31.01.2018