从一开始,我的预定目标就是使用标准库。 我的首要任务是实现最简单的功能:包括 CTrade 交易类,及执行买入或卖出的方法。 我之所以选择标准库,是因为它可以生成更简洁的代码。以下以脚本形式执行的短代码以交易量 1.0 手执行开多头仓位:
//+------------------------------------------------------------------+ //| Open Buy.mq5 | //| Copyright © 2018-2021, Vladimir Karputov | //+------------------------------------------------------------------+ #property copyright "Copyright © 2018-2021, Vladimir Karputov" #property version "1.001" //--- #include <Trade\Trade.mqh> CTrade m_trade; // trading object //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- m_trade.Buy(1.0); // open Buy position, volume 1.0 lot }
渐渐地,需求变得越来越复杂,我几乎每次在编写新的智能交易系统(EA)时都会遇到交易错误。 故此,我对编写正确代码的渴望变得越来越强烈。 最终,一篇非常重要的文章《交易机器人在市场发布前必须通过的检查》问世了。 当这篇文章发表时,我已经意识到需要针对交易指令的执行进行可靠控制的函数。 从那一刻起,我开始逐渐积攒了大量经过验证的函数,这些函数可以通过复制->粘贴,轻松添加到 EA 之中。
由于 EA 的操作几乎总是涉及到使用指标,因此我开始积攒创建正确指标句柄,以及接收指标数据的函数。
NB: MQL5 样式意味着指标句柄只能创建一次。 作为一条规定,这是在 OnInit 中完成的。
自 2.XXX, 版起,我开始维护两个开发分支 — 正常的面向过程代码,和类形式的代码(类的主要目标是实现多币种 EA)。
在我的工作动向中,构造函数逐渐接受了最流行的设置:
-
止损和止盈,
-
尾随,
-
依据风险百分比、或恒定/最小手数计算手数,
-
控制交易运作内的时间间隔,
-
场内只存在一笔持仓,
-
反转交易信号,
-
在出现翻转信号的情况下强制平仓...
每个输入都牵扯到创建代码模块和新函数。
对于日常使用,我决定在 Trading engine 3.mq5 EA 当中收集所有最流行的函数和完整的输入集合。事实上,这是一个成品 EA,它能把我们从大量日常工作中解脱出来。 我们所要做的就是在每种特定情况下添加/删除函数,或更改代码模块之间的交互。
1. 构造函数之后的 EA 功能
由构造函数创建的 EA 立即拥有多个设置,可以组合这些设置来创建独特的策略。 版本 4.XXX 应用了以下规则:
-
使用当前品种符号(EA 启动时所在图表的品种符号)
-
止盈、止损和尾随都在输入中设定。 Points — 依据报价货币计量的当前品种符号点数大小,例如 “EURSD” 1.00055-1.00045=10 个点。