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

MT5 Ichimoku策略:如何添加近期SpanA穿越SpanB的判断逻辑

解决Ichimoku云近期穿越判断的方案

要捕捉SpanA(先行线A)和SpanB(先行线B)的近期穿越事件,核心思路是对比相邻K线的SpanA/SpanB关系,判断是否在指定时间窗口内发生了金叉(做多信号)或死叉(做空信号),而非仅判断当前的大小关系。

具体实现步骤

  • 定义需要检测的穿越时间窗口(比如最近5根K线,可根据策略灵活调整)
  • 复制足够的SpanA和SpanB历史数据,覆盖检测窗口范围
  • 遍历历史数据,检查窗口内是否发生金叉/死叉
  • 将穿越条件整合到原策略的入场逻辑中

修改后的MQL5代码

#ifdef __MQL5__
    double  buf[];
    ArraySetAsSeries(buf, true);
    CopyBuffer(mHandle, SENKOUSPANA_LINE, -26, 56, buf); //Leading SpanA -26 captures begining of cloud
    double  spanAF  =   buf[1]; // 1 Front of cloud
    double   spanAch  =  buf[4];
    double  spanAC  =   buf[27];
    double  spanAP  =   buf[52];
    
    // --- 新增:复制SpanA历史数据用于检测穿越 ---
    double spanA_history[];
    // 复制最近10根K线的SpanA数据(窗口设为5的话,多取数据确保覆盖)
    CopyBuffer(mHandle, SENKOUSPANA_LINE, -26, 10, spanA_history);
    ArraySetAsSeries(spanA_history, true);

    CopyBuffer(mHandle, SENKOUSPANB_LINE, -26, 56, buf); //Leading SpanB 52 units 
    double  spanBF  =   buf[1];
    double  spanBch =   buf[4]; 
    double  spanBC  =   buf[27];
    double   spanBP   =  buf[52]; //51
    
    // --- 新增:复制SpanB历史数据用于检测穿越 ---
    double spanB_history[];
    CopyBuffer(mHandle, SENKOUSPANB_LINE, -26, 10, spanB_history);
    ArraySetAsSeries(spanB_history, true);

    CopyBuffer(mHandle,TENKANSEN_LINE,0,3,buf);       //Conversion Line
    double ConvLine = buf[1];
    CopyBuffer(mHandle,KIJUNSEN_LINE,0,3,buf);        //Base Line 26 periods
    double BaseLine = buf[1];
    CopyBuffer(mHandle,CHIKOUSPAN_LINE,0,28,buf);      //Lagging indicator
    double LagLine = buf[27];
    
#endif 

//  Closing prices
double  close1  =   iClose(mSymbol, mTimeframe, 1);
double  close2  =   iClose(mSymbol, mTimeframe, 2);

double  tp  =   spanBC;
//double    sl  =   (spanA1<spanB) ?
//                      (mLastTick.bid*2)-spanB :
//                      (mLastTick.ask*2)-spanB;

double tpb = iClose(mSymbol, mTimeframe, 0) +.00200;
double slb = iClose(mSymbol, mTimeframe, 0) -.00200;

double tps = iClose(mSymbol, mTimeframe, 0) -.00200;
double sls = iClose(mSymbol, mTimeframe, 0) +.00100;


if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY )
 {
  tp = tpb;
 }

if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL )
 {
  tp = tps;
 }



Recount();
if (mCount>0) {
    UpdateTPSL(tp);
    Recount();
}

if (mCount>0) return;   // Test again in case of close above

// --- 新增:检测近期穿越事件 ---
bool recent_bullish_cross = false; // 近期金叉(SpanA上穿SpanB)
bool recent_bearish_cross = false; // 近期死叉(SpanA下穿SpanB)
int lookback_window = 5; // 检测最近5根K线内的穿越

for(int i=1; i<=lookback_window; i++){
    // 金叉判断:前一根SpanA < SpanB,当前SpanA > SpanB
    if(spanA_history[i] < spanB_history[i] && spanA_history[i-1] > spanB_history[i-1]){
        recent_bullish_cross = true;
        break;
    }
    // 死叉判断:前一根SpanA > SpanB,当前SpanA < SpanB
    if(spanA_history[i] > spanB_history[i] && spanA_history[i-1] < spanB_history[i-1]){
        recent_bearish_cross = true;
        break;
    }
}

// --- 修改入场条件:加入近期穿越判断 ---
if(close1>spanAC && close1>spanBC && ConvLine > BaseLine && LagLine > spanAP  && LagLine > spanBP && recent_bullish_cross ){
    Trade.Buy(mOrderSize, mSymbol, 0, slb, tpb, mTradeComment);
} else

if(close1<spanAC && close1<spanBC && ConvLine < BaseLine && LagLine < spanAP  && LagLine < spanBP && recent_bearish_cross ){
    Trade.Sell(mOrderSize, mSymbol, 0, sls, tps, mTradeComment);
}

return; 

关键说明

  • lookback_window:可自定义调整,数值越小越严格,比如设为3则仅捕捉最近3根K线内的穿越事件
  • 穿越判断逻辑:通过对比相邻K线的SpanA和SpanB数值,确认交叉的方向(金叉/死叉)
  • 替换原代码中直接判断spanAF>spanBF/spanAF<spanBF的逻辑,改为检测近期穿越事件,确保只在趋势初期触发入场

内容的提问来源于stack exchange,提问作者Leo Torres

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 01:12:30