Тестирование. Проблема CopeRates

 

Здравствуйте, вопрос от новичка).

Задача: Получить актуальный объект MqlRates за определенный период (H4):

void OnTick()
{
   MqlRates rates[];
   int count_getted = CopyRates(Symbol(), PERIOD_H4 , 0, 1, rates);
   if(dateCur != rates[0].time)
   {
      Print(TransRateToString(rates[0]));
      dateCur = rates[0].time;
   }
}

 

  string TransRateToString(MqlRates &rate)
  {
   string rate_str;
   rate_str = "RATE [TIME: " + TimeToString(rate.time) + "] [HIGH: " + DoubleToString(rate.high) + "] [LOW: " + DoubleToString(rate.low) + "] [OPEN: " + DoubleToString(rate.open) + "] [CLOSE: " + DoubleToString(rate.close) + "]";
   return rate_str;
  }

 Всё глупо и примитивно. Запускаем:

 

 

 

 Вывод:

2013.12.03 12:32:41     Core 1  2013.11.29 20:00:00   RATE [TIME: 2013.11.29 20:00] [HIGH: 1.63615000] [LOW: 1.63615000] [OPEN: 1.63615000] [CLOSE: 1.63615000]
2013.12.03 12:32:41     Core 1  2013.11.29 16:00:00   RATE [TIME: 2013.11.29 16:00] [HIGH: 1.63367000] [LOW: 1.63367000] [OPEN: 1.63367000] [CLOSE: 1.63367000]
2013.12.03 12:32:41     Core 1  2013.11.29 12:00:00   RATE [TIME: 2013.11.29 12:00] [HIGH: 1.63243000] [LOW: 1.63243000] [OPEN: 1.63243000] [CLOSE: 1.63243000]
2013.12.03 12:32:41     Core 1  2013.11.29 08:00:00   RATE [TIME: 2013.11.29 08:00] [HIGH: 1.63567000] [LOW: 1.63567000] [OPEN: 1.63567000] [CLOSE: 1.63567000]
2013.12.03 12:32:41     Core 1  2013.11.29 04:00:00   RATE [TIME: 2013.11.29 04:00] [HIGH: 1.63677000] [LOW: 1.63677000] [OPEN: 1.63677000] [CLOSE: 1.63677000]
2013.12.03 12:32:41     Core 1  2013.11.29 00:02:00   RATE [TIME: 2013.11.29 00:00] [HIGH: 1.63410000] [LOW: 1.63410000] [OPEN: 1.63410000] [CLOSE: 1.63410000]
2013.12.03 12:32:41     Core 1  2013.11.28 20:00:00   RATE [TIME: 2013.11.28 20:00] [HIGH: 1.63311000] [LOW: 1.63311000] [OPEN: 1.63311000] [CLOSE: 1.63311000]
2013.12.03 12:32:41     Core 1  2013.11.28 16:00:00   RATE [TIME: 2013.11.28 16:00] [HIGH: 1.63451000] [LOW: 1.63451000] [OPEN: 1.63451000] [CLOSE: 1.63451000]
2013.12.03 12:32:41     Core 1  2013.11.28 12:00:00   RATE [TIME: 2013.11.28 12:00] [HIGH: 1.63071000] [LOW: 1.63071000] [OPEN: 1.63071000] [CLOSE: 1.63071000]
2013.12.03 12:32:41     Core 1  2013.11.28 08:00:00   RATE [TIME: 2013.11.28 08:00] [HIGH: 1.63200000] [LOW: 1.63200000] [OPEN: 1.63200000] [CLOSE: 1.63200000]
2013.12.03 12:32:41     Core 1  2013.11.28 04:00:00   RATE [TIME: 2013.11.28 04:00] [HIGH: 1.63033000] [LOW: 1.63033000] [OPEN: 1.63033000] [CLOSE: 1.63033000]
2013.12.03 12:32:41     Core 1  2013.11.28 00:02:00   RATE [TIME: 2013.11.28 00:00] [HIGH: 1.62850000] [LOW: 1.62850000] [OPEN: 1.62850000] [CLOSE: 1.62850000]
2013.12.03 12:32:41     Core 1  2013.11.27 20:00:00   RATE [TIME: 2013.11.27 20:00] [HIGH: 1.62713000] [LOW: 1.62713000] [OPEN: 1.62713000] [CLOSE: 1.62713000]
2013.12.03 12:32:41     Core 1  2013.11.27 16:00:00   RATE [TIME: 2013.11.27 16:00] [HIGH: 1.63146000] [LOW: 1.63146000] [OPEN: 1.63146000] [CLOSE: 1.63146000]
2013.12.03 12:32:41     Core 1  2013.11.27 12:00:00   RATE [TIME: 2013.11.27 12:00] [HIGH: 1.62800000] [LOW: 1.62800000] [OPEN: 1.62800000] [CLOSE: 1.62800000]
2013.12.03 12:32:41     Core 1  2013.11.27 08:00:00   RATE [TIME: 2013.11.27 08:00] [HIGH: 1.62156000] [LOW: 1.62156000] [OPEN: 1.62156000] [CLOSE: 1.62156000]

 

 Вопрос: Почему цены открытия, закрытия и т.п. одинаковые и как это исправить? 

 

Всё правильно. условие (dateCur != rates[0].time)  верно только при появлении нового бара. а при появлении бара O=H=L=C

надо получать с предыдущего бара (1) 

void OnTick()
{
   MqlRates rates[];
   int count_getted = CopyRates(Symbol(), PERIOD_H4 , 0, 2, rates);
   if(dateCur != rates[0].time)
   {
      Print(TransRateToString(rates[1]));
      dateCur = rates[0].time;
   }
}

 Или вообще всё нули на единицы замените и будет вам счастье

 
pronych:

Всё правильно. условие (dateCur != rates[0].time)  верно только при появлении нового бара. а при появлении бара O=H=L=C

надо получать с предыдущего бара (1) 

 Или вообще всё нули на единицы замените и будет вам счастье

pronych

Совершенно верно