2026年2月23日 星期一

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

核心策略概述(商品 XAUUSD)
這是一個基於 三線趨勢突破 和 Williams %R 看跌背離反轉 的黃金日內交易策略,結合多空條件判斷、MACD/均線出場機制和移動停損管理。

基礎概念
商品平均點差限制:進場前檢查點差 < 商品平均點差 × Point()
資金風控門檻:低於門檻時執行完整清倉(刪除掛單 → 平倉部位 → 退出 EA)
動態手數計算:根據風險百分比與止損距離計算交易手數(限制範圍:0.01 - 0.3 手)

交易限制
每日限制 1 次進場:EntriesToday(MagicNumber, Symbol()) < 1
點差控制:進場前檢查點差 < 商品平均點差 × Point()
交易時段限制:04:00 - 20:00
BarSinceExit > 1:平倉後至少間隔 1 根 K 棒才能再進場
最小止損保護:SL = MathMax(SL, 最小止損),防止止損過小被伺服器拒絕
同根 K 棒限制:BarNumber != OrderBarNo(同一根 K 棒不重複下單)

進場策略
多單進場條件
LE_Cond = (TrendDir3L == 1 && Close[1] > Max3L && a_Avg7[1] > a_Avg13[1])
條件分析:

三線方向確認:TrendDir3L == 1,三線整體方向為多頭(上升趨勢)
關鍵壓力突破:Close[1] > Max3L,收盤價突破三線最高值,確認多頭結構成立
短均線多頭排列:a_Avg7[1] > a_Avg13[1],7 期均線位於 13 期均線上方,趨勢動能確認
進場方式: 掛單突破買入(Buy_at_STOP)
買入價格計算:
BuyPrice = POC_價格 + a_ATR[2] × 0.382

計算公式:POC(成交量集中點)+ ATR × 0.382(費波那契比例)

額外條件:
Close[1] < 買入價格:當前 K 棒收盤價低於買入價格(確保是向上突破)
getTM_hour(TimeCurrent()) != 商品收盤時間:非商品收盤時間
掛單有效期:3600 秒(1 小時)

空單進場條件
SE_Cond = (WPR_Divergence(false) == true && Close[1] < (High[1]+Low[1])/2 && DayHPB >= 3)
條件分析:

Williams %R 看跌背離:WPR_Divergence(false) == true,價格創新高但 Williams %R 指標未創新高,上漲動能衰竭信號
K 棒收盤位置過濾:Close[1] < (High[1]+Low[1])/2,收盤價位於當根 K 棒下半部,空方壓力強
三日高點時間確認:DayHPB >= 3,三日高點距今已超過 3 個交易日,高點已確立、向下反轉機率提高

進場方式: 掛單突破賣出(Short_at_STOP)
賣出價格計算:
ShortPrice = VWAP_價格 - a_ATR[2] × 0.236

計算公式:VWAP(成交量加權平均價格)- ATR × 0.236(費波那契比例)

額外條件:
Close[1] > 賣出價格:當前 K 棒收盤價高於賣出價格(確保是向下突破)
getTM_hour(TimeCurrent()) != 商品收盤時間:非商品收盤時間
掛單有效期:3600 秒(1 小時)

出場策略
多單出場
停損停利設定:

停利:進場價 + TP × Point()
停損:進場價 - SL × Point()
最小停利:進場價 + 點差 × 3

移動停損(啟用時):
觸發條件:進場後最高價 > 進場價 + TP × 0.3
停損調整為:最高價 - SL × Point()

多單出場方式 :
主要出場條件:
LX_Cond = (LX_MinPF == true && CrossUnder(a_MACD[2],0,a_MACD[1],0))
       || (Close[1] >= 多單停損價格 && Bid < 多單停損價格)

出場條件 1:已達最小利潤(覆蓋 3 倍點差)且 MACD 由正轉負向下穿越零軸(動能轉弱,獲利了結)
出場條件 2:價格向下跌破停損價(觸及停損,嚴格執行風控)

空單出場
停損停利設定:
停利:進場價 - TP × Point()
停損:進場價 + SL × Point()
最小停利:進場價 - 點差 × 3

