- EA 交易的主要事件:OnTick
- 基本原理和概念:订单、交易和仓位
- 交易操作类型
- 订单类型
- 按价格和数量划分的订单执行模式
- 挂单到期日期
- 期货订单的保证金计算方法:OrderCalcMargin
- 估算交易操作的利润:OrderCalcProfit
- MqlTradeRequest 结构体
- MqlTradeCheckResult 结构体
- 请求验证:OrderCheck
- 请求发送结果:MqlTradeResult 结构体
- 发送交易请求:OrderSend 和 OrderSendAsync
- 买入和卖出操作
- 修改仓位的止损和/或止盈水平
- 跟踪止损
- 平仓:全部和部分
- 反向平仓:全部和部分
- 挂单
- 修改挂单
- 删除挂单
- 获取活动订单列表
- 订单特性(现行和历史)
- 用于读取活动订单特性的函数
- 按特性选择订单
- 获取仓位列表
- 仓位特性
- 用于读取仓位特性的函数
- 交易特性
- 从历史中选择订单和交易
- 用于从历史中读取订单特性的函数
- 用于从历史中读取交易特性的函数
- 交易类型
- OnTradeTransaction 事件
- 同步和异步请求
- OnTrade 事件
- 监测交易环境变化
- 创建多交易品种 EA 交易
- EA 交易的优势和局限性
- 在 MQL 向导中创建 EA 交易
EA 交易的主要事件:OnTick
当新的分时报价出现时,其包含 EA 交易正在运行的当前图表的工作交易品种的价格,EA 交易的终端将生成 OnTick 事件。要处理此事件,必须在 EA 交易代码中定义 OnTick 函数。该函数有以下原型。
void OnTick (void)
可以看到,该函数没有参数。如有必要,应通过调用 SymbolInfoTick 来请求新价格和其他分时报价特性的值。
从对新分时报价事件的反应来看,该处理程序类似于指标中的 OnCalculate。但是,OnCalculate 只能在指标中定义,OnTick 只能在 EA 交易中定义(更准确地说,指标、脚本或服务代码中的 OnTick 函数将会被完全忽略)。
同时,EA 交易不必包含 OnTick 处理程序。除了这个事件之外,EA 交易还可以处理 OnTimer、 OnBookEvent 和 OnChartEvent 事件,并从中执行所有必要的交易操作。
EA 交易中的所有事件按照到达的顺序逐个处理,因为 EA 交易和所有其他 MQ L程序一样,是单线程的。如果队列中已经有 OnTick 事件或正在处理此类事件,则新的 OnTick 事件不会排队。
无论自动交易是禁用还是启用(终端界面中的 Algo trading 按钮),都会生成 OnTick 事件。禁用自动交易仅意味着限制 EA 交易发送交易请求,但不阻止 EA 交易运行。
切记,只能为一个交易品种生成分时报价事件,也就是当前图表的交易品种。如果 EA 交易是多币种的,那么从其他交易品种获取分时报价应以某种替代方式进行组织,例如,使用间谍指标 EventTickSpy.mq5 或订阅市场深度行情事件,如 MarketBookQuasiTicks.mq5来请求新价格和其他分时报价特性的值。
举一个简单的示例,考虑 EA 交易 ExpertEvents.mq5。该脚本为通常用于启动交易算法的所有事件定义了处理程序。我们稍后将研究一些其他事件(OnTrade、 OnTradeTransaction 以及测试程序事件)。
所有处理程序均可调用 display 辅助函数,该函数在多行注释中输出当前时间(毫秒系统计数器标签)和处理程序名称。
#define N_LINES 25
|
新的分时报价到达时,将自动调用 OnTick 事件。对于计时器和订单薄事件,你需要使用 OnInit 中的 EventSetTimer 和 MarketBookAdd 调用来激活相应的处理程序。
void OnInit()
|
也可以提供图表变更事件:可以用于基于图形对象的标记交易,这些交易通过按按钮或热键以及在来自其他程序的自定义事件到达时实现,比如像 EventTickSpy.mq5 这样的指标。
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
|
下面的屏幕截图显示了图表上 EA 交易操作的结果。
EA 交易中各种类型事件的注释
请注意,OnBookEvent 事件(如果是为交易品种播报的)到达频次要高于 OnTick。