首页 / 交易学院 / 小布知识库 / 多目标EA订单策略实战指南
多目标EA订单策略实战指南
📊

多目标EA订单策略实战指南

用元语言描述并运行限价加仓、止损反转等策略

订单与风险管理 难度 · 进阶 2026-06-13 7 分钟阅读
#订单策略#MQL5#EA开发#元语言

一、交易策略的三大核心要素

任何交易策略的首要核心元素,是价格分析以及作为建仓基础的技术指标分析,我们称其为市场分析,即市场中发生的所有事情以及我们无法控制的事情。除此之外,策略还需要当前交易状况分析,包括仓位状态、挂单有无等,其结果决定我们是否平仓、移动止损、下或删挂单,这属于对自身行为的研究。通常说的跟踪止损是仓位管理函数,代表第三类要素。因此一个完整策略包含:市场分析与动作、交易情况分析与动作、仓位管理。

理解这三层结构非常重要。很多交易者只关注指标信号,却忽略了对已建仓位的动态管理,导致盈利单变亏损。订单策略主动利用挂单,正是把第二、第三类要素工程化,让EA能按规则自动应对市场变化。

✦ 提示
在设计EA前,先用笔列出策略可能处于哪几种'市场+订单'组合,这决定后续阶段识别的复杂度。

二、常见订单策略类型与原理

交易通常从初始仓位开始,可用市价建仓、双向止损单二选一触发、双向限价单二选一触发等方法。初始仓位建立后,可运用多种订单策略。使用限价订单加仓:建初始仓后同方向挂限价单,启动后设新限价单,获利平掉后删剩余挂单。止损和反转:初始仓后反方向挂止损单,止损平仓后同点挂新反转止损单,直到获利平仓。金字塔:盈利后加仓并移止损至盈亏平衡,累积大仓位获利。再建仓:止损平仓后用更大手数重建,直到获利或次数用尽。

这些策略可组合:盈利时金字塔,亏损时限价加仓,不必持续单一模式。实际编写非常耗时,不仅要写大量代码,还需对每个中间状态创意处理。本文的元语言和多目标EA正是为加快这类编程而生。

⚠ 常见坑
限价加仓若按市场仓位价计算挂单价,当某单设置失败则后续单因缺参数无法挂,导致策略断裂。必须以已成功挂单的OpenPrice为基准。

三、阶段识别与基础设计原则

开发订单策略的基础原则是识别当前操作阶段并据此动作。例如:无仓位订单→建仓;有仓无单→设止损单;有仓有止损→设限价单。但若严格枚举所有中间态(如连接失败),规则将爆炸。更好的原则是:用最少信息量描述阶段,每阶段有完整目标状态描述,且一个阶段只对应一个市场动作和若干挂单动作。若需市场动作,分前后子阶段,成功后处理挂单,以便一次发出所有请求并重试失败项。

具体说,我们不必写'无仓→建仓→有仓无单→设两单'的串行,而写'无仓则建仓并试图发两单请求;有仓则检查缺哪个单就补哪个'。这样覆盖所有中间态,代码更鲁棒。该原则让策略描述从耗时创意变成规则填写。

Nothing | Buy(M1,1,0,0) #If there is no position or order in the market, open a Buy position, mark it with "М1", lot 1, no SL/TP.
✦ 提示
阶段标识左侧越短越好,右侧动作要写出'达到该阶段应满足的全部订单组合',EA会自动补全缺失单。

四、订单与仓位的识别技术

识别订单和仓位可用注释、魔法数字或全局变量。注释法最主要问题是长度有限且交易商可能追加内容,若空间不足你写的部分会被删。应尽量用最少字符,并以'='结尾作标志(交易商不用此标记),最多4字符,如'1='或'A1='。从注释提取标识符可用以下函数,检查标识符是否匹配可用FitsID。

string GetID(string aComment)
  {
   int    p =StringFind(aComment,"=",0);
   string id=StringSubstr(aComment,0,p);
   return(id);
  }
bool FitsID(string aID,string aComment)
  {
   return(StringFind(aComment,aID+"=",0)==0);
  }

魔法数字适合内部区分,但跨平台或手动单易冲突;全局变量可跨EA但需清理。本文EA用注释'='标识,兼顾可读与稳定。还需识别订单是否启动、是否初始仓,避免重复下单。

五、订单策略描述元语言规范

