2025年9月26日 星期五

MT5 EA交易策略開發教學[16]

核心策略概述 (交易商品 NAS100 ) - 這是一個基於多重技術指標的當沖交易系統 - 主要使用Force Index、RVI、一目均衡表等指標 - 採用2小時時間框架進行分析,當日強制平倉 多單策略 進場條件: 1. FORCE_MultiConfirm() >= 2 (Force Index多重確認≥2個看漲信號) 2. WeekHPB >= 3 (兩週高點出現3日前以上) 3. High[1] > Highest_OHLC(5期) (創5日新高) 出場條件: 1. 達到最小獲利(點差*3)後,高點跌破一目均衡表轉換線 2. 或觸及停損點(-19600點) 3. 當沖時間(23:00或01:00)強制平倉
空單策略 進場條件: 1. RVI_死叉() (RVI主線下穿信號線) 2. RVI_HDiv_01() (RVI出現高點背離) 出場條件: 1. 達到最小獲利後,低點突破一目均衡表轉換線 2. 或觸及停損點(+19600點) 3. 當沖時間強制平倉 風控機制 1. 資金門檻:帳戶餘額< 5000時停止交易 2. 點差控制:進場前檢查點差< 商品平均點差(130點) 3. 頻率限制:每日最多1次進場,上次平倉後需間隔>1根K線 4. 手數管理:可選動態計算(基於風險百分比)或固定手數 5. 時間限制:當沖模式下18:00-01:00禁止進場 技術指標應用 1. Force Index:三組不同週期EMA/SMA,用於趨勢確認與背離檢測 2. RVI:用於空單策略的死叉與背離信號 3. 一目均衡表:主要用於出場信號的轉換線突破 4. 兩週高低點:用於多單策略的時間過濾條件

//+------------------------------------------------------------------+
//| MT5 自動交易程式 (Expert Advisor)                                                 
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>                                             // 引入 MT5 交易函數庫
#include <MagicMT5_函數庫V2.mqh>                            // 引入自定義函數庫

ENUM_TIMEFRAMES 時間週期 = PERIOD_H2; // 主要分析時間框架(2小時) ENUM_TIMEFRAMES 時間框架 = PERIOD_D1; // 相對大週期(日線)

