首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AccountInfo()和SymbolInfo()在MT4启动时返回0

AccountInfo()和SymbolInfo()在MT4启动时返回0
EN

Stack Overflow用户
提问于 2018-10-06 12:06:32
回答 1查看 318关注 0票数 0

当我将一个自定义指示器附加到图表中,关闭MT4并重新打开它时,该指示器通常会初始化,但在start()的第一次运行中,AccountInfo()或SymbolInfo()的每个实例都返回0.0,导致多个函数抛出‘零除法’错误。当我重新初始化指示器(不关闭MT4)时,AccountInfo()和SymbolInfo()返回它们通常做的值。如果我注释掉所有依赖于这两个函数的函数,则指示符在重新启动MT4后初始化而不会抛出错误。

有谁有过类似的问题吗?

为了澄清:只有当我将指示符附加到图表上时,才会出现问题,关闭MT4并再次重新打开它;当我在MT4已经打开时附加它时,AccountInfo()和SymbolInfo()返回正常值。

其他信息:

  • 使用#属性严格
  • 使用start()代替OnCalculate() (因此我可以手动运行主函数,而无需等待新的滴答)
  • 所请求的帐户或符号属性对此问题没有影响。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-06 15:55:25

在MT4中某些数据在某一时刻是不可用的,这种情况经常发生。最好的方法是检查结果是否被接受(如果调用时间、引号和其他不能为零的数据),或者检查最后一个错误,然后是Sleep(50),然后再试一次。最有可能的是第2-第5次尝试是成功的,所以你需要在一个循环。

有可能你至少需要知道不可能为零的帐号。在收到成功的结果后,所有其他数据似乎都已正确加载。

代码语言:javascript
复制
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;
   }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52678897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档