元语言在文本文件写策略,EA属性窗指定文件名加载。一行一阶段,分两域:阶段识别|动作列表,域间竖线,项间分号。右侧#后写注释。识别规则用数据访问指令如Buy(M1)表带M1的买仓,Buy(M1,StopLossInPoints)>=0表其止损点数非负。对比符支持>= <= == != > <,右侧可数字、Var1~Var20变量、加p乘点值,或X1*X2+X3*X4算式。

表1指令含Nothing、NoPos、Pending、Buy/Sell、各挂单类型、LastDeal、SignalOpenBuy等29种;表2参数含ProfitInPoints、OpenPrice、StopLossValue等。动作指令见表3:Buy/Sell建仓,Close平仓,BuyLimit等挂单,Delete删单,Modify改单,TrailingStop/BreakEven管理函数。参数ID为首,可用变量或算式。

Buy(6) | Modify(6,,,ThisOpenPrice-Var4p,)
-BuyStop(BS1,StopLossInPoints)*-SellLimit(SL1,StopLossInPoints)+-SellStop(SS1,StopLossInPoints)*-BuyLimit(SL1,StopLossInPoints)
⚠ 警告
标识符禁用+ - *,最好纯数字。Var后带p表示乘_Point,写错单位会导致挂单价格偏离巨大。

六、元语言策略实例解析

限价加仓例:阶段1无仓则用户买方向建仓1手,并挂三个限价单2/3/4手,价格基于前单OpenPrice减Var2p;阶段2有仓补挂;阶段3限价2启动则挂3/4/5确保市面三单;直至阶段7最后单设止损。卖出对称。阶段15无仓有挂单则删所有买限卖限。止损反转例:阶段1挂双向止损1手,触发后删原单挂反向2手,直至5次反转,无仓有单则删。金字塔例:信号买建仓,盈利超Var3则加仓并移止损至开仓价。再建仓例:起始双限价,触发删另,止损后按上次方向加倍建仓。

这些文本可直接喂给eInterpretator。如下为反转解释后Buy(6)被转成的等价判定,可见EA内部将变量替换为数值计算,保证执行效率。

Buy(6)==1*1+0*0; | Modify(6,,,ThisOpenPrice()*1-0.0025*1,)
✦ 实操
从附带的LimitAdd.txt等文件改Var值比从头写快得多,先用.set参数文件调参再优化。

七、eInterpretator EA的运行与参数

EA从文件载元程序,分析填数据结构,日志显'解释初始化完成'。参数含手数基数、UserTradeDir、ProgramFileName(实盘)或TesterMetaProgram.txt(测试)、DeInterpritate反译调试。变量Var1-20。跟踪止损TR_*、盈亏平衡BE_*、建仓信号OS_*(双MA)、平仓信号CS_*(CCI)。EA用SelectOrder等函数选对象,SelPosParam取参。测试时元文件放MQL5/Files且拷为TesterMetaProgram.txt以用远程agent。

个性化时,加数据指令改InfoCommand数组与SetValue切换;加标识符改InfoIdentifier与Sel*Param;加动作改ActCommand并写DoAction新函数返回bool。信号函数OpenSignalsMain/CloseSignalsMain在OnTick调,OnInit初始化指标,OnDeinit释放。结构清晰,扩展直接。

⚠ 注意
使用交易信号/跟踪止损/盈亏平衡程序时,EA属性窗中相应函数必须启动,否则阶段里的TrailingStop等不被调用。

常见问题

写一行一无仓阶段:Nothing|Buy(1,1,0,Ask+Var1p);BuyLimit(2,2,Buy(1,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);... 把文件存为LimitAdd.txt,EA的ProgramFileName指向它,Var1-3在属性窗设,测试时复制为TesterMetaProgram.txt。
订单注释以'数字='结尾如'1=',用GetID取=前串,FitsID查是否首位置匹配'aID+'='。交易商追加内容不影响因为=前已定,且长度不超4字符。
把元程序txt如Piramiding.txt复制到终端数据目录MQL5/Files下并命名为TesterMetaProgram.txt,EA在Strategy Tester中才会加载,可用远程agent加速。
采用最小规则:每阶段只描述'应有完整订单组合',动作里检查缺哪个补哪个,如有仓则挂缺失止损/限价。不必枚举连接失败等中间态,EA一次发请求并自动重试。
阶段1挂双向BuyStop(1)/SellStop(1);触发后Delete原单并挂下一号反向止损,如Buy(1)→SellStop(2,2,Buy(1,StopLossValue),...);直到Buy(5)/Sell(5),无仓有单则Delete对应号。详见StopRev.txt。