//+------------------------------------------------------------------+ //| EA初始化函數 //+------------------------------------------------------------------+ int OnInit() { LoadEA = TimeCurrent(); // 記錄EA載入時間 return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| 主要執行函數(每個Tick執行) //+------------------------------------------------------------------+ void OnTick() { // 資金風控檢查 if(AccountInfoDouble(ACCOUNT_BALANCE) < 資金風控) { Alert("********** 資金不足 *************"); return; } // 計算當前K線編號與上次出場後的K線數 BarNumber = iBarShift(Symbol(),時間週期,LoadEA); BarSinceExit = BarNumber-CloseOrderNo; // 第一根K線時的測試交易(立即開倉後平倉) if((BarNumber == 1 && BarNumber != JudgeNo)) { 多單進場單號 = Buy_at_MARKET(Symbol(),Lots,0,0,"1st_K",MagicNumber); LX_CloseByTicket(多單進場單號,Lots); 空單進場單號 = Short_at_MARKET(Symbol(),Lots,0,0,"1st_K",MagicNumber); SX_CloseByTicket(空單進場單號,Lots); CloseOrderNo = iBarShift(Symbol(),時間週期,LoadEA); FastSma = MathMin(LenA1, LenB1); SlowSma = MathMax(LenA1, LenB1); } // 新K線處理 if(BarNumber != JudgeNo) { 換K棒(); // 更新指標數據 交易時段賦值(); // 設定交易時段 } // 獲取即時市場數據 Ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK); Bid=SymbolInfoDouble(Symbol(),SYMBOL_BID); AccountBalance=AccountInfoDouble(ACCOUNT_BALANCE); Tickvalue=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE); SP = NormalizeDouble(MathAbs(Ask-Bid),Digits()); // 計算當前點差 //+------------------------------------------------------------------+ //| 動態手數計算 //+------------------------------------------------------------------+ if(動態計算手數 == true) { Lots = get_dynamic_lot_size(是否偶數單,Symbol(),風險百分比,AccountBalance,SL); Lots = MathMin(0.3,MathMax(0.01,Lots)); // 限制手數範圍 0.01-0.3 } // 當沖模式的時間檢查 if(當沖 == true) { 接近收盤 = (getTM_hour(TimeCurrent()) >= 18 || getTM_hour(TimeCurrent()) <= 1); 允許交易時段 = (允許交易時段 && !接近收盤); } // 進場邏輯處理 if(允許交易時段 == true) { //+------------------------------------------------------------------+ //| 多單進場邏輯 //+------------------------------------------------------------------+ set_BuyCondition(); // 設定多單進場條件 // 多單進場條件檢查 if(LE_Cond == true && SP < NormalizeDouble(商品平均點差*Point(),Digits()) && // 點差檢查 最近幾筆內有空單平倉(Symbol(),6) == true) // 最近有空單平倉 { // 確保空手且不是同根K線 if(多單部位() == 0 && 空單部位() == 0 && BarNumber != OrderBarNo) { // 上次出場後間隔檢查與每日進場限制 if(BarSinceExit > 1 && EntriesToday(MagicNumber,Symbol()) < 1) { 多單進場單號 = Buy_at_MARKET(Symbol(),Lots,TP,SL,"BUY MARKET",MagicNumber); OrderBarNo = iBarShift(Symbol(),時間週期,LoadEA); } } } //+------------------------------------------------------------------+ //| 空單進場邏輯 //+------------------------------------------------------------------+ set_ShortCondition(); // 設定空單進場條件 // 空單進場條件檢查 if(SE_Cond == true && SP < NormalizeDouble(商品平均點差*Point(),Digits())) // 點差檢查 { // 確保空手且不是同根K線 if(多單部位() == 0 && 空單部位() == 0 && BarNumber != OrderBarNo) { // 上次出場後間隔檢查與每日進場限制 if(BarSinceExit > 1 && EntriesToday(MagicNumber,Symbol()) < 1) { 空單進場單號 = Short_at_MARKET(Symbol(),Lots,TP,SL,"Short Market",MagicNumber); OrderBarNo = iBarShift(Symbol(),時間週期,LoadEA); } } } } //+------------------------------------------------------------------+ //| 當沖強制平倉 //+------------------------------------------------------------------+ if(當沖 == true && (getTM_hour(TimeCurrent()) == 當沖出場時間 || getTM_hour(TimeCurrent()) == 1)) { if(多單部位() > 0 || 空單部位() > 0) { 當沖平倉(); } } 交易時段外也可停損停利(); // 執行停損停利檢查 JudgeNo = iBarShift(Symbol(),時間週期,LoadEA); // 更新判斷K線編號 } //+------------------------------------------------------------------+ //| 自訂函數區域 //+------------------------------------------------------------------+ // 多單部位計算 int 多單部位() { int count; count = get_TradeCounts(Symbol(), MagicNumber, POSITION_TYPE_BUY); return count; } // 空單部位計算 int 空單部位() { int count; count = get_TradeCounts(Symbol(), MagicNumber, POSITION_TYPE_SELL); return count; } // 換K線時的處理 void 換K棒() { // 刪除所有未成交的掛單 if(total_pending_order_count(Symbol(), MagicNumber,-1) != 0) { delete_pending_orders_all(Symbol(), MagicNumber, -1, 0x0000ff); } // 更新各時間框架的OHLC數據 Set_OHLC_Bar_Series(); // 設定K線數據序列 Set_OHLC_Day_Series(); // 設定日線數據序列 Get_OHLC_Bar(30); // 獲取30根K線數據 Get_OHLC_Day(15); // 獲取15個交易日數據 Set_OHLC_Week_Series(); // 設定週線數據序列 Get_OHLC_Week(5); // 獲取5週數據 // 計算技術指標 TwoWeekHL(); // 計算兩週高低點 set_RVI(); // 設定RVI指標 set_ICHIMOKU(); // 設定一目均衡表指標 set_FORCE_INDEX(); // 設定Force Index指標 // 計算五日平均振幅 Day5Range = ((HighD[1] - LowD[1])+(HighD[2] - LowD[2])+(HighD[3] - LowD[3]) +(HighD[4] - LowD[4])+(HighD[5] - LowD[5]))/5; } // 交易時段設定 void 交易時段賦值() { if(交易時段編號 == 45) 允許交易時段 = true; // 45代表全時段交易 } // 當沖平倉處理 void 當沖平倉() { if((getTM_hour(TimeCurrent()) == 當沖出場時間 || getTM_hour(TimeCurrent()) == 1)) { if(多單部位() > 0 && BarNumber != CloseOrderNo) LX_CloseByTicket(多單進場單號,Lots); if(空單部位() > 0 && BarNumber != CloseOrderNo) SX_CloseByTicket(空單進場單號,Lots); CloseOrderNo = iBarShift(Symbol(),時間週期,LoadEA); } } // 停損停利處理 void 交易時段外也可停損停利() { // 多單停損停利處理 if(多單部位() > 0) { double 多單最小停利 = 0.0; bool LX_MinPF = false; 多單進場價格 = LE_EntryPrice(MagicNumber,多單進場單號); 多單最小停利 = NormalizeDouble(多單進場價格 + SP*3,Digits()); LX_MinPF = Bid > 多單最小停利; // 最小獲利檢查 多單停利價格 = NormalizeDouble(多單進場價格 + TP * Point(),Digits()); 多單停損價格 = NormalizeDouble(多單進場價格 - SL * Point(),Digits()); // 出場條件:達最小獲利且跌破一目均衡表,或觸及停損 LX_Cond = ((LX_MinPF == true && CrossUnder(High[2],a_ICHI_C[2],High[1],a_ICHI_C[1])) || (Close[1] >= 多單停損價格 && Bid < 多單停損價格)); // 執行多單出場 if(LX_Cond == true && BarNumber != CloseOrderNo && LE_BarsSinceEntry(MagicNumber,多單進場單號,時間週期) > 0) { LX_CloseByTicket(多單進場單號,Lots); if(多單部位() == 0) { CloseOrderNo = iBarShift(Symbol(),時間週期,LoadEA); } } } // 空單停損停利處理 if(空單部位() > 0) { double 空單最小停利 = 0.0; bool SX_MinPF = false; 空單進場價格 = SE_EntryPrice(MagicNumber,空單進場單號); 空單最小停利 = NormalizeDouble(空單進場價格 - SP*3,Digits()); SX_MinPF = Ask < 空單最小停利; // 最小獲利檢查 空單停利價格 = NormalizeDouble(空單進場價格 - TP * Point(),Digits()); 空單停損價格 = NormalizeDouble(空單進場價格 + SL * Point(),Digits()); // 出場條件:達最小獲利且突破一目均衡表,或觸及停損 SX_Cond = ((SX_MinPF == true && CrossOver(Low[2],a_ICHI_C[2],Low[1],a_ICHI_C[1])) || (Close[1] <= 空單停損價格 && Ask > 空單停損價格)); // 執行空單出場 if(SX_Cond == true && BarNumber != CloseOrderNo && SE_BarsSinceEntry(MagicNumber,空單進場單號,時間週期) > 0) { SX_CloseByTicket(空單進場單號,Lots); if(空單部位() == 0) { CloseOrderNo = iBarShift(Symbol(),時間週期,LoadEA); } } } } //+------------------------------------------------------------------+ //| 多單進場條件設定 //+------------------------------------------------------------------+ void set_BuyCondition() { // 多單條件:Force Index多重確認≥2 且 兩週高點3日前 且 創5日新高 LE_Cond = (FORCE_MultiConfirm() >= 2 && WeekHPB >= 3 && High[1] > Highest_OHLC(Symbol(),時間週期,MODE_HIGH,5,1)); } //+------------------------------------------------------------------+ //| 空單進場條件設定 //+------------------------------------------------------------------+ void set_ShortCondition() { // 空單條件:RVI死叉 且 RVI高點背離 SE_Cond = (RVI_死叉() && RVI_HDiv_01()); } //+------------------------------------------------------------------+ //| OHLC數據處理區域 //+------------------------------------------------------------------+ double Open[], High[], Low[], Close[],Range[],Body[],UPshadow[],DNshadow[]; double OpenD[], HighD[], LowD[], CloseD[]; double OpenW[], HighW[], LowW[], CloseW[]; // 設定K線數據為時間序列 void Set_OHLC_Bar_Series() { ArraySetAsSeries(Open,true); ArraySetAsSeries(High,true); ArraySetAsSeries(Low,true); ArraySetAsSeries(Close,true); } // 獲取K線OHLC數據 void Get_OHLC_Bar(int argCount) { get_OpenData(Symbol(),時間週期,argCount,Open); get_HighData(Symbol(),時間週期,argCount,High); get_LowData(Symbol(),時間週期,argCount,Low); get_CloseData(Symbol(),時間週期,argCount,Close); } // 設定日線數據為時間序列 void Set_OHLC_Day_Series() { ArraySetAsSeries(OpenD,true); ArraySetAsSeries(HighD,true); ArraySetAsSeries(LowD,true); ArraySetAsSeries(CloseD,true); } // 獲取日線OHLC數據 void Get_OHLC_Day(int argCount) { get_OpenData(Symbol(),PERIOD_D1,argCount,OpenD); get_HighData(Symbol(),PERIOD_D1,argCount,HighD); get_LowData(Symbol(),PERIOD_D1,argCount,LowD); get_CloseData(Symbol(),PERIOD_D1,argCount,CloseD); } // 設定週線數據為時間序列 void Set_OHLC_Week_Series() { ArraySetAsSeries(OpenW,true); ArraySetAsSeries(HighW,true); ArraySetAsSeries(LowW,true); ArraySetAsSeries(CloseW,true); } // 獲取週線OHLC數據 void Get_OHLC_Week(int argCount) { get_OpenData(Symbol(),PERIOD_W1,argCount,OpenW); get_HighData(Symbol(),PERIOD_W1,argCount,HighW); get_LowData(Symbol(),PERIOD_W1,argCount,LowW); get_CloseData(Symbol(),PERIOD_W1,argCount,CloseW); } //+------------------------------------------------------------------+ //| 技術指標計算區域 //+------------------------------------------------------------------+ // 兩週高低點計算 double WeekH,WeekL,WeekHL,Week33,Week67; int WeekHPB,WeekLPB; void TwoWeekHL() { WeekH = MathMax(HighW[1],HighW[2]); // 兩週最高價 WeekL = MathMin(LowW[1],LowW[2]); // 兩週最低價 WeekHL = WeekH - WeekL; // 兩週振幅 Week33 = WeekL+WeekHL*0.33; // 33%回檔位 Week67 = WeekL+WeekHL*0.67; // 67%回檔位 WeekHPB = BarsLast(High[1] == WeekH,時間週期); // 距離最高點的K線數 WeekLPB = BarsLast(Low[1] == WeekL,時間週期); // 距離最低點的K線數 } // RVI指標設定 double a_RVI_1[], a_RVI_2[]; void set_RVI() { int h_RVI_1,h_RVI_2; h_RVI_1 = iRVI(Symbol(),時間週期,LenB1); ArraySetAsSeries(a_RVI_1, true); h_RVI_2 = iRVI(Symbol(),時間週期,LenB1); ArraySetAsSeries(a_RVI_2, true); get_IndexData(h_RVI_1,0,0,5,a_RVI_1); // 獲取RVI主線 get_IndexData(h_RVI_2,1,0,5,a_RVI_2); // 獲取RVI信號線 } // 一目均衡表指標設定 double a_ICHI_B[],a_ICHI_C[],a_ICHI_SA[],a_ICHI_SB[],a_ICHI_LC[]; void set_ICHIMOKU() { int h_ICHI_C,h_ICHI_B,h_ICHI_SA,h_ICHI_SB,h_ICHI_LC; h_ICHI_C = iIchimoku(Symbol(),時間週期,9,26,52); ArraySetAsSeries(a_ICHI_C, true); // 轉換線 h_ICHI_B = iIchimoku(Symbol(),時間週期,9,26,52); ArraySetAsSeries(a_ICHI_B, true); // 基準線 h_ICHI_SA = iIchimoku(Symbol(),時間週期,9,26,52); ArraySetAsSeries(a_ICHI_SA, true); // 先行跨度A h_ICHI_SB = iIchimoku(Symbol(),時間週期,9,26,52); ArraySetAsSeries(a_ICHI_SB, true); // 先行跨度B h_ICHI_LC = iIchimoku(Symbol(),時間週期,9,26,52); ArraySetAsSeries(a_ICHI_LC, true); // 延遲跨度 get_IndexData(h_ICHI_C,0,0,5,a_ICHI_C); // 轉換線數據 get_IndexData(h_ICHI_B,1,0,5,a_ICHI_B); // 基準線數據 get_IndexData(h_ICHI_SA,2,0,5,a_ICHI_SA); // 先行跨度A數據 get_IndexData(h_ICHI_SB,3,0,5,a_ICHI_SB); // 先行跨度B數據 get_IndexData(h_ICHI_LC,4,0,5,a_ICHI_LC); // 延遲跨度數據 } //+------------------------------------------------------------------+ //| Force Index指標完整實現 //+------------------------------------------------------------------+ double a_FORCE_A[], a_FORCE_B[], a_FORCE_C[]; // Force Index各組陣列 // Force Index指標設定 void set_FORCE_INDEX() { int h_FORCE_A, h_FORCE_B, h_FORCE_C; // 建立Force Index各組指標句柄 h_FORCE_A = iForce(Symbol(), 時間週期, LenA1, MODE_EMA, VOLUME_TICK); // A組:快速EMA ArraySetAsSeries(a_FORCE_A, true); h_FORCE_B = iForce(Symbol(), 時間週期, LenB1, MODE_EMA, VOLUME_TICK); // B組:慢速EMA ArraySetAsSeries(a_FORCE_B, true); h_FORCE_C = iForce(Symbol(), 時間週期, LenA2, MODE_SMA, VOLUME_TICK); // C組:SMA平滑 ArraySetAsSeries(a_FORCE_C, true); // 獲取Force Index數據 get_IndexData(h_FORCE_A, 0, 0, 10, a_FORCE_A); get_IndexData(h_FORCE_B, 0, 0, 10, a_FORCE_B); get_IndexData(h_FORCE_C, 0, 0, 10, a_FORCE_C); } //+------------------------------------------------------------------+ //| Force Index趨勢判斷函數 //+------------------------------------------------------------------+ int FORCE_Trend() // 返回:1=多頭, -1=空頭, 0=盤整 { // 多頭趨勢:A組B組都為正且上升 if(a_FORCE_A[1] > 0 && a_FORCE_B[1] > 0 && a_FORCE_A[1] > a_FORCE_A[2] && a_FORCE_B[1] > a_FORCE_B[2]) { return 1; // 多頭趨勢確認 } // 空頭趨勢:A組B組都為負且下降 if(a_FORCE_A[1] < 0 && a_FORCE_B[1] < 0 && a_FORCE_A[1] < a_FORCE_A[2] && a_FORCE_B[1] < a_FORCE_B[2]) { return -1; // 空頭趨勢確認 } return 0; // 盤整狀態 } //+------------------------------------------------------------------+ //| Force Index力量強度判斷 //+------------------------------------------------------------------+ int FORCE_Strength() // 返回:3=極強多頭, -3=極強空頭, 0=中性 { // 計算當前三組平均絕對值 double force_avg = (MathAbs(a_FORCE_A[1]) + MathAbs(a_FORCE_B[1]) + MathAbs(a_FORCE_C[1])) / 3; // 計算歷史4期平均作為基準 double historical_avg = 0; for(int i = 2; i <= 5; i++) { historical_avg += (MathAbs(a_FORCE_A[i]) + MathAbs(a_FORCE_B[i]) + MathAbs(a_FORCE_C[i])) / 3; } historical_avg /= 4; double strength_ratio = force_avg / (historical_avg + 0.0001); // 強度比率 // 多頭力量判斷 if(a_FORCE_A[1] > 0 || a_FORCE_B[1] > 0) { if(strength_ratio > 2.0) return 3; // 極強多頭 if(strength_ratio > 1.5) return 2; // 強多頭 if(strength_ratio > 1.0) return 1; // 中等多頭 return 0; // 弱多頭 } // 空頭力量判斷 else { if(strength_ratio > 2.0) return -3; // 極強空頭 if(strength_ratio > 1.5) return -2; // 強空頭 if(strength_ratio > 1.0) return -1; // 中等空頭 return 0; // 弱空頭 } } //+------------------------------------------------------------------+ //| Force Index零軸穿越檢測 //+------------------------------------------------------------------+ int FORCE_ZeroCross() // 返回:1=上穿零軸, -1=下穿零軸, 0=無穿越 { // A組上穿零軸(看漲信號) if(a_FORCE_A[2] < 0 && a_FORCE_A[1] > 0) { return 1; // 上穿零軸 } // A組下穿零軸(看跌信號) if(a_FORCE_A[2] > 0 && a_FORCE_A[1] < 0) { return -1; // 下穿零軸 } return 0; // 無穿越 } //+------------------------------------------------------------------+ //| Force Index背離檢測 //+------------------------------------------------------------------+ bool FORCE_Divergence(bool check_bullish = true) // true=看漲背離, false=看跌背離 { if(check_bullish) // 檢測看漲背離 { // 尋找最近5根K線的價格與Force Index低點 int price_low_bar = ArrayMinimum(Low, 1, 5); int force_low_bar = ArrayMinimum(a_FORCE_A, 1, 5); // 背離條件:價格創新低但Force Index未創新低 if(price_low_bar <= 2 && force_low_bar > 2 && Low[price_low_bar] < Low[force_low_bar] && a_FORCE_A[price_low_bar] > a_FORCE_A[force_low_bar]) { return true; // 看漲背離確認 } } else // 檢測看跌背離 { // 尋找最近5根K線的價格與Force Index高點 int price_high_bar = ArrayMaximum(High, 1, 5); int force_high_bar = ArrayMaximum(a_FORCE_A, 1, 5); // 背離條件:價格創新高但Force Index未創新高 if(price_high_bar <= 2 && force_high_bar > 2 && High[price_high_bar] > High[force_high_bar] && a_FORCE_A[price_high_bar] < a_FORCE_A[force_high_bar]) { return true; // 看跌背離確認 } } return false; // 無背離 } //+------------------------------------------------------------------+ //| Force Index突破檢測 //+------------------------------------------------------------------+ int FORCE_Breakout() // 返回:2=強力突破, 1=一般突破, -2=強力破位, 0=無突破 { // 計算Force Index歷史高低點(排除最近2期) double force_high = ArrayMaximum(a_FORCE_A, 2, 8); double force_low = ArrayMinimum(a_FORCE_A, 2, 8); // 強力向上突破(超越歷史高點120%) if(a_FORCE_A[1] > force_high * 1.2) { return 2; // 強力突破 } // 一般向上突破 else if(a_FORCE_A[1] > force_high) { return 1; // 一般突破 } // 強力向下破位 else if(a_FORCE_A[1] < force_low * 1.2) { return -2; // 強力破位 } // 一般向下破位 else if(a_FORCE_A[1] < force_low) { return -1; // 一般破位 } return 0; // 無突破 } //+------------------------------------------------------------------+ //| Force Index多重確認綜合判斷 //+------------------------------------------------------------------+ int FORCE_MultiConfirm() // 返回:3=強烈看漲, 2=看漲, 1=弱看漲, -3=強烈看跌, 0=中性 { int bullish_signals = 0; // 看漲信號計數 int bearish_signals = 0; // 看跌信號計數 // 收集看漲信號 if(FORCE_Trend() == 1) bullish_signals++; // 多頭趨勢 if(FORCE_ZeroCross() == 1) bullish_signals++; // 上穿零軸 if(FORCE_Divergence(true)) bullish_signals++; // 看漲背離 if(FORCE_Breakout() > 0) bullish_signals++; // 向上突破 if(FORCE_Strength() > 0) bullish_signals++; // 多頭力量 // 收集看跌信號 if(FORCE_Trend() == -1) bearish_signals++; // 空頭趨勢 if(FORCE_ZeroCross() == -1) bearish_signals++; // 下穿零軸 if(FORCE_Divergence(false)) bearish_signals++; // 看跌背離 if(FORCE_Breakout() < 0) bearish_signals++; // 向下破位 if(FORCE_Strength() < 0) bearish_signals++; // 空頭力量 // 根據信號強度判斷 if(bullish_signals >= 4) return 3; // 強烈看漲(4-5個信號) if(bullish_signals == 3) return 2; // 看漲(3個信號) if(bullish_signals == 2) return 1; // 弱看漲(2個信號) if(bearish_signals == 2) return -1; // 弱看跌(2個信號) if(bearish_signals == 3) return -2; // 看跌(3個信號) if(bearish_signals >= 4) return -3; // 強烈看跌(4-5個信號) return 0; // 中性(信號不足或抵消) } //+------------------------------------------------------------------+ //| RVI指標相關函數 //+------------------------------------------------------------------+ // RVI死叉檢測 bool RVI_死叉() { // RVI主線下穿信號線 if(a_RVI_1[2] >= a_RVI_2[2] && a_RVI_1[1] < a_RVI_2[1]) { return true; // 死叉確認 } return false; } // RVI高點背離檢測 bool RVI_HDiv_01() { // 價格高點在最近2根K線,RVI高點在更早期間,且RVI當前值較低 if((ArrayMaximum(High) !=0 && ArrayMaximum(High) <= 2) && (ArrayMaximum(a_RVI_1) > 2) && a_RVI_1[1] < 0.5) { return true; // 高點背離確認 } return false; }

回測結果
測試參數交易商品:NAS100(那斯達克指數)
樣本內區間:2019/1/1 ~ 2023/8/31
交易手數:固定 1 手
時間框架:H2 小時圖表
交易模式:當沖交易


沒有留言:

張貼留言