多目标EA订单策略实战指南
用元语言描述并运行限价加仓、止损反转等策略
一、交易策略的三大核心要素
任何交易策略的首要核心元素,是价格分析以及作为建仓基础的技术指标分析,我们称其为市场分析,即市场中发生的所有事情以及我们无法控制的事情。除此之外,策略还需要当前交易状况分析,包括仓位状态、挂单有无等,其结果决定我们是否平仓、移动止损、下或删挂单,这属于对自身行为的研究。通常说的跟踪止损是仓位管理函数,代表第三类要素。因此一个完整策略包含:市场分析与动作、交易情况分析与动作、仓位管理。
理解这三层结构非常重要。很多交易者只关注指标信号,却忽略了对已建仓位的动态管理,导致盈利单变亏损。订单策略主动利用挂单,正是把第二、第三类要素工程化,让EA能按规则自动应对市场变化。
- 市场分析:指标、价格形态等不可控因素
- 交易状况分析:当前仓位与挂单的组合状态
- 仓位管理:跟踪止损、盈亏平衡、加仓减仓函数
二、常见订单策略类型与原理
交易通常从初始仓位开始,可用市价建仓、双向止损单二选一触发、双向限价单二选一触发等方法。初始仓位建立后,可运用多种订单策略。使用限价订单加仓:建初始仓后同方向挂限价单,启动后设新限价单,获利平掉后删剩余挂单。止损和反转:初始仓后反方向挂止损单,止损平仓后同点挂新反转止损单,直到获利平仓。金字塔:盈利后加仓并移止损至盈亏平衡,累积大仓位获利。再建仓:止损平仓后用更大手数重建,直到获利或次数用尽。
这些策略可组合:盈利时金字塔,亏损时限价加仓,不必持续单一模式。实际编写非常耗时,不仅要写大量代码,还需对每个中间状态创意处理。本文的元语言和多目标EA正是为加快这类编程而生。
- 限价加仓:顺势补仓,摊低成本或扩大战果
- 止损反转:亏则反向,捕捉拐点
- 金字塔:盈利加仓+零风险化止损
- 再建仓:止损后加倍返还,马丁变体
三、阶段识别与基础设计原则
开发订单策略的基础原则是识别当前操作阶段并据此动作。例如:无仓位订单→建仓;有仓无单→设止损单;有仓有止损→设限价单。但若严格枚举所有中间态(如连接失败),规则将爆炸。更好的原则是:用最少信息量描述阶段,每阶段有完整目标状态描述,且一个阶段只对应一个市场动作和若干挂单动作。若需市场动作,分前后子阶段,成功后处理挂单,以便一次发出所有请求并重试失败项。
具体说,我们不必写'无仓→建仓→有仓无单→设两单'的串行,而写'无仓则建仓并试图发两单请求;有仓则检查缺哪个单就补哪个'。这样覆盖所有中间态,代码更鲁棒。该原则让策略描述从耗时创意变成规则填写。
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.
四、订单与仓位的识别技术
识别订单和仓位可用注释、魔法数字或全局变量。注释法最主要问题是长度有限且交易商可能追加内容,若空间不足你写的部分会被删。应尽量用最少字符,并以'='结尾作标志(交易商不用此标记),最多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)
六、元语言策略实例解析
限价加仓例:阶段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,)
七、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释放。结构清晰,扩展直接。
- 实盘:ProgramFileName填如LimitAdd.txt
- 测试:复制为TesterMetaProgram.txt放Files
- 信号类程序需在属性窗开启对应函数