Проблема с получением правильных значений High и Low Candle на других таймфреймах.

 

Привет, я написал индикатор для вызова зигзага PERIOD_M30 с его значениями OHLC.

Я обнаружил, что при таймфрейме графика PERIOD_M30 значения зигзага и High и Low совпадают. Но когда я изменил таймфрейм графика на PERIOD_M1, значения не совпадают.

Пожалуйста, взгляните на следующие изображения выходов:

Когда время графика было PERIOD_M30:

Значения совпадают.

Когда я использую график PERIOD_M1 и вызываю зигзаг PERIOD_M30 с OHLC PERIOD_M30, значения не совпадают:

Вот код, который я использовал:

#property indicator_chart_window
#property indicator_buffers   1
#property indicator_plots     1

#define        Zigzag_Path             "Examples\\ZigZag"

input    ENUM_TIMEFRAMES   ZZ_Time                         = PERIOD_M30;
input    int               InpPeriod                         = 12;  // Period
input    int               InpDeviation                      = 5;   // Deviation
input    int               InpBackstep                       = 3;   // Back Step
input    int               Start_History_from_Candle_Counts  = 0;   // Start_History_from_Candle_Counts(0 = start from beginning)

int               handle_zigzag;

MqlRates          Rates[];

double            bufferzigzag[];

struct ZZ
  {
   double            Zigzag_Value;
   double            High_Candle_Value;
   double            Low_Candle_Value;
  } Values[];

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(handle_zigzag);
   ArrayFree(bufferzigzag);
   ArrayFree(Rates);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   handle_zigzag = iCustom(Symbol(), ZZ_Time, Zigzag_Path, InpPeriod, InpDeviation, InpBackstep);

   if(handle_zigzag == INVALID_HANDLE)
     {
      Print("Cannot Load Indicator: ", GetLastError());
      return INIT_FAILED;
     }

   ArraySetAsSeries(bufferzigzag, true);
   ArraySetAsSeries(Rates, true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
  {
   int Rates_Total_All_Bars = Bars(Symbol(), ZZ_Time),
       Rates_Total          = Rates_Total_All_Bars;

   if(Rates_Total < InpPeriod)
      return 0;

   if(prev_calculated <= 0)
     {

     }

   int lenzz = CopyBuffer(handle_zigzag, 0, 0, Rates_Total, bufferzigzag);

   if(lenzz <= 0)
      return 0;

   CopyRates(Symbol(), ZZ_Time, 0, lenzz, Rates);

   int count = 0;

   int index_start_Tracing_Points = rates_total - 1;

   ArrayResize(Values, 0);

   for(int loop = 1; loop < lenzz && !IsStopped(); loop++)
     {
      if(bufferzigzag[loop] != EMPTY_VALUE && bufferzigzag[loop] != 0)
        {
         ArrayResize(Values, count + 1);
         Values[count].Zigzag_Value = bufferzigzag[loop];
         Values[count].High_Candle_Value = Rates[loop].high;
         Values[count].Low_Candle_Value = Rates[loop].low;
         count++;
        }
     }

   if(prev_calculated <= 0)
      ArrayPrint(Values, 5, NULL, 0, count);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Пожалуйста, помогите мне с проблемой. Это больше похоже на проблемы MQL5, так как он дает неправильные значения максимума и минимума свечей.

 
jaffer wilson :

Привет, я написал индикатор для вызова зигзага PERIOD_M30 с его значениями OHLC.

Я обнаружил, что при таймфрейме графика PERIOD_M30 значения зигзага и High и Low совпадают. Но когда я изменил таймфрейм графика на PERIOD_M1, значения не совпадают.

Пожалуйста, взгляните на следующие изображения выходов:

Когда время графика было PERIOD_M30:

Значения совпадают.

Когда я использую график PERIOD_M1 и вызываю зигзаг PERIOD_M30 с OHLC PERIOD_M30, значения не совпадают:

Вот код, который я использовал:

Пожалуйста, помогите мне с проблемой. Это больше похоже на проблемы MQL5, так как он дает неправильные значения максимума и минимума свечей.

Кто-нибудь может что-нибудь сказать о том, почему я столкнулся с этой проблемой?

 
jaffer wilson #:

Кто-нибудь может что-нибудь сказать о том, почему я столкнулся с этой проблемой?

сегодня Воскресенье, выходной день и многие в отпуске на море, возможно в понедельник посмотрят.

 
Пожалуйста, может кто-нибудь, дайте мне знать, почему это происходит и что делать, чтобы решить эту проблему?
 
jaffer wilson #:
Пожалуйста, может кто-нибудь, дайте мне знать, почему это происходит и что делать, чтобы решить эту проблему?

добавьте комментарии, к рабочим позициям

вы должны понимать, что ваши условленные переменные не всегда понятны
 
jaffer wilson #:
Пожалуйста, может кто-нибудь, дайте мне знать, почему это происходит и что делать, чтобы решить эту проблему?

Вы наверное в самом коде изменяете таймфрейм? Но советник при компиляции всё равно запускается с теми параметрами с которыми он был запущен в предыдущий раз. Нужно в самом окне, руками, параметры менять, или убрать input из кода при отладке.

 
Alexey Valeev # :

Вы наверное в самом коде изменяете таймфрейм? Но советник при компиляции всё равно запускается с теми параметрами с которыми он был запущен в предыдущий раз. Нужно в самом окне, руками, параметры менять, или убрать input из кода при отладке.

Это означает, что мой код правильный? Вы пробовали это в своей системе? Пожалуйста, дай мне знать.

Причина обращения: