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
相关产品推荐
相关产品推荐

