首页 > 解决方案 > 如何将 AccountBalance() 存储到变量中?

问题描述

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)

标签: mql4tradingalgorithmic-tradingforex

解决方案


问:如何存储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数据类型不再是string沉默的,突然开始变成一个struct。好吧,在更新的帮助文件的一个几乎不相关的页面深处提到了它,但是代码崩溃很痛苦,而且调试、分析和重构的时间很长)


推荐阅读