You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MQL4 RSI交易策略无法平仓及重复开仓问题求助

MQL4 RSI自动交易策略问题修复

原策略逻辑

基于RSI指标制定交易规则:

  • 当RSI值超过设定的rsiHigh时开多单
  • 当RSI值低于设定的rsiLow时开空单
  • 配置stopLoss(固定止损)、trailPoints(追踪止损幅度)、trailOffset(追踪止损偏移量)参数控制风险

存在的问题

  1. 无法触发设定的止损或追踪止损平仓
  2. 同一方向会重复开仓,直到账户权益归零才强制平仓

代码错误分析

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);
               }
            }
         }
      }
   }
}

修复说明

  1. 新增持仓检查函数:HasOpenPosition用于判断当前是否已有同方向持仓,避免重复开仓
  2. 调整开仓逻辑:开仓前必须满足RSI条件+无同方向持仓才执行下单,同时在OrderSend中直接设置初始止损价(原代码未设置止损,导致订单无止损)
  3. 修正持仓管理逻辑:遍历当前活跃持仓(MODE_TRADES),而非历史订单
  4. 修复追踪止损逻辑:实现真正的追踪止损——当价格向盈利方向移动足够幅度后,自动上移(多单)/下移(空单)止损位,而非直接平仓
  5. 调整RSI默认参数:原rsiHigh=10、rsiLow=5完全不符合常规超买超卖逻辑,调整为70/30,可根据需求自行修改

内容的提问来源于stack exchange,提问作者The Mail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 03:12:40