AccountInfo () и SymbolInfo () возвращают 0 при запуске MT4 - PullRequest
0 голосов
/ 06 октября 2018

Когда я присоединяю пользовательский индикатор к графику, закрываю MT4 и снова открываю его, индикатор инициализируется нормально, но каждый экземпляр AccountInfo () или SymbolInfo () в первом запуске start () возвращает 0.0, вызывая несколько функцийошибка «деления на ноль».Когда я повторно инициализирую индикатор (без закрытия MT4), AccountInfo () и SymbolInfo () возвращают значения, которые они обычно делают.Если я закомментирую все функции, которые зависят от этих двух, индикатор инициализируется без выдачи ошибок после перезапуска MT4.

У кого-нибудь была похожая проблема?

Чтобы уточнить: проблема возникает только тогда, когдаЯ прикрепляю индикатор к графику, закрываю MT4 и снова открываю его;когда я прикрепляю его, когда MT4 уже открыт, AccountInfo () и SymbolInfo () возвращают нормальные значения.

Дополнительная информация:

  • с использованием #property строго
  • с использованиемstart () вместо OnCalculate () (поэтому я могу запустить основную функцию вручную, не дожидаясь новой отметки)
  • запрашиваемая учетная запись или свойство символа не влияет на проблему

1 Ответ

0 голосов
/ 06 октября 2018

Часто случается, что некоторые данные недоступны в MT4 в определенный момент времени.Лучшее, что вы можете сделать, это проверить, принят ли результат (> 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;
   }
...