2025年12月2日 星期二

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

核心策略概述 (商品 NAS100)
這是一個基於RSI背離與多重超賣鈍化的反轉交易策略。策略採用當沖模式,結合技術指標背離信號與超賣/超買狀態識別進場時機,並設有保本機制與固定時間強制平倉。

基礎設定
資金門檻: 低於門檻停止交易並發出警示
點差限制: SP < 商品平均點差 × Point()
交易時段: 02:00~10:00
當沖限制: 18:00~01:00禁止開倉,指定時間強制平倉
每日限制: 最多1次進場
冷卻期: BarSinceExit > 1(平倉後至少間隔1根K棒)
新K棒清倉: 自動刪除所有未成交掛單並更新指標

進場策略
多單進場條件
LE_Cond = RSI_LDiv_01() + 最近幾筆內有空單平倉

RSI低點背離: RSI_LDiv_01()函數判斷
空單平倉確認: 最近6筆訂單內有空單平倉記錄
進場方式: 市價單買入

執行條件
空手狀態(多單部位 == 0 && 空單部位 == 0)
非當前K棒已進場(BarNumber ≠ OrderBarNo)
點差檢查通過

空單進場條件
SE_Cond = 多重超賣鈍化() && Close[1] > Close[3] && Close[1] < Open[1]

多重超賣鈍化: 函數判斷多項指標超賣狀態
價格回落: 前1根收盤 > 前3根收盤(確認短期反彈)
黑K確認: 前1根K棒為陰線(收 < 開)

執行條件
空手狀態
非當前K棒已進場
點差檢查通過(無空單平倉檢查要求)

出場策略
多單出場
LX_Cond = (最小停利達成 && 跌破一目均衡雲) || 觸及停損

最小停利: Bid > 進場價 + 3倍點差
跌破雲層: High穿越一目均衡表雲層下緣(CrossUnder)
停損觸發: 價格回測停損價(Close[1] >= 停損 && Bid < 停損)

保本機制
觸發條件: 多單最高價 > 進場價 + TP × 50%
保本價格: 進場價 + TP × 16.8%
出場信號: Close[1] >= 保本價 && Bid < 保本價

空單出場
SX_Cond = (價格觸及週線低點) || 觸及停損

週線低點停利:
進場價 > 週線低點(WeekL)
Close[1] >= WeekL && Ask < WeekL

停損觸發: Close[1] <= 停損 && Ask > 停損

保本機制
觸發條件: 空單最低價 < 進場價 - TP × 50%
保本價格: 進場價 - TP × 16.8%
出場信號: Close[1] <= 保本價 && Ask > 保本價


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

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

//+------------------------------------------------------------------+
//| 初始化函式 (EA 載入時執行一次)
//+------------------------------------------------------------------+
int OnInit()
  {
   LoadEA = TimeCurrent(); // 記錄 EA 載入的當前時間。
   return(INIT_SUCCEEDED); // 初始化成功。
  }