移動停損(啟用時):
觸發條件:進場後最低價 < 進場價 - TP × 0.3
停損調整為:最低價 + SL × Point()

空單出場方式:
主要出場條件:
SX_Cond = (SX_MinPF == true && CrossOver(Close[2],a_Avg7[2],Close[1],a_Avg7[1]))
       || (Close[1] <= 空單停損價格 && Ask > 空單停損價格)

出場條件 1:已達最小利潤(覆蓋 3 倍點差)且收盤價由下向上穿越 7 期均線(空單動能衰竭,獲利了結)
出場條件 2:價格向上突破停損價(觸及停損,嚴格執行風控)

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

ENUM_TIMEFRAMES  時間週期 = PERIOD_M15; // EA 主要運行的時間週期。
ENUM_TIMEFRAMES  時間框架 = PERIOD_H1; // 相對大週期,可能用於趨勢判斷或過濾

//+------------------------------------------------------------------+
//| EA 初始化函數,當 EA 載入圖表時執行一次                             |
//+------------------------------------------------------------------+
int OnInit()
  {
   LoadEA = TimeCurrent(); // 記錄 EA 啟動時的當前伺服器時間
   return(INIT_SUCCEEDED); // 初始化成功,返回成功代碼
  }

//+------------------------------------------------------------------+
//| 報價驅動函數:每當價格跳動(Tick)時即執行一次                       |
//+------------------------------------------------------------------+
void OnTick()
  {
   // 資金風控檢查:若帳戶餘額低於設定的「資金風控」值,則停止執行並報警
   if(AccountInfoDouble(ACCOUNT_BALANCE) < 資金風控)
     {
      Alert("**********  資金不足 *************");

      // 執行完整清倉程序:刪除掛單 → 平倉部位 → 移除 EA
      
      // 第一步:刪除所有未成交的掛單
      if(total_pending_order_count(Symbol(), MagicNumber,-1) != 0)
        {
         delete_pending_orders_all(Symbol(), MagicNumber, -1, 0x0000ff);
        }
      // 第二步:平倉所有持倉部位
      if(多單部位() > 0 && BarNumber != CloseOrderNo)
         LX_CloseByTicket(多單進場單號,Lots) ;
      if(空單部位() > 0 && BarNumber != CloseOrderNo)
         SX_CloseByTicket(空單進場單號,Lots) ;
      // 第三步:強制移除 EA,停止自動交易
      ExpertRemove();     

      return;
     }

   // 計算當前 K 棒相對於 EA 啟動時間 (LoadEA) 的位置編號
   BarNumber = iBarShift(Symbol(),時間週期,LoadEA);
   // 計算自上次平倉後經過了多少根 K 棒
   BarSinceExit = BarNumber-CloseOrderNo ;
   
   // 特殊邏輯:當處於啟動後的第一根 K 棒且尚未標記過 JudgeNo 時執行
   if((BarNumber == 1 && BarNumber != JudgeNo))
     {
      // 進行首根 K 棒的測試性進出場(市價買入後立即平倉),TP/SL 使用 2 倍值確保成交
      多單進場單號 = Buy_at_MARKET(Symbol(),Lots,TP*2,SL*2,"1st_K",MagicNumber) ;
      LX_CloseByTicket(多單進場單號,Lots) ;
      空單進場單號 = Short_at_MARKET(Symbol(),Lots,TP*2,SL*2,"1st_K",MagicNumber) ;
      SX_CloseByTicket(空單進場單號,Lots) ;
      // 紀錄平倉時的 K 棒編號
      CloseOrderNo =  iBarShift(Symbol(),時間週期,LoadEA);
      // 初始化快慢均線參數,確保 FastSma 為較小值,SlowSma 為較大值
      FastSma = MathMin(LenA1, LenB1);
      SlowSma = MathMax(LenA1, LenB1);
     }

   // 換 K 棒偵測:當 K 棒編號改變時,執行定時更新函數
   if(BarNumber != JudgeNo)
     {
      換K棒(); // 執行自訂的換 K 邏輯(刪除掛單、更新 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()) ; // 計算當前點差(Ask-Bid 的絕對值)

//+------------------------------------------------------------------+
//| 計算交易手數:根據風險比例或固定手數進行動態調整                       |
//+------------------------------------------------------------------+
   if(動態計算手數 == true)
     {
      // 呼叫外部函數計算手數,通常基於止損距離(SL)與風險百分比
      Lots = get_dynamic_lot_size(是否偶數單,Symbol(),風險百分比,AccountBalance,SL) ;
      // 限制手數區間,最小 0.01 手,最高不超過 0.3 手,防止超量交易
      Lots = MathMin(0.3,MathMax(0.01,Lots)) ;
     }

   // 交易時段判斷:只有在允許交易的時段內才執行進場邏輯
   if(允許交易時段 == true)
     {
      //+------------------------------------------------------------------+
      //| 多單進場邏輯區塊                                                  |
      //+------------------------------------------------------------------+
      // 確保止損點數不低於最小止損要求,避免滑價或點差過大導致無效止損
      SL = MathMax(SL,最小止損)  ;
      set_BuyCondition(); // 載入多單過濾條件
      
      // 判斷條件:符合進場信號、點差小於平均值
   // if(LE_Cond == true && SP < NormalizeDouble(商品平均點差*Point(),Digits()) && 最近幾筆內有空單平倉(Symbol(),6) == true)
      if(LE_Cond == true && SP < NormalizeDouble(商品平均點差*Point(),Digits()))
        {
         // 確保當前無多空部位,且同一根 K 棒內不重複下單
         if(多單部位() == 0 && 空單部位() == 0 && BarNumber != OrderBarNo)
           {
            // 計算買入價格(依據模組設定)
            買入價格 = Get_BuyPrice() ;

            // 進場冷卻限制:距離上次平倉需超過 1 根 K 棒,且今日下單次數小於 1(每日限一單)
            if(BarSinceExit > 1 && EntriesToday(MagicNumber,Symbol()) < 1)
              {
                     // 額外檢查:當前 K 棒收盤價低於買入價格,且非商品收盤時間,才設置掛單
                     if(Close[1] < 買入價格 && getTM_hour(TimeCurrent()) != 商品收盤時間)
                       {
                        // 空手狀態下執行 STOP 掛單買入(突破買入),TP/SL 使用 2 倍值,有效期 3600 秒(1 小時)
                        多單進場單號 = Buy_at_STOP(Symbol(),MagicNumber,買入價,Lots,TP*2,SL*2,"BUY STOP",3600) ;
                        OrderBarNo = iBarShift(Symbol(),時間週期,LoadEA); // 紀錄下單時的 K 棒編號
                       }
              } // end of BarSinceExit > 1
           } // end of 空手且不同根K棒() == true
        } // end of LE_Cond == true
        
      //+------------------------------------------------------------------+
      //| 空單進場邏輯區塊                                                  |
      //+------------------------------------------------------------------+
      set_ShortCondition() ; // 載入空單過濾條件
      
      // 判斷條件:符合進場信號、點差在合理範圍內
      if(SE_Cond == true && SP < NormalizeDouble(商品平均點差*Point(),Digits()))
        {
         // 確保當前無多空部位,且同一根 K 棒內不重複下單
         if(多單部位() == 0 && 空單部位() == 0 && BarNumber != OrderBarNo)
           {
            // 計算賣出價格(依據模組設定)
            賣出價格 = Get_ShortPrice();

            // 進場冷卻與每日交易次數限制
            if(BarSinceExit > 1 && EntriesToday(MagicNumber,Symbol()) < 1)
              {
                     // 額外檢查:當前 K 棒收盤價高於賣出價格,且非商品收盤時間,才設置掛單
                     if(Close[1] > 賣出價格 && getTM_hour(TimeCurrent()) != 商品收盤時間)
                       {
                        // 空手狀態下執行 STOP 掛單賣出(突破賣出),TP/SL 使用 2 倍值,有效期 3600 秒(1 小時)
                        空單進場單號 = Short_at_STOP(Symbol(),MagicNumber,賣出價格,Lots,TP*2,SL*2,"Short STOP",3600) ;
                        OrderBarNo = iBarShift(Symbol(),時間週期,LoadEA); // 紀錄下單時的 K 棒編號
                       }
              } //end of BarSinceExit > 1
           } // end of 空手且不同根K棒() == true
        } // end of SE_Cond == true
     } //end of 允許交易時段 == true

   // 無論是否在交易時段內,皆持續監控部位的停損與停利(保護部位)
   交易時段外也可停損停利();
   // 更新判斷編號,用於判斷下次 Tick 是否為新 K 棒
   JudgeNo = iBarShift(Symbol(),時間週期,LoadEA);

  } //end of onTick


//+------------------------------------------------------------------+
//|        自訂函數庫                                                  |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| 自訂函數:計算當前持有的多單部位數量                                 |
//+------------------------------------------------------------------+
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棒()
  {
   // 每逢新 K 棒,清除該 MagicNumber 下的所有未成交掛單
   if(total_pending_order_count(Symbol(), MagicNumber,-1) != 0)
     {
      delete_pending_orders_all(Symbol(), MagicNumber, -1, 0x0000ff);
     }
   
   // 更新 K 線數據數組(Bar 級別與 Day 級別)
   Set_OHLC_Bar_Series(); // 保留:設定 Bar 層級 OHLC 陣列
   Set_OHLC_Day_Series(); // 保留:設定 Day 層級 OHLC 陣列
   Get_OHLC_Bar(30) ; // 保留:取得最近 30 根 K 棒數據
   Get_OHLC_BigBar(15) ; // 保留:取得最近 15 根大週期 K 棒數據
   Get_OHLC_Day(15) ; // 保留:取得最近 15 天數據
   set_BarInfo(); // 保留:設定 K 棒相關資訊
   set_ATR(); // 保留:計算 ATR 指標(平均真實波幅)

   // 計算技術指標
   set_MACD(); // 計算 MACD 指標(指數平滑異同移動平均線)
   set_ThreeLine() ; // 計算三線指標(快中慢三條均線)
   ThreeDayHL(); // 計算三日高低點
   FixBarHL(); // 計算固定 K 棒數內的高低點

   // ***************
   set_WILLIAMS_PR() ; // 計算威廉指標(Williams %R),用於超買超賣與背離偵測

   計算VWAP() ; // 計算 VWAP(成交量加權平均價格),作為盤中價格錨定參考
   計算POC() ; // 計算 POC(成交量集中點),作為關鍵支撐壓力參考

   // 計算最近 5 天的平均波動範圍 (Daily Range)
   Day5Range = ((HighD[1] - LowD[1])+(HighD[2] - LowD[2])+(HighD[3] - LowD[3])+(HighD[4] - LowD[4])+(HighD[5] - LowD[5]))/5;
  }

//+------------------------------------------------------------------+
//| 自訂函數:設定允許交易的時段                                         |
//+------------------------------------------------------------------+
void 交易時段賦值()
  {
   // 交易時段編號 :允許交易時段為上午 4:00 至 晚上 20:00
      允許交易時段 = (getTM_hour(TimeCurrent()) >= 4 && getTM_hour(TimeCurrent()) < 20);
  }

//+------------------------------------------------------------------+
//| 自訂函數:核心監控 - 處理停損、停利、移動止損                         |
//+------------------------------------------------------------------+
void 交易時段外也可停損停利()
  {
   // --- 多單監控區 ---
   // 無論是否在交易時段,只要持有多單就持續監控
   if(多單部位() > 0)
     {
      //+------------------------------------------------------------------+
      //| 多單出場方法 (Buy Exit Method)                                    |
      //+------------------------------------------------------------------+
      double 多單最小停利 = 0.0, 多單保本價格 = 0.0 ;
      bool LX_MinPF = false, LongPull = false ;
      
      // 取得多單進場價格並計算各項價格線
      多單進場價格 = LE_EntryPrice(MagicNumber,多單進場單號);
      多單最小停利 = NormalizeDouble(多單進場價格 + SP*3,Digits()) ; // 至少需覆蓋 3 倍點差才算最小利潤
      LX_MinPF = Bid > 多單最小停利 ; // 判斷是否已達最小利潤
      多單停利價格 = NormalizeDouble(多單進場價格 + TP * Point(),Digits()) ; // 計算停利價格
      多單停損價格 = NormalizeDouble(多單進場價格 - SL * Point(),Digits()) ; // 計算停損價格

      // 多單移動停損設定
      if(移動停損利 == true)
        {
         // 找出進場後出現的最高價(從進場 K 棒後開始計算)
         多單最高價 = iHigh(Symbol(),時間週期, iHighest(Symbol(),時間週期,MODE_HIGH,LE_BarsSinceEntry(MagicNumber,多單進場單號,時間週期),1));
         多單最高價 = NormalizeDouble(多單最高價,Digits()) ;

         // 若目前獲利已超過 TP 的 30%,則將停損線向上拉升(跟隨最高價回撤 SL 點位)
         if(多單最高價 > (多單進場價格+TP * Point()*0.3))
            多單停損價格 = NormalizeDouble(多單最高價 - SL * Point(),Digits()) ;
        }
         // 出場條件:(已達最小利潤 且 MACD 由正轉負向下穿越零軸) 或 (價格觸及停損線)
         LX_Cond = ((LX_MinPF == true && CrossUnder(a_MACD[2],0,a_MACD[1],0)) || (Close[1] >= 多單停損價格 && Bid < 多單停損價格)) ;
        }

      //---------------------------------------------------------多單出場執行
      // 確認出場條件成立、不在同一根 K 棒重複平倉、且已持倉超過 0 根 K 棒
      if(LX_Cond == true && BarNumber != CloseOrderNo && LE_BarsSinceEntry(MagicNumber,多單進場單號,時間週期) > 0)
        {
         // 執行平倉操作
         LX_CloseByTicket(多單進場單號,Lots) ;

         // 若多單已完全平倉,記錄平倉時的 K 棒編號
         if(多單部位() == 0)
           {
            CloseOrderNo = iBarShift(Symbol(),時間週期,LoadEA) ;
           }
        }
     } // end of 多單部位() > 0

   // --- 空單監控區 ---
   if(空單部位() > 0)
     {
      //+------------------------------------------------------------------+
      //| 空單出場方法 (Short Exit Method)                                  |
      //+------------------------------------------------------------------+
      double 空單最小停利 = 0.0, 空單保本價格 = 0.0 ;
      bool SX_MinPF = false, ShortPull = false ;
      
      // 取得空單進場價格並計算各項價格線
      空單進場價格 = SE_EntryPrice(MagicNumber,空單進場單號);
      空單最小停利 = NormalizeDouble(空單進場價格 - SP*3,Digits()) ; // 至少需覆蓋 3 倍點差才算最小利潤
      SX_MinPF = Ask < 空單最小停利 ; // 判斷是否已達最小利潤
      空單停利價格 = NormalizeDouble(空單進場價格 - TP * Point(),Digits()) ; // 計算停利價格
      空單停損價格 = NormalizeDouble(空單進場價格 + SL * Point(),Digits()) ; // 計算停損價格

      // 空單移動停損設定
      if(移動停損利 == true)
        {
         // 找出進場後出現的最低價(從進場 K 棒後開始計算)
         空單最低價 = iLow(Symbol(),時間週期, iLowest(Symbol(),時間週期,MODE_LOW,SE_BarsSinceEntry(MagicNumber,空單進場單號,時間週期),1));
         空單最低價 = NormalizeDouble(空單最低價,Digits()) ;
         // 若獲利超過 TP 的 30%,停損線向下移(跟隨最低價上升 SL 點位)
         if(空單最低價 < (空單進場價格-TP * Point()*0.3))
            空單停損價格 = NormalizeDouble(空單最低價 + SL * Point(),Digits()) ;
        }

      // 空單出場方式 :收盤價向上穿越 7 均線 + 已達最小利潤,或觸及停損價
         SX_Cond = ((SX_MinPF == true && CrossOver(Close[2],a_Avg7[2],Close[1],a_Avg7[1])) || (Close[1] <= 空單停損價格 && Ask > 空單停損價格)) ;
        }

      //---------------------------------------------------------空單出場執行
      // 確認出場條件成立、不在同一根 K 棒重複平倉、且已持倉超過 0 根 K 棒
      if(SX_Cond == true && BarNumber != CloseOrderNo && SE_BarsSinceEntry(MagicNumber,空單進場單號,時間週期) > 0)
        {
         // 執行平倉操作
         SX_CloseByTicket(空單進場單號,Lots) ;

         // 若空單已完全平倉,記錄平倉時的 K 棒編號
         if(空單部位() == 0)
           {
            CloseOrderNo = iBarShift(Symbol(),時間週期,LoadEA) ;
           }
        }
     } // end of 空單部位() > 0
  } // end of 交易時段外也可停損停利()


