Когда я прикрепляю пользовательский индикатор к графику, закрываю MT4 и снова открываю его, индикатор инициализируется нормально, но каждый экземпляр AccountInfo () или SymbolInfo () при первом запуске start () возвращает 0,0, в результате чего несколько функций сбрасывают ноль. ошибка деления. Когда я повторно инициализирую индикатор (не закрывая MT4), AccountInfo () и SymbolInfo () возвращают значения, которые они обычно делают. Если я закомментирую все функции, которые зависят от этих двух, индикатор инициализируется без ошибок после перезапуска MT4.
У кого-нибудь была подобная проблема?
Чтобы уточнить: проблема возникает только тогда, когда я прикрепляю индикатор к графику, закрываю MT4 и снова открываю его; когда я прикрепляю его, когда MT4 уже открыт, AccountInfo () и SymbolInfo () возвращают нормальные значения.
Дополнительная информация:
Часто бывает, что некоторые данные в какой-то момент недоступны в МТ4. Лучшее, что вы можете сделать, это проверить, принят ли результат (> 0, если вы вызываете время, котировки, другие данные, которые не могут быть нулевыми) или проверить последнюю ошибку, затем Sleep(50)
и повторить попытку. Скорее всего, 2–5-я попытка будет успешной, поэтому вам нужно это в цикле.
Возможно, вам нужно знать хотя бы номер счета, который не может быть нулевым. После того, как вы получите успешный результат, все остальные данные будут загружены правильно.
int OnInit()
{
if (!initializeAccountInfo())
return(INIT_FAILED);
// ... other checks that you need
return(INIT_SUCCEEDED);
}
bool initializeAccountInfo()
{
int accountNumber=0, attempt=0, ATTEMPTS=50, SLEEP(50);
while(attempt<ATTEMPTS)
{
accountNumber=AccountInfoInteger(ACCOUNT_LOGIN);
attempt++;
if (accountNumber==0)
Sleep(SLEEP);
else
break;
}
return accountNumber>0;
}
Обновление: функция работает так, как должна, но не получает запрошенную информацию от терминала, независимо от того, сколько времени она ждет. Я также попытался поместить функцию в начало start (), но это дает тот же результат, что и запуск в init (). (Он пытается выполнить ATTEMPTS = 50 раз, затем продолжает, что приводит к сбою init ()). Я решил это, проверив, равен ли номер учетной записи 0 при запуске start (), и если это так, он продолжается с return (0), завершая функцию start ().
О, для индикатора, да, имеет смысл просто вернуться.
Большое спасибо за быстрый и подробный ответ! Насколько мне известно,
Sleep()
не работает с индикаторами, но я буду использовать обходной путь это. Еще раз большое спасибо!