//+------------------------------------------------------------------+
//| OnTick 函式 (每次報價變動時執行)                                                          
//+------------------------------------------------------------------+
// OnTick 函數:這是 MT5 EA 的核心函數,每個價格跳動(Tick)都會執行一次。
void OnTick()
  {
   // 資金風控檢查:如果目前帳戶餘額 (ACCOUNT_BALANCE) 低於預設的「資金風控」參數值,則停止交易並發出警報。
   if(AccountInfoDouble(ACCOUNT_BALANCE) < 資金風控)
     {
      Alert("**********  資金不足 *************"); // 彈出警示訊息
      return; // 退出 OnTick 函數,停止執行後續交易邏輯。
     }

   // 獲取當前 K 棒的索引:iBarShift 找到參考時間 (LoadEA) 對應的 K 棒索引 (從 0 開始,0 代表當前K棒)。
   BarNumber = iBarShift(Symbol(),時間週期,LoadEA);
   // 計算自上次平倉以來經過的 K 棒數量。CloseOrderNo 記錄上次平倉時的 BarNumber。
   BarSinceExit = BarNumber-CloseOrderNo ;
   // 檢查是否為新 K 棒的第一個 Tick 且與上次記錄的 K 棒索引 (JudgeNo) 不同。
   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); // 更新平倉 K 棒索引。
      FastSma = MathMin(LenA1, LenB1); // 設置 FastSma 參數為 LenA1 和 LenB1 的最小值。
      SlowSma = MathMax(LenA1, LenB1); // 設置 SlowSma 參數為 LenA1 和 LenB1 的最大值。
     }

   // 檢查是否換了新的 K 棒 (BarNumber 不等於上一個 Tick 記錄的 JudgeNo)。
   if(BarNumber != JudgeNo)
     {
      換K棒(); // 執行 K 棒切換時的邏輯,例如刪除掛單、計算指標等。
      交易時段賦值(); // 重新計算或設置當前是否允許交易的時段。
     }

   // 獲取最新的市場資訊。
   Ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK); // 賣出價 (Ask)
   Bid=SymbolInfoDouble(Symbol(),SYMBOL_BID); // 買入價 (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)
     {
      // 判斷是否接近收盤時間 (這裡定義為小時 >= 18 或小時 <= 1)。
      接近收盤 = (getTM_hour(TimeCurrent()) >= 18 || getTM_hour(TimeCurrent()) <= 1) ;
      // 更新「允許交易時段」:必須在預設的允許時段內,且不能接近收盤。
      允許交易時段 = (允許交易時段 && !接近收盤) ;
     }

   // 如果目前允許交易。
   if(允許交易時段 == true)
     {
      //+------------------------------------------------------------------+
      //|多單進場
      //+------------------------------------------------------------------+
      set_BuyCondition(); // 設定多單進場條件 LE_Cond。
      // 檢查多單進場條件是否成立 (LE_Cond == true),且點差 (SP) 小於商品平均點差,且最近幾筆內有空單平倉紀錄。
      if(LE_Cond == true && SP < NormalizeDouble(商品平均點差*Point(),Digits()) && 最近幾筆內有空單平倉(Symbol(),6) == true)
        {
         // 檢查目前是否空手 (沒有多單部位且沒有空單部位),且不是在同一根 K 棒重複下單。
         if(多單部位() == 0 && 空單部位() == 0 && BarNumber != OrderBarNo)
           {

            // 檢查自上次平倉後經過的 K 棒是否大於 1 根 (避免連續交易),且當日進場次數小於 1 (EntriesToday)。
            if(BarSinceExit > 1 && EntriesToday(MagicNumber,Symbol()) < 1)
              {
               if(多單下單方式 == 1) // 如果多單下單方式是 1 (空手+市價單買入)。
                 {
                  //  空手+市價單買入:發送市價 Buy 單。
                  多單進場單號 = Buy_at_MARKET(Symbol(),Lots,TP,SL,"BUY MARKET",MagicNumber) ;
                  OrderBarNo = iBarShift(Symbol(),時間週期,LoadEA); // 記錄下單時的 K 棒索引。

                 }
              } // end of BarSinceExit > 1
           } // end of 空手且不同根K棒() == true
        } // end of LE_Cond == true
      //+------------------------------------------------------------------+
      //|空單進場
      //+------------------------------------------------------------------+
      set_ShortCondition() ; // 設定空單進場條件 SE_Cond。
      // 檢查空單進場條件是否成立 (SE_Cond == true),且點差 (SP) 小於商品平均點差。
      if(SE_Cond == true && SP < NormalizeDouble(商品平均點差*Point(),Digits()))
        {
         // 檢查目前是否空手 (沒有多單部位且沒有空單部位),且不是在同一根 K 棒重複下單。
         if(多單部位() == 0 && 空單部位() == 0 && BarNumber != OrderBarNo)
           {

            // 檢查自上次平倉後經過的 K 棒是否大於 1 根 (避免連續交易),且當日進場次數小於 1 (EntriesToday)。
            if(BarSinceExit > 1 && EntriesToday(MagicNumber,Symbol()) < 1)
              {
               if(空單下單方式 == 1) // 如果空單下單方式是 1 (空手+市價賣出)。
                 {
                  // 空手+市價賣出:發送市價 Short 單。
                  空單進場單號 = Short_at_MARKET(Symbol(),Lots,TP,SL,"Short Market",MagicNumber) ;
                  OrderBarNo = iBarShift(Symbol(),時間週期,LoadEA); // 記錄下單時的 K 棒索引。

                 }
              } //end of BarSinceExit > 1
           } // end of 空手且不同根K棒() == true
        } // end of SE_Cond == true
     } //end of 允許交易時段 == true
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   // 當沖出場時間檢查:如果在當沖模式下,且達到預設的當沖出場時間或凌晨 1 點。
   if(當沖 == true && (getTM_hour(TimeCurrent()) == 當沖出場時間 || getTM_hour(TimeCurrent()) == 1))
     {

      // 如果有多單或空單部位。
      if(多單部位() > 0 || 空單部位() > 0)
        {
         當沖平倉(); // 執行當沖部位的平倉。
        }
     }
   交易時段外也可停損停利(); // 執行停損停利邏輯 (即使不在允許交易時段內)。
   JudgeNo = iBarShift(Symbol(),時間週期,LoadEA); // 更新 JudgeNo 標記,用於判斷下一個 Tick 是否換 K 棒。

  } //end of onTick (OnTick 函數結束)


