订单策略。多目标 EA 交易·综合运用
(3/3)·从挂单加仓到金字塔平仓,把三类策略要素塞进一个 EA 的落地法
很多交易者把挂单和仓位管理拆成两套脚本各跑各的,结果加仓单和止损反转互相打架。订单策略的难点不在画信号,而在让 EA 按统一规则消化当前交易状况。
用 eInterpretator 把订单规则翻成机器可读指令
eInterpretator 这个 EA 的思路很直接:把写在文本里的交易规则当成“元程序”读进来,逐条解析成内部数字结构,再照着执行。它附带参数表(表12),覆盖手数、用户方向、跟踪止损、盈亏平衡、建仓/平仓信号等二十多项,基本把手工策略的开关都暴露成了输入变量。 元程序文件名通过 ProgramFileName 指定;回测时要把对应文件放到 TesterMetaProgram.txt 里。若开启 DeInterpritate,EA 会做“反转解释”——把解析出的数字结构再还原成文本指令,生成带 De_ 前缀的文件,你能直观看到它到底怎么“理解”你的规则。 载入阶段若有严重语法错误会弹警告;顺利的话日志打“解释初始化完成”。反转解释那一步还会切断与图表和策略测试器的关联,避免异常停止时拖累其他测试。 看一段实际反转前后的对照:原指令 Buy(6) 被展开成带计算式的描述,右侧 X1*X2+X3*X4 算出 1,动作域里用户变量也被具体数值替换。这意味着你写的一行语义,在 EA 内部已经变成确定性的算术与价格锚点。 外汇与贵金属杠杆高、滑点大,这类自动解释器只解决“规则落地”,不解决“规则赚钱”——上 MT5 跑反转文件核对一遍,比盲信参数表更实在。
Buy(<span class="number">class="num">6</span>) | Modify(<span class="number">class="num">6</span>,,,ThisOpenPrice-Var4p,) Buy(<span class="number">class="num">6</span>)==<span class="number">class="num">1</span>*<span class="number">class="num">1</span>+<span class="number">class="num">0</span>*<span class="number">class="num">0</span>; | Modify(<span class="number">class="num">6</span>,,,ThisOpenPrice()*<span class="number">class="num">1</span>-<span class="number">class="num">0.0025</span>*<span class="number">class="num">1</span>,)
「给 EA 动手术:指令、标识符与信号函数怎么加」
想给这套 EA 做个性化,核心入口就在几个数组和切换结构里。EA 本身的结构允许直接插指令,否则前面写的逻辑基本没实用价值。外汇和贵金属杠杆高,改完务必在 MT5 策略测试器跑一遍再上实盘。 数据指令挂在 InforCommand 数组,每行 5 个指令排成栏,数行数就能算出新增项的索引。加完指令后,去 SetValue() 的 switch 里补一个对应索引的事件:先选对象再取值,选对象的函数按类型分(Pos.Select 选仓位、SelectOrder 按符号/类型/ID 选订单、SelectLastDeal 选上一笔交易含止损获利、SelectLastEADeal 只选 EA 自己发的上一笔)。选完必须查 aSelected 确认命中,再把参数写进 Val.Value 并返回 true。 标识符在 InfoIdentifier 数组。加了新标识符要同步升级 SelPosParam / SelOrdParam / SelDealParam,按适用范围改全部或部分,并在切换结构补事件。取数时靠 Val.InfoIdentifierIndex 传索引。 动作指令放 ActCommand,元素是整串字符串(含参数与类型),参数个数写进 ActCmndPrmCnt,类型写进 ActCmndType:0 市场动作、1 挂单、2 仓位管理。在 DoAction() 的切换里加新 bool 函数调用,成功返 true。处理挂单的函数记得先查订单是否存在。 信号逻辑全压在四个函数:CloseSignalsMain / OpenSignalsMain 在 OnTick 跑,Init 版在 OnInit 调并加载指标,OnDeinit 要 IndicatorRelease。函数开头先把 GlobalCloseBuySignal、GlobalCloseSellSignal、GlobalOpenBuySignal、GlobalOpenSellSignal 置 false,指标读数置 true。
◍ 随包文件与测试目录的落地细节
这套 EA 体系不是单文件运行,解包后得按角色分放。eInterpretator.mq5 是主 EA,必须进终端数据目录的 MQL5/Experts;剩下一堆 .txt 是各类元程序——限价加仓、止损反转、金字塔、重建仓、带跟踪止损或盈亏平衡的交易信号,各自对应一个 .set 参数文件,例如 limitadd.set 配 LimitAdd.txt,tradesignalstr.set 配 TradeSignalsTR.txt。 用交易信号、跟踪止损、盈亏平衡这几类程序时,EA 属性窗里对应的函数开关要一直开着,否则元程序不会生效。想在 Strategy Tester 里跑且动用远程 agents,得把要用到的元文件内容并到 TesterMetaProgram.txt,再丢进 MQL5/Files(路径从 File -> Open Data Folder 进)。 官方在 Metalanguage 的 Examples of Order Strategies 给了性能图表,但那只是参数文件特定取值下的表现。实测窗口截到 2012.08.29,覆盖 EURUSD 的 H1 与 M1 的 OHLC 模式,跑了数月。外汇与贵金属杠杆高、滑点跳空频繁,这类旧测结果只作机制参考,不能直接当实盘胜率依据,建议自己挂 MT5 用当前点差重跑一遍。
一点提醒
把策略从脑子搬进 MT5,第一步往往是懵的:先写哪条规则、怎么验证 EA 在真实环境不崩、计算式跑起来是否可靠。前面几节拆的 eInterpretator 就是给这类人用的——它能在 Strategy Tester 里用极少时间把你口头化的下单逻辑跑成可测的 Expert Advisor。 我实测 MetaTrader 5 的策略测试器里,eInterpretator 的运算速度超出预期,配合附带的 files__2.zip(26.17 KB)直接解压进终端就能试。外汇与贵金属杠杆高、滑点跳空频繁,回测顺不等于实盘稳,任何策略都只是概率优势。 真要动手,就先下载那枚 ZIP,把你的订单条件写成 MetaTesterProgram.txt 丢进测试器;跑通一版再说迭代。市场不会等你读完文档才开盘。