AccountInfo () и SymbolInfo () возвращают 0 при запуске MT4

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

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

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

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

  • используя #property strict
  • используя start () вместо OnCalculate () (так что я могу запустить основную функцию вручную, не дожидаясь нового тика)
  • запрошенная учетная запись или свойство символа не влияют на проблему
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
187
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Часто бывает, что некоторые данные в какой-то момент недоступны в МТ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;
   }

Большое спасибо за быстрый и подробный ответ! Насколько мне известно, Sleep() не работает с индикаторами, но я буду использовать обходной путь это. Еще раз большое спасибо!

Steven 06.10.2018 23:39

Обновление: функция работает так, как должна, но не получает запрошенную информацию от терминала, независимо от того, сколько времени она ждет. Я также попытался поместить функцию в начало start (), но это дает тот же результат, что и запуск в init (). (Он пытается выполнить ATTEMPTS = 50 раз, затем продолжает, что приводит к сбою init ()). Я решил это, проверив, равен ли номер учетной записи 0 при запуске start (), и если это так, он продолжается с return (0), завершая функцию start ().

Steven 07.10.2018 01:04

О, для индикатора, да, имеет смысл просто вернуться.

Daniel Kniaz 08.10.2018 09:57

Другие вопросы по теме