核心策略
多單:肯特納通道上軌突破 + 標準差緩衝(Buy_at_STOP 突破掛單)
空單:區間中點限價 + 均線死叉趨勢確認(Short_at_LIMIT 限價掛單)
交易限制
時段:12:00以後 或 04:00~10:00
當沖模式:接近收盤時段(>=21:00 或 <=01:00)禁止新倉
商品預設停止下單時間:00:00 整 或 01:00~01:06 封鎖所有下單與平倉
每日限 2 次進場:EntriesToday < 2
同根 K 棒不重複下單:BarNumber != OrderBarNo
同根 K 棒不於平倉後立即進場:BarNumber != CloseOrderNo
點差過濾:SP < 商品平均點差 * Point()
進場條件
多單模組 :CrossUnder(Close, a_SlowSma) 死叉 + a_SlowSma[1] > a_BigFastSma[1] + a_BigFastSma[1] > a_BigFast5Sma[1](大週期均線多頭排列)
進場方式
多單下單方式 :Buy_at_STOP 突破掛單,有效期 3600 秒
掛單價:a_KC_UPPER[1] + a_StdDEV[2]*0.5
距市價須 > 最小止損*2,且 < 價格遠距上限(Close[1]*突破距離百分比)
空單下單方式 :Short_at_LIMIT 限價掛單,有效期 3600 秒
掛單價:LL_Low + (HH_High - LL_Low)*0.5(區間中點)
距市價須 > 最小止損*2,且 < 價格遠距下限(Close[1]*限價距離百分比)
額外防呆:賣出價格 > 0(防 FVG/POC 未初始化)
出場條件
多單出場方式 :a_StdDEV[1] > a_StdDEV[2]*1.382(標準差過熱)+ Close[1] < Low[2](K線反轉型態)+ 已達最小停利;或直接觸及 多單停損價格 / 多單停利價格
空單出場方式 :動態 ATR 追蹤止損,波動率 >=3 級用 1.5倍ATR,否則用 2.5倍ATR;停損只向有利方向移動,觸及即平倉
停損停利設計
進場首根 K 棒(BarsSinceEntry == 0)立即呼叫 TPSLchange() 推送初始停損停利至券商端
停損停利價格每 Tick 從 PositionGetDouble(POSITION_TP/SL) 動態讀取,反映追蹤止損的即時狀態
止損最小值:MathMax(SL, 最小止損*2)
換K棒更新指標
收盤時間前自動刪除全部掛單
//+------------------------------------------------------------------+
//| 報價驅動函數:每當價格跳動(Tick)時即執行一次 |
//+------------------------------------------------------------------+
void OnTick()
{
// 商品預設停止下單時間:午夜 0 點整,或凌晨 1 點且分鐘數 ≤ 6 分(避開收盤流動性不足時段)
商品預設停止下單時間 = (getTM_hour(TimeCurrent()) == 0) || (getTM_hour(TimeCurrent()) == 1 && getTM_min(TimeCurrent()) <= 6);
// 資金風控檢查:若帳戶餘額低於設定的「資金風控」值,則停止執行並報警
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))
{
CloseOrderNo = -1; // 直接設定,不開倉
}
// 換 K 棒偵測:當 K 棒編號改變時,執行定時更新函數
if(BarNumber != JudgeNo)
{
換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)
{
// 判斷當前時間是否為接近收盤時段(21:00 以後或凌晨 1 點以前)
接近收盤 = (getTM_hour(TimeCurrent()) >= 21 || getTM_hour(TimeCurrent()) <= 1) ;
// 若接近收盤,則禁止新倉進場(僅允許平倉)
允許交易時段 = (允許交易時段 && !接近收盤) ;
}
// 無論是否在交易時段內,皆持續監控部位的停損與停利(保護部位)
// 注意:此呼叫置於進場判斷之前,確保每個 Tick 都優先處理風控
交易時段外也可停損停利();
// 交易時段判斷:只有在允許交易的時段內才執行進場邏輯
if(允許交易時段 == true)
{
// 計算掛單距市價的合理距離上下限,防止掛單價格偏離市價過遠
double 價格遠距上限 = Close[1] * 突破距離百分比; // 突破掛單距市價不超過指定百分比(如 0.6%)
double 價格遠距下限 = Close[1] * 限價距離百分比; // 限價掛單距市價不超過指定百分比(如 0.3%)
//+------------------------------------------------------------------+
//| 多單進場邏輯區塊
//+------------------------------------------------------------------+
set_BuyCondition(); // 載入多單過濾條件
// 判斷條件:符合進場信號、點差在合理範圍內、且非預設停止下單時間
if(LE_Cond == true && SP < NormalizeDouble(商品平均點差*Point(),Digits()) && !商品預設停止下單時間)
{
// 確保當前無多空部位,且同一根 K 棒內不重複下單(同時排除剛平倉的 K 棒)
if(多單部位() == 0 && 空單部位() == 0 && BarNumber != OrderBarNo && BarNumber != CloseOrderNo)
{
// 計算買入價格(依據多單價格模組設定)
買入價格 = Get_BuyPrice() ;
// 每日進場次數限制(最多 2 次)
if(EntriesToday(MagicNumber,Symbol()) < 2)
{
// 下單方式 2:空手狀態下執行 STOP 掛單突破買入
if(多單下單方式 == 2)
{
// 三重價格過濾:
// (1) 掛單價必須高於市價,且距離超過最小止損距離的 2 倍(確保不立即成交)
// (2) 掛單距市價不超過收盤價的指定百分比(防止追高過遠)
// (3) 上根 K 棒收盤價低於掛單價(避免在已突破的位置掛單)
// (4) 非商品收盤時間(避開低流動性時段)
if(買入價格 > Ask + (最小止損*Point()) * 2
&& 買入價格 < Ask + 價格遠距上限
&& Close[1] < 買入價格 && getTM_hour(TimeCurrent()) != 商品收盤時間)
{
// 確認目前無其他掛單,避免重複建立相同方向掛單
if(total_pending_order_count(Symbol(), MagicNumber,-1) == 0)
{
多單進場單號 = Buy_at_STOP(Symbol(),MagicNumber,買入價格,Lots,TP,SL,"BUY STOP",3600) ;
}
}
} // end of 多單下單方式 == 2
} // end of EntriesToday
} // end of 空手且不同根K棒() == true
} // end of LE_Cond == true
//+------------------------------------------------------------------+
//| 空單進場邏輯區塊
//+------------------------------------------------------------------+
set_ShortCondition() ; // 載入空單過濾條件
// 判斷條件:符合進場信號、點差在合理範圍內、且非預設停止下單時間
if(SE_Cond == true && SP < NormalizeDouble(商品平均點差*Point(),Digits()) && !商品預設停止下單時間)
{
// 確保當前無多空部位,且同一根 K 棒內不重複下單(同時排除剛平倉的 K 棒)
if(多單部位() == 0 && 空單部位() == 0 && BarNumber != OrderBarNo && BarNumber != CloseOrderNo)
{
// 計算賣出價格(依據空單價格模組設定)
賣出價格 = Get_ShortPrice();
// 每日進場次數限制(最多 2 次)
if(EntriesToday(MagicNumber,Symbol()) < 2)
{
// 下單方式 3:空手狀態下執行 LIMIT 掛單限價賣出
if(空單下單方式 == 3)
{
// 四重價格過濾:
// (1) 掛單價必須高於市價,且距離超過最小止損距離的 2 倍(確保不立即成交)
// (2) 掛單距市價不超過收盤價的指定百分比(防止距離過遠)
// (3) 掛單價必須大於 0(防止 FVG/POC 未初始化時產生無效掛單)
// (4) 上根 K 棒收盤價低於掛單價,且非商品收盤時間
if(賣出價格 > Bid + (最小止損*Point()) * 2
&& 賣出價格 < Bid + 價格遠距下限
&& 賣出價格 > 0
&& Close[1] < 賣出價格 && getTM_hour(TimeCurrent()) != 商品收盤時間)
{
// 確認目前無其他掛單,避免重複建立相同方向掛單
if(total_pending_order_count(Symbol(), MagicNumber,-1) == 0)
{
// 執行 LIMIT 掛單賣出(限價賣出),有效期 3600 秒(1 小時)
空單進場單號 = Short_at_LIMIT(Symbol(),MagicNumber,賣出價格,Lots,TP,SL,"Short LIMIT",3600) ;
}
}
} // end of 空單下單方式 == 3
} //end of EntriesToday
} // end of 空手且不同根K棒() == true
} // end of SE_Cond == true
} //end of 允許交易時段 == true
//+------------------------------------------------------------------+
//| 當沖平倉檢查:若啟用當沖模式,在指定時間或凌晨 1:05 後強制平倉
//+------------------------------------------------------------------+
if(當沖 == true && (getTM_hour(TimeCurrent()) == 當沖出場時間 || (getTM_hour(TimeCurrent()) == 1 && getTM_min(TimeCurrent()) > 5)))
{
// 檢查是否有持倉部位需要平倉
if(多單部位() > 0 || 空單部位() > 0)
{
當沖平倉(); // 執行強制平倉程序
}
}
// 更新判斷編號,用於判斷下次 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棒()
{
// 特殊邏輯:在商品收盤時間前刪除所有未成交掛單,避免低流動性時段成交
if((getTM_hour(TimeCurrent()) == 商品收盤時間) && (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 指標(平均真實波幅)
Get_MaxMinValue() ; // 保留:取得區間最高最低值
Get_Volatility() ; // 保留:計算波動率
// 計算技術指標
set_BBAND(); // 計算布林通道(Bollinger Bands)
FloatTwoLine(); // 計算浮動雙均線
BigFloatTwoLine(); // 計算大週期浮動雙均線
// ***************
set_KELTNER_CHANNEL() ; // 計算肯特納通道(Keltner Channel),作為進場價格基準
// 計算最近 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 交易時段賦值()
{
// 允許午後 12:00 以後,或早上 4:00 至 10:00 之間交易
允許交易時段 = (getTM_hour(TimeCurrent()) >= 12 || (getTM_hour(TimeCurrent()) >= 4 && 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) ;
}
}
//+------------------------------------------------------------------+
//| 自訂函數:核心監控 - 處理停損、停利、移動止損(交易時段外亦持續執行)
//+------------------------------------------------------------------+
void 交易時段外也可停損停利()
{
// --- 多單監控區 ---
// 無論是否在交易時段,只要持有多單且非停止下單時間,就持續監控
if(多單部位() > 0 && !商品預設停止下單時間)
{
//+------------------------------------------------------------------+
//| 多單出場邏輯
//+------------------------------------------------------------------+
double 多單最小停利 = 0.0, 多單保本價格 = 0.0 ;
bool LX_MinPF = false, LongPull = false;
// 取得多單進場價格並計算最小停利門檻(需覆蓋 3 倍點差成本)
多單進場價格 = LE_EntryPrice(MagicNumber, 多單進場單號);
多單最小停利 = NormalizeDouble(多單進場價格 + SP * 3, Digits());
LX_MinPF = Bid > 多單最小停利; // 判斷是否已達最小利潤
// 計算進場後出現的最高價(從進場 K 棒後開始計算,用於移動止損)
多單最高價 = iHigh(Symbol(), 時間週期, iHighest(Symbol(), 時間週期, MODE_HIGH, LE_BarsSinceEntry(MagicNumber, 多單進場單號, 時間週期), 1));
多單最高價 = NormalizeDouble(多單最高價, Digits());
// 進場首根 K 棒時:呼叫 TPSLchange 在券商端設定初始停損停利掛單
// 避免因網路中斷導致停損保護失效
if(LE_BarsSinceEntry(MagicNumber, 多單進場單號, 時間週期) == 0)
{
double 初始停利 = NormalizeDouble(多單進場價格 + TP * Point(), Digits());
double 初始停損 = NormalizeDouble(多單進場價格 - SL * Point(), Digits());
TPSLchange(Symbol(), 多單進場單號, 初始停利, 初始停損, 時間週期);
}
// 從券商端讀取目前實際的停損停利價格(以反映後續可能的移動止損修改)
if(PositionSelectByTicket(多單進場單號))
{
多單停利價格 = PositionGetDouble(POSITION_TP);
多單停損價格 = PositionGetDouble(POSITION_SL);
}
//+------------------------------------------------------------------+
//| 出場方式計算
//+------------------------------------------------------------------+
// 出場方式 :標準差過熱 + K 線型態反轉
// 條件說明:
// (1) 已達最小獲利 + 當前標準差比前一根 K 棒擴張超過 1.382 倍(波動率過熱)
// + 上根 K 棒收盤價低於前兩根 K 棒的最低價(出現下影 K 線型態)
// (2) OR:直接觸及券商端設定的停損價
// (3) OR:直接觸及券商端設定的停利價
LX_Cond = (Bid > 多單最小停利 && a_StdDEV[1] > a_StdDEV[2]*1.382 && Close[1] < Low[2]) || (Bid <= 多單停損價格) || (Bid >= 多單停利價格);
//+------------------------------------------------------------------+
//| 多單出場執行
//+------------------------------------------------------------------+
// 確認出場條件成立、不在下單同一根 K 棒、不在平倉同一根 K 棒、且已持倉超過 0 根 K 棒
if(LX_Cond == true && BarNumber != OrderBarNo && BarNumber != CloseOrderNo &&
LE_BarsSinceEntry(MagicNumber, 多單進場單號, 時間週期) > 0)
{
LX_CloseByTicket(多單進場單號, Lots); // 依進場單號執行多單平倉
}
} // end of 多單部位() > 0
// --- 空單監控區 ---
// 無論是否在交易時段,只要持有空單且非停止下單時間,就持續監控
if(空單部位() > 0 && !商品預設停止下單時間)
{
//+------------------------------------------------------------------+
//| 空單出場邏輯
//+------------------------------------------------------------------+
double 空單最小停利 = 0.0, 空單保本價格 = 0.0;
bool SX_MinPF = false, ShortPull = false;
// 取得空單進場價格並計算最小停利門檻(需覆蓋 3 倍點差成本)
空單進場價格 = SE_EntryPrice(MagicNumber, 空單進場單號);
空單最小停利 = NormalizeDouble(空單進場價格 - SP * 3, Digits());
SX_MinPF = Ask < 空單最小停利; // 判斷是否已達最小利潤
// 計算進場後出現的最低價(從進場 K 棒後開始計算,用於移動止損)
空單最低價 = iLow(Symbol(), 時間週期, iLowest(Symbol(), 時間週期, MODE_LOW, SE_BarsSinceEntry(MagicNumber, 空單進場單號, 時間週期), 1));
空單最低價 = NormalizeDouble(空單最低價, Digits());
// 進場首根 K 棒時:呼叫 TPSLchange 在券商端設定初始停損停利掛單
if(SE_BarsSinceEntry(MagicNumber, 空單進場單號, 時間週期) == 0)
{
double 初始停利 = NormalizeDouble(空單進場價格 - TP * Point(), Digits());
double 初始停損 = NormalizeDouble(空單進場價格 + SL * Point(), Digits());
TPSLchange(Symbol(), 空單進場單號, 初始停利, 初始停損, 時間週期);
}
// 從券商端讀取目前實際的停損停利價格
if(PositionSelectByTicket(空單進場單號))
{
空單停利價格 = PositionGetDouble(POSITION_TP);
空單停損價格 = PositionGetDouble(POSITION_SL);
}
//+------------------------------------------------------------------+
//| 出場方式計算
//+------------------------------------------------------------------+
// 出場方式 :動態 ATR 追蹤止損(隨波動率彈性收放停損距離)
// 邏輯說明:
// - 當市場波動率達到 3 級以上(ATR_Volatility >= 3),停損倍數收緊為 1.5 倍 ATR(市場已高波動,快速鎖利)
// - 否則使用寬鬆的 2.5 倍 ATR(允許正常震盪)
// - 若新計算的停損比現有停損更低(更保護),才更新券商端停損(只向有利方向移動)
double mult = (ATR_Volatility() >= 3) ? 1.5 : 2.5; // 根據波動等級決定 ATR 倍數
double 新停損 = NormalizeDouble(Close[1] + (a_ATR[1] * mult), Digits()); // 計算新的追蹤停損線
// 只有當新停損低於現有停損時才更新(停損只能向下移,保護空單獲利)
if(新停損 < 空單停損價格)
{
空單停損價格 = 新停損;
TPSLchange(Symbol(), 空單進場單號, 0, 空單停損價格, 時間週期); // 修改券商端停損,停利維持不變(傳 0)
}
// 出場條件:Ask 觸及追蹤停損線(止損)或 Ask 觸及停利價(止盈)
SX_Cond = (Ask >= 空單停損價格) || (Ask <= 空單停利價格);
//+------------------------------------------------------------------+
//| 空單出場執行 |
//+------------------------------------------------------------------+
// 確認出場條件成立、不在下單同一根 K 棒、不在平倉同一根 K 棒、且已持倉超過 0 根 K 棒
if (SX_Cond == true && BarNumber != OrderBarNo && BarNumber != CloseOrderNo &&
SE_BarsSinceEntry(MagicNumber, 空單進場單號, 時間週期) > 0)
{
SX_CloseByTicket(空單進場單號, Lots); // 依進場單號執行空單平倉
}
} // end of 空單部位() > 0
} // end of 交易時段外也可停損停利()
//+------------------------------------------------------------------+
//| 依編號取得多單買入價格
//+------------------------------------------------------------------+
double Get_BuyPrice()
{
double BuyPrice = 0.0;
// 多單價格:肯特納通道上軌 + 標準差擴張緩衝
// 計算公式:KC 上軌(前 1 根)+ 前 2 根標準差的 0.5 倍
// 適用於通道突破策略,在動態上軌之上加上波動緩衝設定掛單,過濾假突破
BuyPrice = a_KC_UPPER[1] + a_StdDEV[2]*0.5;
// 回傳經過正規化處理的價格(依商品點位精度)
return NormalizeDouble(BuyPrice,Digits()) ;
} // end of get BuyPrice
//+------------------------------------------------------------------+
//| 依編號取得空單賣出價格
//+------------------------------------------------------------------+
double Get_ShortPrice()
{
double ShortPrice = 0.0;
// 空單價格:區間中點價格
// 計算公式:近期最低點(LL_Low)+ 高低點區間(HH_High - LL_Low)的 50%
// 適用於區間震盪策略,在區間中點設定限價賣出,等待價格回測中點後放空
ShortPrice = LL_Low + (HH_High - LL_Low) * 0.5;
// 回傳經過正規化處理的價格(依商品點位精度)
return NormalizeDouble(ShortPrice,Digits()) ;
} // end of get ShortPrice
//+------------------------------------------------------------------+
//| 多單策略模組:定義買入信號
//+------------------------------------------------------------------+
void set_BuyCondition()
{
// 多單模組:收盤穿越慢線死叉 + 大週期均線多頭排列
// 條件說明:
// (1) 收盤價向下穿越慢線(CrossUnder):前兩根 K 棒確認死叉訊號(使用 [3][2] 兩點確認)
// (2) 慢線(a_SlowSma)仍高於大週期快線(a_BigFastSma):中期均線仍在多頭結構
// (3) 大週期快線高於大週期 5 日均線(a_BigFast5Sma):長期趨勢亦維持多頭排列
// 適用於均線回測策略:大週期多頭結構下,等待小週期回測慢線後順勢做多
LE_Cond = CrossUnder(Close[3],a_SlowSma[3],Close[2],a_SlowSma[2]) && (a_SlowSma[1] > a_BigFastSma[1]) && (a_BigFastSma[1] > a_BigFast5Sma[1]) ;
}
//+------------------------------------------------------------------+
//| 空單策略模組:定義賣出信號
//+------------------------------------------------------------------+
void set_ShortCondition()
{
// 空單模組:小週期均線死叉 + 慢線空頭排列確認
// 條件說明:
// (1) 收盤價向上穿越慢線(CrossOver):前一根 K 棒的慢線與收盤確認黃金交叉(作為反向訊號觸發)
// 掛單賣出位設於:上根慢線值 - 波動範圍(Range[2])的 0.5 倍(下方緩衝)
// (2) 慢線低於 5 日慢線(a_Slow5Sma):確認中期趨勢已轉空頭
// 適用於均線突破後反轉策略:慢線形成死叉且趨勢向下,在均線附近設限價空單
SE_Cond = CrossOver(a_SlowSma[2],Close[2],a_SlowSma[1]-Range[2]*0.5,Close[1]) && a_SlowSma[1] < a_Slow5Sma[1];
}
回測結果
測試參數交易商品:XAUUSD(黃金)樣本內區間:2020/1/1 ~ 2024/09/30
交易手數:固定 0.1 手
時間框架: M20圖表
交易模式:當沖交易

沒有留言:
張貼留言