EA逻辑过程(最终版)
1. 基本设置
交易品种:挂载在哪个图表品种(如EUR/USD、XAUUSD),就交易该品种。
时间框架:不限制,入场基于日线(D1)开盘价。
Magic Number:
做多:Magic = 111。
做空:Magic = 222。
仅管理本图表品种的订单(Symbol和Magic过滤)。
初始手数:固定0.01手。
跨日支持:支持跨日交易,日线开盘价每日更新。
2. 交易时间
默认设置:
开仓开始时间:08:00。
开仓结束时间:16:00。
跨日逻辑:
如果开始时间 > 结束时间(如17:00-08:00),允许从当天开始时间到次日结束时间开仓。
实现:
使用TimeCurrent()检查服务器时间是否在开仓范围内。
现有订单不受时间限制(可继续加仓或平仓)。
3. 波幅计算(更新)
前N天平均波幅:
计算图表上可用的前N天日线(D1)数据(N=1到7)的平均波幅(高点 - 低点,单位:点)。
如果只有1天数据,则波幅 = 当天高点 - 低点;2天则取2天平均,依次类推,最多7天。
公式:AvgVolatility = Σ(High[i] - Low[i]) / N,其中i为前1到N天。
图表显示:
在图表左上角显示:N-Day Avg Volatility: XXXX points(N为实际天数)。
每Tick更新。
实现:
使用iBars(Symbol(), PERIOD_D1)检查可用K线数量。
遍历前1到min(7, 可用天数)的日线数据,计算平均波幅。
挂载7天后自然累积7天数据,无需特殊处理。
4. 入场条件
买入(做多):
当前价格(Bid) >= 日线开盘价 + EntryPoints(默认300点,用户可设置)。
当前时间在开仓时间范围内。
无现有做多订单(Magic = 111)。
开仓:0.01手买单(Magic = 111)。
卖出(做空):
当前价格(Bid) <= 日线开盘价 - EntryPoints(默认300点,用户可设置)。
当前时间在开仓时间范围内。
无现有做空订单(Magic = 222)。
开仓:0.01手卖单(Magic = 222)。
实现:
使用iOpen(Symbol(), PERIOD_D1, 0)获取日线开盘价。
使用OrderSend开仓。
5. 马丁加仓策略
策略选择:
策略一:波幅 ≤ 3000点(用户可设置,0为禁用)。
策略二:波幅 ≤ 6000点(用户可设置,0为禁用)。
策略三:波幅 ≤ 10000点(用户可设置,0为禁用)。
优先级:选择最低满足条件的阈值(例如波幅2000点,仅触发策略一)。
根据N天平均波幅选择策略:
加仓参数:
加仓倍数:1.05。
加仓间隔:300点(报价点数)。
最大加仓次数:30次。
整体止盈:100点(报价点数)。
锁仓:用户设置(true/false)。
加仓倍数:1.08。
加仓间隔:200点(报价点数)。
最大加仓次数:40次。
整体止盈:100点(报价点数)。
锁仓:用户设置(true/false)。
加仓倍数:1.1。
加仓间隔:100点(报价点数,如EUR/USD的0.0100,XAUUSD的1.00)。
最大加仓次数:50次。
整体止盈:100点(报价点数)。
锁仓:用户设置(true/false)。
策略一:
策略二:
策略三:
加仓逻辑(以做多为例):
遍历订单,获取最新订单的开仓价和手数。
使用OrderSend开新订单。
新手数 = 最后订单手数 × 加仓倍数(1.1/1.08/1.05)。
示例:初始0.01手,策略一加仓后为0.011手,再加仓为0.0121手。
已有做多订单(Magic = 111)。
当前价格(Bid) <= 最后订单开仓价 - 加仓间隔(100/200/300点)。
未达到最大加仓次数(50/40/30)。
触发条件:
加仓手数:
实现:
达到最大加仓次数:
遍历订单,计算总手数。
使用OrderSend开多笔反向订单,按0.1手拆分。
设置标志位,停止监控锁仓后的订单。
如果锁仓 = false:不执行锁仓,订单继续等待止盈或移动止损。
如果锁仓 = true:
EA停止监控所有订单(Magic = 111和222),等待人工处理。
计算同方向订单总手数(例如做多50次后总手数为X)。
开反向订单(Magic = 222),使用固定0.1手单位:
示例:总手数2.01手 → 开20笔0.1手 + 1笔0.01手(共21笔卖单,Magic = 222)。
整数部分:每0.1手开一笔订单(例如总手数2.01手,开20笔0.1手)。
剩余部分:不足0.1手直接开对应手数(例如0.01手开1笔0.01手)。
清除止盈价:将所有同方向订单(Magic = 111)的止盈(TP)设为0(使用OrderModify)。
锁仓手数:
锁仓后处理:
停止加仓。
锁仓逻辑:
实现:
6. 出场条件(更新)
整体止盈:
如果总盈利(包括点差、佣金、利息) >= 100点(转换为账户货币),关闭所有同方向订单。
订单的TP优先触发,整体止盈作为备用。
做多(Magic = 111):
做空(Magic = 222):
每次加仓后重新计算平均止盈价,更新所有同方向订单的TP(使用OrderModify)。
平均开仓价 = Σ(订单开仓价 × 手数) / 总手数。
止盈价(TP) = 平均开仓价 + 0.0100(EUR/USD)或1.00(XAUUSD)。
止盈价(TP) = 平均开仓价 - 0.0100(EUR/USD)或1.00(XAUUSD)。
100点止盈指报价点数(例如EUR/USD的0.0100,XAUUSD的1.00)。
计算平均止盈价格:
整体平仓:
移动止损(更新):
如果EnableTrailingStop = false,不执行移动止损。
遍历所有订单(Magic = 111或222),计算浮盈(OrderProfit()或当前价格 - 开仓价)。
如果浮盈 >= TrailingStopPoints,设置或更新SL(使用OrderModify)。
初始止损(SL):
动态调整:
做多:SL = 当前价格 - TrailingStopPoints(例如Bid=1.2100,SL=1.2050)。
做空:SL = 当前价格 + TrailingStopPoints(例如Ask=1.2000,SL=1.2050)。
做多:新SL = 当前价格 - TrailingStopPoints.
做空:新SL = 当前价格 + TrailingStopPoints.
每当价格朝有利方向移动10点(报价点数,例如EUR/USD的0.0010,XAUUSD的0.10),更新SL:
10点调整间隔确保频繁更新但不过于敏感。
对所有订单(Magic = 111或222)应用移动止损。
当订单浮盈 >= TrailingStopPoints(默认50点)。
开关:用户可设置是否启用移动止损(EnableTrailingStop,默认true)。
点数:用户可设置移动止损点数(TrailingStopPoints,默认50点,报价点数,如EUR/USD的0.0050,XAUUSD的0.50)。
触发条件:
移动止损规则:
实现:
锁仓:
如果锁仓 = true:
如果锁仓 = false:
清除所有同方向订单的止盈价(TP = 0)。
开反向订单(0.1手单位,剩余不足0.1手单独开)。
EA停止监控所有订单,等待人工处理。
不锁仓,订单继续运行,等待止盈或移动止损触发.
达到最大加仓次数后:
7. 错误处理
订单管理:
确保只管理本图表品种和指定Magic的订单。
检查OrderSend和OrderModify是否成功(处理滑点、点差过大、订单限制)。
时间同步:
使用TimeCurrent()判断交易时间。
波幅计算:
检查可用日线数据(iBars),若无数据则暂停波幅相关逻辑。
逻辑流程图(文字描述)
初始化:
获取日线开盘价(iOpen(PERIOD_D1, 0))。
计算前N天平均波幅(N=1到7),显示在图表:N-Day Avg Volatility: XXXX points。
设置参数:初始手数0.01,Magic 111/222,交易时间08:00-16:00,策略参数(3000/6000/10000点,1.1/1.08/1.05倍,100/200/300点间隔,50/40/30次,100点止盈),移动止损(启用,默认50点)。
每Tick运行:
如果EnableTrailingStop = true:
如果EnableTrailingStop = false:不执行移动止损。
做多:设置SL = 当前价格 - TrailingStopPoints.
做空:设置SL = 当前价格 + TrailingStopPoints.
遍历所有订单(Magic = 111或222)。
如果订单浮盈 >= TrailingStopPoints(默认0.0050):
每当价格有利移动0.0010(10点),更新SL。
计算平均开仓价 = Σ(订单开仓价 × 手数) / 总手数。
设置止盈价:做多TP = 平均开仓价 + 0.0100,做空TP = 平均开仓价 - 0.0100。
更新所有同方向订单的TP(OrderModify)。
如果总盈利 >= 100点(账户货币),关闭所有同方向订单。
根据波幅选择策略(3000/6000/10000点)。
如果已有做多订单 且 Bid <= 最后订单价 - 加仓间隔(100/200/300点) 且 未达最大加仓次数(50/40/30):
达到最大加仓次数:
开新买单,手数 = 最后手数 × 加仓倍数(1.1/1.08/1.05)。
清除所有做多订单的止盈价(TP = 0)。
计算总手数(例如2.01手)。
开反向订单(Magic = 222):20笔0.1手 + 1笔0.01手。
停止监控所有订单,等待人工处理。
如果锁仓 = true:
如果锁仓 = false:停止加仓,等待止盈/止损。
如果Bid >= 日线开盘价 + 300点 且 无做多订单,开0.01手买单(Magic=111)。
如果Bid <= 日线开盘价 - 300点 且 无做空订单,开0.01手卖单(Magic=222)。
更新日线开盘价和N天波幅,刷新图表显示。
检查当前时间是否在开仓范围内(08:00-16:00或跨日17:00-08:00)。
入场检查:
加仓检查(以做多为例):
止盈处理:
移动止损:
做空逻辑类似。
结束:
持续监控,直到锁仓触发(停止监控)或手动移除EA。
推荐理由
移动止损(所有订单,50点默认,10点调整):
所有订单:确保每笔订单都能锁定利润,降低整体风险,适合马丁加仓策略的高订单量。
50点触发:100点止盈的一半,平衡利润锁定和趋势跟随。
10点调整:频繁但不过于敏感,适配EUR/USD和XAUUSD。
用户开关:提供灵活性,允许禁用移动止损以测试不同场景。
可调点数:用户可根据品种或策略调整(例如XAUUSD设100点,EUR/USD设30点)。
N天波幅:
使用可用数据(1到7天)计算波幅,适应EA刚挂载时的场景。
7天后自然累积完整数据,无需复杂逻辑。
锁仓:
固定0.1手单位简化手数拆分,停止监控符合“人工处理”需求。
注意事项
点数适配:
100点止盈和50点移动止损按报价点数(EUR/USD的0.0100/0.0050,XAUUSD的1.00/0.50)处理。
代码使用MarketInfo(Symbol(), MODE_POINT)自动适配5位/3位报价。
锁仓后处理:
锁仓后EA停止监控所有订单(Magic = 111和222)。建议人工处理前检查订单状态(可通过MT4终端查看)。
如果需要锁仓日志(例如记录锁仓时间、手数),请明确。
移动止损性能:
对所有订单应用移动止损可能增加OrderModify调用,代码将优化(如限制Tick频率)。
如果订单数量过多(例如50笔),建议测试性能。
波幅初始数据:
EA刚挂载时若只有1天数据,波幅可能偏低,可能触发策略一。请确认是否需要最低天数限制(例如至少3天)。
测试建议:
移动止损(所有订单,50点触发)。
锁仓(0.1手拆分,停止监控)。
N天波幅(1到7天)。
跨日时间(17:00-08:00)。
在MT4 demo账户测试EUR/USD和XAUUSD,验证:
建议测试高波幅场景(如新闻事件)和少数据场景(刚挂载1天)。
下一步
确认逻辑:
移动止损:所有订单,50点触发,10点调整,用户可设置开关和点数。
N天波幅:1到7天数据,动态计算。
锁仓:0.1手单位,锁仓后停止监控。
止盈:100点报价点数,平均止盈价写入订单。
请审阅上述逻辑,特别是:
如果需要调整(例如移动止损点数改为30点、添加锁仓日志、最低波幅天数),请告诉我。
是否编写EA:
入场、加仓、止盈、移动止损、锁仓逻辑。
N天波幅图表显示。
跨日时间处理。
错误处理(滑点、点差、订单限制)。
如果逻辑正确,我可以提供完整的MQL4代码(.mq4文件),包括:
同时提供MT4安装和回测指南。
如果你只想要伪代码或进一步优化逻辑,请明确。