MQL4 RSI交易策略无法平仓及重复开仓问题求助
MQL4 RSI自动交易策略问题修复
原策略逻辑
基于RSI指标制定交易规则:
- 当RSI值超过设定的
rsiHigh时开多单 - 当RSI值低于设定的
rsiLow时开空单 - 配置
stopLoss(固定止损)、trailPoints(追踪止损幅度)、trailOffset(追踪止损偏移量)参数控制风险
存在的问题
- 无法触发设定的止损或追踪止损平仓
- 同一方向会重复开仓,直到账户权益归零才强制平仓
代码错误分析
1. 重复开仓根源
开仓前未检查当前是否已有同方向持仓,只要RSI满足条件就重复下单,完全没有持仓过滤逻辑。
2. 平仓逻辑核心错误
ManageOrders函数遍历的是历史订单(MODE_HISTORY),而非当前活跃持仓(MODE_TRADES),导致根本找不到需要处理的正在持有的订单。
3. 持仓检查逻辑矛盾
函数内先判断如果是同方向订单就continue跳过,后面又再次判断同方向订单执行平仓,等于直接跳过了所有持仓的处理逻辑。
4. 止损/追踪止损计算错误
- 多单止损判断条件逻辑颠倒,应该判断当前价格是否跌破止损价,而非计算差价是否达标
- 追踪止损逻辑错误,没有实现止损随价格上移的功能,反而设置了错误的平仓条件
修复后的完整代码
// Define input parameters input int rsiLength = 10; input int rsiHigh = 70; // 原设置10不符合超买逻辑,调整为常规值,可自行修改 input int rsiLow = 30; // 原设置5不符合超卖逻辑,调整为常规值,可自行修改 input int stopLoss = 11; input int trailPoints = 20; input int trailOffset = 10; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| 检查当前是否有同方向持仓 //+------------------------------------------------------------------+ bool HasOpenPosition(int orderType) { for(int i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderType() == orderType) { return true; } } } return false; } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // Calculate RSI double rsiValue = iRSI(NULL, 0, rsiLength, PRICE_CLOSE, 0); // 开多单:RSI超买且无现有多单 if(rsiValue > rsiHigh && !HasOpenPosition(OP_BUY)) { OrderSend(Symbol(), OP_BUY, 1, Ask, 3, Ask - stopLoss * Point, 0, "Buy Order", 0, 0, Blue); } // 开空单:RSI超卖且无现有空单 if(rsiValue < rsiLow && !HasOpenPosition(OP_SELL)) { OrderSend(Symbol(), OP_SELL, 1, Bid, 3, Bid + stopLoss * Point, 0, "Sell Order", 0, 0, Red); } // 管理现有持仓 ManageOrders(); } //+------------------------------------------------------------------+ //| Function to manage existing orders | //+------------------------------------------------------------------+ void ManageOrders() { for(int i = OrdersTotal() - 1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() != Symbol()) continue; // 处理多单持仓 if(OrderType() == OP_BUY) { // 追踪止损逻辑:价格上涨后,止损随之上移 double currentTrailStop = Bid - trailPoints * Point; double newStopLoss = OrderOpenPrice() + trailOffset * Point; // 当当前追踪止损价高于初始止损价时,更新止损 if(currentTrailStop > newStopLoss) { if(OrderStopLoss() < currentTrailStop) { OrderModify(OrderTicket(), OrderOpenPrice(), currentTrailStop, OrderTakeProfit(), 0, Blue); } } } // 处理空单持仓 if(OrderType() == OP_SELL) { // 追踪止损逻辑:价格下跌后,止损随之下降 double currentTrailStop = Ask + trailPoints * Point; double newStopLoss = OrderOpenPrice() - trailOffset * Point; // 当当前追踪止损价低于初始止损价时,更新止损 if(currentTrailStop < newStopLoss) { if(OrderStopLoss() > currentTrailStop) { OrderModify(OrderTicket(), OrderOpenPrice(), currentTrailStop, OrderTakeProfit(), 0, Red); } } } } } }
修复说明
- 新增持仓检查函数:
HasOpenPosition用于判断当前是否已有同方向持仓,避免重复开仓 - 调整开仓逻辑:开仓前必须满足RSI条件+无同方向持仓才执行下单,同时在
OrderSend中直接设置初始止损价(原代码未设置止损,导致订单无止损) - 修正持仓管理逻辑:遍历当前活跃持仓(MODE_TRADES),而非历史订单
- 修复追踪止损逻辑:实现真正的追踪止损——当价格向盈利方向移动足够幅度后,自动上移(多单)/下移(空单)止损位,而非直接平仓
- 调整RSI默认参数:原
rsiHigh=10、rsiLow=5完全不符合常规超买超卖逻辑,调整为70/30,可根据需求自行修改
内容的提问来源于stack exchange,提问作者The Mail
相关产品推荐
相关产品推荐

