- EA 交易的主要事件:OnTick
- 基本原理和概念:订单、交易和仓位
- 交易操作类型
- 订单类型
- 按价格和数量划分的订单执行模式
- 挂单到期日期
- 期货订单的保证金计算方法:OrderCalcMargin
- 估算交易操作的利润:OrderCalcProfit
- MqlTradeRequest 结构体
- MqlTradeCheckResult 结构体
- 请求验证:OrderCheck
- 请求发送结果:MqlTradeResult 结构体
- 发送交易请求:OrderSend 和 OrderSendAsync
- 买入和卖出操作
- 修改仓位的止损和/或止盈水平
- 跟踪止损
- 平仓:全部和部分
- 反向平仓:全部和部分
- 挂单
- 修改挂单
- 删除挂单
- 获取活动订单列表
- 订单特性(现行和历史)
- 用于读取活动订单特性的函数
- 按特性选择订单
- 获取仓位列表
- 仓位特性
- 用于读取仓位特性的函数
- 交易特性
- 从历史中选择订单和交易
- 用于从历史中读取订单特性的函数
- 用于从历史中读取交易特性的函数
- 交易类型
- OnTradeTransaction 事件
- 同步和异步请求
- OnTrade 事件
- 监测交易环境变化
- 创建多交易品种 EA 交易
- EA 交易的优势和局限性
- 在 MQL 向导中创建 EA 交易
估算交易操作的利润:OrderCalcProfit
MQL5 API 函数之一 OrderCalcProfit 允许你在满足预期条件的情况下预先评估交易的财务结果。例如,使用此函数,你可以找出达到 Take Profit 水平时的盈利金额,以及触发 Stop Loss 时的亏损金额。
bool OrderCalcProfit(ENUM_ORDER_TYPE action, const string symbol, double volume,
double openPrice, double closePrice, double &profit)
该函数根据传递的参数计算当前市场环境下账户货币的利润或损失。
订单类型在 action 参数中指定。仅允许使用 ENUM_ORDER_TYPE 枚举中的市场订单 ORDER_TYPE_BUY 或 ORDER_TYPE_SELL。金融工具的名称及其交易量在 symbol 和 volume参数中传递。市场进入和退出价格分别由 openPrice 和 closePrice 参数设置。profit 变量作为最后一个参数被引用传递,利润值将被写入其中。
该函数返回一个成功 (true) 或错误 (false) 的指示符。
OrderCalcProfit 中使用的财务结果计算公式取决于交易品种类型。
标识符 |
公式 |
---|---|
SYMBOL_CALC_MODE_FOREX |
(ClosePrice - OpenPrice) * ContractSize * Lots |
SYMBOL_CALC_MODE_FOREX_NO_LEVERAGE |
(ClosePrice - OpenPrice) * ContractSize * Lots |
SYMBOL_CALC_MODE_CFD |
(ClosePrice - OpenPrice) * ContractSize * Lots |
SYMBOL_CALC_MODE_CFDINDEX |
(ClosePrice - OpenPrice) * ContractSize * Lots |
SYMBOL_CALC_MODE_CFDLEVERAGE |
(ClosePrice - OpenPrice) * ContractSize * Lots |
SYMBOL_CALC_MODE_EXCH_STOCKS |
(ClosePrice - OpenPrice) * ContractSize * Lots |
SYMBOL_CALC_MODE_EXCH_STOCKS_MOEX |
(ClosePrice - OpenPrice) * ContractSize * Lots |
SYMBOL_CALC_MODE_FUTURES |
(ClosePrice - OpenPrice) * Lots * TickPrice / TickSize |
SYMBOL_CALC_MODE_EXCH_FUTURES |
(ClosePrice - OpenPrice) * Lots * TickPrice / TickSize |
SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS |
(ClosePrice - OpenPrice) * Lots * TickPrice / TickSize |
SYMBOL_CALC_MODE_EXCH_BONDS |
Lots * ContractSize * (ClosePrice * FaceValue + AccruedInterest) |
SYMBOL_CALC_MODE_EXCH_BONDS_MOEX |
Lots * ContractSize * (ClosePrice * FaceValue + AccruedInterest) |
SYMBOL_CALC_MODE_SERV_COLLATERAL |
Lots * ContractSize * MarketPrice * LiqudityRate |
上述公式中使用了以下符号:
- Lots 每手仓量(合约份额)
- ContractSize - 合约规模(一手, SYMBOL_TRADE_CONTRACT_SIZE)
- TickPrice - 分时报价价格 (SYMBOL_TRADE_TICK_VALUE)
- TickSize - 分时报价规模 (SYMBOL_TRADE_TICK_SIZE)
- MarketPrice - 最后已知 买入/卖出 价格(取决于交易类型)
- OpenPrice - 仓位开盘价
- ClosePrice - 仓位收盘价
- FaceValue - 债券的面值 (SYMBOL_TRADE_FACE_VALUE)
- LiqudityRate - 流动性比率 (SYMBOL_TRADE_LIQUIDITY_RATE)
- AccruedInterest - 累积息票收入 (SYMBOL_TRADE_ACCRUED_INTEREST)
OrderCalcProfit 函数只能在 EA 交易和脚本中使用。要计算指标中的潜在利润/损失,需要实施替代方法,例如,使用公式的独立计算。
为了绕过在指标中使用 OrderCalcProfit 和 OrderCalcMargin 函数的限制,我们开发了一组函数,这些含税使用本节以及 保证金要求一节的公式执行计算。些函数位于头文件 MarginProfitMeter.mqh 中,在公共名称空间 MPM 内(MPM 是 Margin Profit Meter 的缩写)。
特别是,为了计算财务结果,必须有特定金融工具的一个点的值。在上述公式中,该值间接参与了开盘价和收盘价之间的差额 (ClosePrice - OpenPrice)。
该函数用于计算一个价格点的值 PointValue。
namespace MPM
|
在函数开始时,我们请求计算所需的所有交易品种特性。然后,根据交易品种类型,我们以该金融工具利润的货币形式获得利润/损失。请注意,此处没有债券,公式中也就不用考虑名义价格和票息收入。
double result = 0;
|
最后一点,如果货币不同,我们将金额转换为账户货币。
string account = AccountInfoString(ACCOUNT_CURRENCY);
|
辅助函数 Convert 用于转换金额。反过来,该函数依赖于 FindExchangeRate 函数,后者会在所有可用的交易品种中搜索包含从 current 货币到 account 货币汇率的交易品种。
bool Convert(const string current, const string account,
|
FindExchangeRate 函数在 Market Watch 中查找字符,并在 result 参数中返回第一个匹配的外汇交易品种名称(如果有多个匹配结果)。如果报价对应货币的直接顺序 "current/account",则该函数返回 +1,如果相反,则为 "account/current",即 -1。
int FindExchangeRate(const string current, const string account, string &result)
|
这些函数的完整代码可以在随附的文件 MarginProfitMeter.mqh 中找到。
我们用一个测试脚本 ProfitMeter.mq5 来检查 OrderCalcProfit 函数和函数组 MPM 的性能:我们将为市场报价的所有交易品种计算虚拟交易的利润/损失估算,可使用两种方法来完成该计算:内置方法和我们自己编写的方法。
在该脚本的输入参数中,可以选择操作类型 Action(买入或卖出)、手数 Lot 和持仓时间(以柱线 Duration 表示)。财务结果是针对当前时间范围内最后一个 Duration 柱线的报价计算的。
#property script_show_inputs
|
在该脚本的正文中,我们可以连接头文件并显示带有参数的头文件。
#include <MQL5Book/MarginProfitMeter.mqh>
|
然后,在对交易品种迭代中,以两种方式执行计算,并打印结果以供比较。
for(int i = 0; i < SymbolsTotal(true); i++)
|
尝试为不同的账户和金融工具集运行该脚本。
Profits/Losses for buying 1.0 lots of 13 symbols in Market Watch on last 20 bars H1
|
理想情况下,每行中的数字应匹配。