//+------------------------------------------------------------------+
//|        自訂函數庫                                                       
//+------------------------------------------------------------------+
// 獲取多單部位數量。
int 多單部位()
  {
   int count;
   // get_TradeCounts 自訂函數:獲取指定商品、MagicNumber、指定類型 (POSITION_TYPE_BUY) 的持倉數量。
   count = get_TradeCounts(Symbol(), MagicNumber,POSITION_TYPE_BUY) ;
   return count ;
  }

//+------------------------------------------------------------------+
//|                                                                 
//+------------------------------------------------------------------+
// 獲取空單部位數量。
int 空單部位()
  {
   int count;
   // get_TradeCounts 自訂函數:獲取指定商品、MagicNumber、指定類型 (POSITION_TYPE_SELL) 的持倉數量。
   count = get_TradeCounts(Symbol(), MagicNumber,POSITION_TYPE_SELL) ;
   return count ;
  }

//+------------------------------------------------------------------+
//|                                                               
//+------------------------------------------------------------------+
// 換 K 棒時執行的函數。
void 換K棒()
  {
// 新 K 棒刪除所有掛單
   // 檢查是否存在掛單。
   if(total_pending_order_count(Symbol(), MagicNumber,-1) != 0)
     {
      // 刪除所有符合條件的掛單。
      delete_pending_orders_all(Symbol(), MagicNumber, -1, 0x0000ff);

     }
   // 下面是一系列保留的函數呼叫,用於更新技術指標的數據序列或計算。
   Set_OHLC_Bar_Series(); // 保留:設置當前時間週期 K 棒的開高低收系列數據。
   Set_OHLC_Day_Series(); // 保留:設置日 K 棒的開高低收系列數據。
   Get_OHLC_Bar(30) ; // 保留:獲取 K 棒的開高低收數據 (可能是前 30 根)。
   Get_OHLC_Day(15) ; // 保留:獲取日 K 棒的開高低收數據 (可能是前 15 根)。
   Set_OHLC_Week_Series(); // 設置周 K 棒的開高低收系列數據。
   Get_OHLC_Week(5) ; // 獲取周 K 棒的開高低收數據 (可能是前 5 根)。

   set_RSI(); // 計算 RSI 指標。
   set_KD() ; // 計算 KD (Stochastic Oscillator) 指標。

   TwoWeekHL(); // 計算兩周的高低點 (自訂函數)。
   FixBarHL(); // 計算固定 K 棒的高低點 (自訂函數)。
   set_CCI(); // 計算 CCI 指標。
   set_ICHIMOKU(); // 計算 ICHIMOKU (一目均衡表) 指標。
// ***************
   set_WILLIAMS_PR() ; // 計算 WILLIAMS_PR (威廉指標)。

   // 計算前 5 日平均波幅 (日 K 棒的高點減去低點的平均)。
   Day5Range = ((HighD[1] - LowD[1])+(HighD[2] - LowD[2])+(HighD[3] - LowD[3])+(HighD[4] - LowD[4])+(HighD[5] - LowD[5]))/5;
  }
//+------------------------------------------------------------------+
//|                                                             
//+------------------------------------------------------------------+
// 交易時段賦值函數。
void 交易時段賦值()
  {

   // 如果交易時段編號是 22。
   if(交易時段編號 == 22)
      // 設定允許交易時段為凌晨 2 點到早上 10 點之前 (例如亞盤時段)。
      允許交易時段 = (getTM_hour(TimeCurrent()) >= 2 && getTM_hour(TimeCurrent()) < 10);

  }