//+------------------------------------------------------------------+
//| 依編號取得多單買入價格                                              |
//+------------------------------------------------------------------+
double Get_BuyPrice()
  {
   double BuyPrice=0.0 ;

   // 多單價格編號 :POC 策略
   // 計算公式:POC 價格 + ATR * 0.382(費波那契比例)
   // 適用於 FVG(公允價值缺口)環境下,在 POC 上方尋找多單突破進場機會
      BuyPrice = POC_價格 + a_ATR[2]*0.382; // POC 上方進場(FVG 環境下)

   // 回傳經過正規化處理的價格(依商品點位精度)
   return NormalizeDouble(BuyPrice,Digits()) ;
  } // end of get BuyPrice

//+------------------------------------------------------------------+
//| 依編號取得空單賣出價格                                              |
//+------------------------------------------------------------------+
double Get_ShortPrice()
  {
   double ShortPrice=0.0 ;

   // 空單價格編號 :VWAP 策略
   // 計算公式:VWAP 價格 - ATR * 0.236(費波那契比例)
   // 適用於價格跌破 VWAP 後,在 VWAP 下方尋找空單進場機會
      ShortPrice = VWAP_價格 - a_ATR[2]*0.236; // VWAP 下方進場

   // 回傳經過正規化處理的價格(依商品點位精度)
   return NormalizeDouble(ShortPrice,Digits()) ;
  } // end of get ShortPrice

