MQL4中如何正确计算账户的总盈亏?
MQL4账户总盈亏计算错误原因及正确方案
核心遗漏要点
你所有尝试的核心问题是只统计了交易价差盈亏,忽略了每笔订单的手续费和隔夜掉期利息,同时部分用法存在逻辑错误:
AccountInfoDouble(ACCOUNT_PROFIT)仅统计未平仓持仓的浮动盈亏,空仓时返回0属于正常情况,该字段不适用历史累计盈亏统计。OrderProfit()仅返回交易的价差收益,每笔订单的扣除项(手续费OrderCommission()、隔夜掉期OrderSwap())均未纳入统计,这是你数值偏差的核心原因。- 出入金统计逻辑不全:仅统计入金未统计出金,且公式逻辑错误。
- 未确认终端历史记录加载范围:MQL4默认仅加载当前设置时间范围内的历史订单,若未加载全量历史,
OrdersHistoryTotal()返回值不全,计算结果也会偏差。你需要先在终端「交易历史」tab右键选择「所有历史记录」,保证历史订单加载完整。
正确实现代码
场景1:计算纯交易累计净盈亏(不含出入金,即你需要的实际交易总盈亏)
double totalTradeProfit = 0; for(int i = 0; i < OrdersHistoryTotal(); i++){ if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){ // 仅统计0-5类交易订单(买单、卖单、各类挂单) if(OrderType() <= OP_SELLLIMIT){ // 价差盈亏+手续费+掉期,三者之和为该笔订单实际盈亏 totalTradeProfit += OrderProfit() + OrderCommission() + OrderSwap(); } } } Print("累计交易总盈亏:", totalTradeProfit);
场景2:验证账户当前余额与盈亏的对应关系
如果需要和账户余额校验,可使用如下逻辑:
double totalDeposit = 0; // 总入金 double totalWithdraw = 0; // 总出金 double totalTradeProfit = 0; // 交易总盈亏 for(int i = 0; i < OrdersHistoryTotal(); i++){ if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){ if(OrderType() == 6){ // 出入金/转账类订单 double amount = OrderProfit(); if(amount > 0) totalDeposit += amount; else totalWithdraw += MathAbs(amount); }else{ // 交易类订单 totalTradeProfit += OrderProfit() + OrderCommission() + OrderSwap(); } } } // 账户当前余额 = 总入金 - 总出金 + 累计交易盈亏 double calculatedBalance = totalDeposit - totalWithdraw + totalTradeProfit; // 总盈亏 = 当前余额 + 总出金 - 总入金 double totalAccountProfit = calculatedBalance + totalWithdraw - totalDeposit; Print("计算得到的总盈亏:", totalAccountProfit);
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

