【问题标题】:How to store AccountBalance() into a variable?如何将 AccountBalance() 存储到变量中?
【发布时间】:2019-11-24 20:02:37
【问题描述】:
if(Total_sell_pos() == 0 && Total_buy_pos() == 0) {
      double previous_balance = AccountBalance(); //usd1000
}

if (AccountEquity() > previous_balance + (previous_balance *0.05)){ //usd1000 + 50 = usd1050
      CloseSellOrders();
      CloseBuyOrders();
      Delete_Pendings();
}

如果净值超过 1050 美元,则删除挂单和订单。

但是为什么在运行代码时,即使Equity小于之前的余额,它仍然保持删除挂起并立即下单?

以下代码是问题所在,我替换它:

AccountEquity() > previous_balance + (previous_balance *0.05)

AccountEquity() > 1050

那么只有它有效。我确实尝试过检查值:

double check_value = previous_balance + (previous_balance *0.05);
printf (check_value); //1050

我可以知道为什么我不能使用下面的代码吗?

AccountEquity() > previous_balance + (previous_balance *0.05)

【问题讨论】:

  • 也许您可以显示 MCVE,因为问题似乎出在变量之间。

标签: mql4 trading algorithmic-trading forex


【解决方案1】:

问:如何将AccountBalance()存入变量中?

让我们从变量开始 - 声明它:

    double aPreviousBALANCE;

声明范围由封闭的代码块边界驱动。 MQL4/5 可以在“全局”范围内声明一个变量,该变量可能从其他代码块内部可见,但如果任何这样的变量名称与定义的“全局”范围相同,则本地声明的 (显式在代码中,或从调用签名规范中的函数参数声明中引入)将“遮蔽”对“全局”范围内声明的变量的访问。您必须检查原始代码,MQL4/5-IDE 可能会在编译期间警告您此类冲突(参考编译器警告消息)。

让我们将实际状态存储在其中,我们将在此处执行更多步骤:

    RefreshRates();                                          // Force a state-update
    aPreviousBALANCE = AccountInfoDouble( ACCOUNT_BALANCE ); // Store an updated value

问:我可以知道为什么我不能使用下面的代码吗?

嗯,任何语言,MQL4/5 也不例外,都有一些数学运算符的执行顺序。 MQL4 不需要也没有保证使用与我们之前可能有过一些经验的任何其他语言相同的语言。因此,在此通过显式括号指定所有排序时,请始终保持相当明确,当语言解析器/编译器突然改变运算符的优先级并且突然出现噩梦时,这将为您节省任何进一步的“惊喜”。不值得发生一次这样的震惊:

   if ( ( ( a * b ) + c ) < fun() ) // is EXPLICIT and a way safer, than

   if (     a * b   + c   < fun() ) // is DEPENDENT on not having {now|in future}
                                    //              a binary boolean (<)-operator
                                    //              a higher priority than (+)-op

所以,宁愿始终保持明确,这样你会更安全。

最后,测试一下:

    RefreshRates();                                          // Force a state-update
    if ( ( aPreviousBALANCE * 1.05 ) < AccountInfoDouble( ACCOUNT_EQUITY ) )
    { 
         ...
         }

同时检查您的设置是如何从代理端预先设置的 - 他们运行支持热线让您询问他们的设置:

净值计算取决于交易服务器设置

Print( "Profit calculation mode for SYMBOL[ ",
        Symbol(),
       " ] is ",
        MarketInfo( Symbol(), MODE_PROFITCALCMODE ),
       " { 0: mode-FOREX, 1: mode-CFD, 2: mode-FUTURES }."
        );

我的 AccountBalance() 函数在哪里?

最近的终端构建使用一组新类型的调用来:

 AccountInfo{Integer|
              Double|
              String}( <anEnumDrivenItemIDENTIFIER>
                       )

  SymbolInfo{Integer|
              Double|
              String}( <aSymbolNAME>,
                       <anEnumDrivenItemIDENTIFIER>
                       )

仅举几例,因此请重新阅读文档以采用最新更改。总是。当您的终端更新了新版本时发出警报(在为 MQL4-IDE 和/或终端加载新版本的帮助文件时可能会看到)。

嗯,这发生了。 MQL4 发展了,我们习惯了很久的一些功能不复存在,开始突然产生不准确或不确定的结果或改变其行为(老 MQL4 人仍然记得那天,string 数据type 不再是 string,而是突然变成了 struct。好吧,在更新的帮助文件的一个几乎不相关的页面深处提到了它,但是代码- 崩溃很痛苦,而且调试、分析和重构的时间很长)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 2018-11-06
    • 2020-01-11
    • 2014-05-10
    相关资源
    最近更新 更多