# Тестирование. Проблема 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

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