//+------------------------------------------------------------------+
//|                                                                
//+------------------------------------------------------------------+
// 當沖平倉函數。
void 當沖平倉()
  {
   // 檢查是否達到當沖出場時間或凌晨 1 點。
   if((getTM_hour(TimeCurrent()) == 當沖出場時間 || getTM_hour(TimeCurrent()) == 1))
     {
      // 如果有多單部位且不是在當前 K 棒平倉。
      if(多單部位() > 0 && BarNumber != CloseOrderNo)
         LX_CloseByTicket(多單進場單號,Lots) ; // 平倉多單。
      // 如果有空單部位且不是在當前 K 棒平倉。
      if(空單部位() > 0 && BarNumber != CloseOrderNo)
         SX_CloseByTicket(空單進場單號,Lots) ; // 平倉空單。
      CloseOrderNo = iBarShift(Symbol(),時間週期,LoadEA) ; // 更新平倉 K 棒索引。
     }
  }

//+------------------------------------------------------------------+
//|                                                                
//+------------------------------------------------------------------+
// 交易時段外也可停損停利函數:執行所有部位的出場邏輯。
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 > 多單最小停利 ; // 檢查當前買價 (Bid) 是否超過最小獲利價格。
      // LX_MinPF = true ; // 註釋掉的行,可能是測試用。
      多單停利價格 = NormalizeDouble(多單進場價格 + TP * Point(),Digits()) ; // 計算固定停利價格 (進場價 + TP 點數)。
      多單停損價格 = NormalizeDouble(多單進場價格 - SL * Point(),Digits()) ; // 計算固定停損價格 (進場價 - SL 點數)。

      //多單保本出場
      // 如果啟用了「保藍設定」(可能是某種移動停損或保本機制)。
      if(保藍設定 == true)
        {
         // 獲取多單進場後 K 線的最高價。
         多單最高價 = iHigh(Symbol(),時間週期, iHighest(Symbol(),時間週期,MODE_HIGH,LE_BarsSinceEntry(MagicNumber,多單進場單號,時間週期),1));
         多單最高價 = NormalizeDouble(多單最高價,Digits()) ;

         // 如果最高價超過進場價 + 0.5 倍停利點數。
         if(多單最高價 > 多單進場價格+TP * Point()*0.5)
           {
            LongPull = true ; // 設定回檔標記。
            多單保本價格 = NormalizeDouble(多單進場價格+TP * Point()*0.168,Digits()) ; // 計算保本價格 (黃金分割比例 0.168)。
            // 設定保本出場條件:已回檔 (LongPull) 且前一根 K 棒收盤價高於保本價格,但當前買價 (Bid) 跌破保本價格。
            LX_Cond = (LongPull == true && Close[1] >= 多單保本價格 && Bid < 多單保本價格);
           }
         else
            LX_Cond = false ; // 否則出場條件不成立。

         // 如果保本出場條件成立,且不是在當前 K 棒平倉,且持倉時間大於 0 根 K 棒。
         if(LX_Cond == true && BarNumber != CloseOrderNo && LE_BarsSinceEntry(MagicNumber,多單進場單號,時間週期) > 0)
           {
            LX_CloseByTicket(多單進場單號,Lots) ; // 平倉多單。

            // 如果所有多單部位都已平倉。
            if(多單部位() == 0)
              {
               CloseOrderNo = iBarShift(Symbol(),時間週期,LoadEA) ; // 更新平倉 K 棒索引。
              }
           }
        }

         // 出場條件:達到最小獲利後且 High 跌破一目均衡表 C 線 (CrossUnder) 或價格跌破固定停損價。
         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) ; // 更新平倉 K 棒索引。
           }
        }
     } // 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 < 空單最小停利 ; // 檢查當前賣價 (Ask) 是否低於最小獲利價格。
      //    SX_MinPF = true ; // 註釋掉的行,可能是測試用。
      空單停利價格 = NormalizeDouble(空單進場價格 - TP * Point(),Digits()) ; // 計算固定停利價格 (進場價 - TP 點數)。
      空單停損價格 = NormalizeDouble(空單進場價格 + SL * Point(),Digits()) ; // 計算固定停損價格 (進場價 + SL 點數)。

      //空單保本出場
      // 如果啟用了「保藍設定」(可能是某種移動停損或保本機制)。
      if(保藍設定 == true)
        {
         // 獲取空單進場後 K 線的最低價。
         空單最低價 = iLow(Symbol(),時間週期, iLowest(Symbol(),時間週期,MODE_LOW,SE_BarsSinceEntry(MagicNumber,空單進場單號,時間週期),1));
         空單最低價 = NormalizeDouble(空單最低價,Digits()) ;

         // 如果最低價低於進場價 - 0.5 倍停利點數。
         if(空單最低價 < 空單進場價格-TP * Point()*0.5)
           {
            ShortPull = true ; // 設定回檔標記。
            空單保本價格 = NormalizeDouble(空單進場價格-TP * Point()*0.168,Digits()) ; // 計算保本價格 (黃金分割比例 0.168)。
            // 設定保本出場條件:已回檔 (ShortPull) 且前一根 K 棒收盤價低於保本價格,但當前賣價 (Ask) 突破保本價格。
            SX_Cond = (ShortPull == true && Close[1] <= 空單保本價格 && Ask > 空單保本價格);
           }
         else
            SX_Cond = false ; // 否則出場條件不成立。

         // 如果保本出場條件成立,且不是在當前 K 棒平倉,且持倉時間大於 0 根 K 棒。
         if(SX_Cond == true && BarNumber != CloseOrderNo && SE_BarsSinceEntry(MagicNumber,空單進場單號,時間週期) > 0)
           {
            SX_CloseByTicket(空單進場單號,Lots) ; // 平倉空單。

            // 如果所有空單部位都已平倉。
            if(空單部位() == 0)
              {
               CloseOrderNo = iBarShift(Symbol(),時間週期,LoadEA) ; // 更新平倉 K 棒索引。
              }
           }
        }

         bool SXcond311 ;
         空單停利價格 = NormalizeDouble(WeekL,Digits()) ; // 空單停利價格設為周低點 (WeekL)。
         // 停利條件 311:前一根 K 棒收盤價低於周低點 (空單停利價),但當前賣價 (Ask) 突破周低點。
         SXcond311 = (空單進場價格 > 空單停利價格 && Close[1] >= 空單停利價格 && Ask < 空單停利價格) ;
         // 最終出場條件:停利條件 311 成立 或 價格達到固定停損。
         SX_Cond = (SXcond311 == true || (Close[1] <= 空單停損價格 && Ask > 空單停損價格)) ;


      //---------------------------------------------------------空單出場

      // 執行空單出場。
      if(SX_Cond == true && BarNumber != CloseOrderNo && SE_BarsSinceEntry(MagicNumber,空單進場單號,時間週期) > 0)
        {
         SX_CloseByTicket(空單進場單號,Lots) ; // 平倉空單。

         // 如果所有空單部位都已平倉。
         if(空單部位() == 0)
           {
            CloseOrderNo = iBarShift(Symbol(),時間週期,LoadEA) ; // 更新平倉 K 棒索引。
           }
        }
     } // end of 空單部位() > 0 (結束空單出場邏輯)
  } // end of 交易時段外也可停損停利() (結束出場總函數)


//+------------------------------------------------------------------+
//|多單模組編號
//+------------------------------------------------------------------+
// 設置多單進場條件。
void set_BuyCondition()
  {

      LE_Cond = (RSI_LDiv_01()) ; // 多單進場條件 (LE_Cond) = RSI 低檔背離 01 成立。

  }

//+------------------------------------------------------------------+
//| 空單模組編號
//+------------------------------------------------------------------+
// 設置空單進場條件。
void set_ShortCondition()
  {

      // 空單進場條件 (SE_Cond) = 多重超賣鈍化成立 且 前一根 K 棒收盤價高於前三根 K 棒收盤價 (回調) 且 前一根 K 棒為黑 K (收盤價低於開盤價)。
      SE_Cond = (多重超賣鈍化() && Close[1] > Close[3] && Close[1] < Open[1]) ; // 多重超賣鈍化回調+價格回落+黑K

  }

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

現在就加入《外匯實戰 MT5 EA基礎班》,用量化思維,開啟你的交易新紀元!



沒有留言:

張貼留言