//+------------------------------------------------------------------+
//| 多單策略模組:定義買入信號                                           |
//+------------------------------------------------------------------+
void set_BuyCondition()
  {
   // 多單模組編號 :三線趨勢多頭 + 收盤突破三線最高值 + 短均線站上長均線
   // 條件:
   // (1) TrendDir3L == 1:三線方向為多頭(上升趨勢)
   // (2) Close[1] > Max3L:收盤價突破三線最高值(確認多頭結構)
   // (3) a_Avg7[1] > a_Avg13[1]:7 期均線位於 13 期均線上方(短均線多頭排列)

      LE_Cond = (TrendDir3L == 1 && Close[1] > Max3L && a_Avg7[1] > a_Avg13[1]) ;
  }

//+------------------------------------------------------------------+
//| 空單策略模組:定義賣出信號                                           |
//+------------------------------------------------------------------+
void set_ShortCondition()
  {
   // 空單模組編號 :Williams %R 看跌背離 + K 棒收盤在下半身 + 三日高點形成時間確認
   // 條件:
   // (1) WPR_Divergence(false) == true:Williams %R 出現看跌背離(價格創新高但指標未創新高,動能衰竭)
   // (2) Close[1] < (High[1]+Low[1])/2:收盤價位於當根 K 棒的下半部(空方壓力強)
   // (3) DayHPB >= 3:三日高點至今已超過 3 個交易日(高點已確立,向下反轉機率提高)

      SE_Cond = (WPR_Divergence(false) == true && Close[1] < (High[1]+Low[1])/2 && DayHPB >= 3) ; // Williams %R 看跌背離+收盤在下半身+三日高點 3 日前
  }
回測結果
測試參數交易商品:XAUUSD(黃金)
樣本內區間:2019/1/1 ~ 2024/06/30
交易手數:固定 0.1 手
時間框架: M15圖表
交易模式:波段交易


沒有留言:

張貼留言