這是一個基於 週線位階突破 和 DEMARK 背離反轉 的黃金日內交易策略,結合多空條件判斷、動態風險管理和階段性停損機制。
基礎概念
商品平均點差限制:進場前檢查點差 < 商品平均點差 × Point()
資金風控門檻:低於門檻時執行完整清倉(刪除掛單 → 平倉部位 → 退出 EA)
動態手數計算:根據風險百分比與止損距離計算交易手數(限制範圍:0.01 - 0.3 手)
交易限制
每日限制 1 次進場:EntriesToday(MagicNumber, Symbol()) < 1
點差控制:進場前檢查點差 < 商品平均點差 × Point()
交易時段限制:04:00-20:00
每日限制 1 次進場:EntriesToday(MagicNumber, Symbol()) < 1
點差控制:進場前檢查點差 < 商品平均點差 × Point()
交易時段限制:04:00-20:00
當沖模式限制:
接近收盤時段(18:00-01:00)禁止新倉進場
在當沖出場時間或凌晨 1 點強制平倉
BarSinceExit > 1:平倉後至少間隔 1 根 K 棒才能再進場
最小止損保護:SL = MathMax(SL, 最小止損)
同根 K 棒限制:BarNumber != OrderBarNo(同一根 K 棒不重複下單)
進場策略
多單進場條件
LE_Cond = (Close[1] > Week67 && DayHPB >= 2 && Close[1] > Open[1])
條件分析:
週線位階突破:收盤價突破兩週 67% 分位數(Week67,價格位於週線區間上方 1/3 位置)
高點時間判斷:三日高點距今 ≥ 2 個交易日(DayHPB,高點已形成一段時間)
K 棒型態過濾:收盤價高於開盤價(紅 K 棒,多頭型態確認)
進場方式:
掛單突破買入(Buy_at_STOP)
買入價格計算(多單價格編號 52):
BuyPrice = get_HRangeOHLC(Symbol(), 時間框架, MODE_HIGH, HBar, 2) + a_ATR[2] × FracA
計算公式:指定時間框架的高點(HBar 根前的第 2 根)+ ATR × 分數倍數(FracA)
適用場景:突破策略,在前高之上設定掛單
額外條件:
Close[1] < 買入價格:當前 K 棒收盤價低於買入價格(確保是向上突破)
getTM_hour(TimeCurrent()) != 商品收盤時間:非商品收盤時間
掛單有效期:3600 秒(1 小時)
空單進場條件
SE_Cond = (DEMARK_LDiv_01() && Close[1] < BigMin3L)
條件分析:
DEMARK 低檔背離:價格創新低但 DEMARK 指標未創新低(下跌動能衰竭信號)
關鍵支撐突破:收盤價跌破 BigMin3L(大週期三線的最低值,關鍵支撐被突破)
進場方式:
掛單突破賣出(Short_at_STOP)
賣出價格計算(空單價格編號 95):
cppShortPrice = BigPOC_價格 - Range[2] × 0.382
計算公式:BigPOC(大週期成交量集中點)- 前波波幅 × 0.382(費波那契回撤比例)
適用場景:BigFVG(大週期公允價值缺口)環境下,在 POC 下方尋找空單機會
額外條件:
Close[1] > 賣出價格:當前 K 棒收盤價高於賣出價格(確保是向下突破)
getTM_hour(TimeCurrent()) != 商品收盤時間:非商品收盤時間
掛單有效期:3600 秒(1 小時)
出場策略
多單出場
停損停利設定:
停利:進場價 + TP × Point()
停損:進場價 - SL × Point()
最小停利:進場價 + 點差 × 3
移動停損(啟用時):
觸發條件:進場後最高價 > 進場價 + TP × 0.3
停損調整為:最高價 - SL × Point()
多單出場方式 (階段性動態停損):
停利目標:
多單停利價格 = 進場價 + (TP + Day5Range × 0.618) × Point()
原始 TP + 5 日平均波動範圍的 0.618 倍(費波那契比例)
階段性停損調整:
階段一(浮動獲利 ≤ 1.5 × SL):
多單停損價格 = 進場價 - SL × Point()
使用原始固定停損
階段二(1.5 × SL < 浮動獲利 ≤ TP):
多單停損價格 = 最高價 - SL × Point() / 2
停損線提升至(最高價 - 0.5 倍 SL),部分鎖定利潤
階段三(浮動獲利 > TP):
多單停損價格 = 最高價 - 浮動獲利 / 2
停損線提升至(最高價 - 一半的浮動獲利),大幅鎖定利潤
主要出場條件:
LX_Cond = (LXcond61 == true || LXcond62 == true)
LXcond61 = (進場價 < 停利價 && Close[1] <= 停利價 && Bid > 停利價)
LXcond62 = (進場價 > 停損價 && Close[1] >= 停損價 && Bid < 停損價)
出場條件 1:價格向上突破停利價(觸及停利)
出場條件 2:價格向下跌破停損價(觸及停損)
空單出場
停損停利設定:
停利:進場價 - TP × Point()
停損:進場價 + SL × Point()
最小停利:進場價 - 點差 × 3
移動停損(啟用時):
觸發條件:進場後最低價 < 進場價 - TP × 0.3
停損調整為:最低價 + SL × Point()
空單出場方式 (6 小時線收盤價目標):
停利目標:
空單停利價格 = get_LRangeOHLC(Symbol(), PERIOD_H6, MODE_CLOSE, 3, 2)
從當前算起第 3 根 6 小時 K 棒的第 2 個數據點的收盤價
主要出場條件:
SX_Cond = (SXcond251 == true || (Close[1] <= 停損價 && Ask > 停損價))
SXcond251 = (進場價 > 停利價 && Close[1] >= 停利價 && Ask < 停利價)
出場條件 1:價格向下突破停利價(觸及停利)
出場條件 2:價格向上突破停損價(觸及停損)
DEMARK 低檔背離:價格創新低但 DEMARK 指標未創新低(下跌動能衰竭信號)
關鍵支撐突破:收盤價跌破 BigMin3L(大週期三線的最低值,關鍵支撐被突破)
進場方式:
掛單突破賣出(Short_at_STOP)
賣出價格計算(空單價格編號 95):
cppShortPrice = BigPOC_價格 - Range[2] × 0.382
計算公式:BigPOC(大週期成交量集中點)- 前波波幅 × 0.382(費波那契回撤比例)
適用場景:BigFVG(大週期公允價值缺口)環境下,在 POC 下方尋找空單機會
額外條件:
Close[1] > 賣出價格:當前 K 棒收盤價高於賣出價格(確保是向下突破)
getTM_hour(TimeCurrent()) != 商品收盤時間:非商品收盤時間
掛單有效期:3600 秒(1 小時)
出場策略
多單出場
停損停利設定:
停利:進場價 + TP × Point()
停損:進場價 - SL × Point()
最小停利:進場價 + 點差 × 3
移動停損(啟用時):
觸發條件:進場後最高價 > 進場價 + TP × 0.3
停損調整為:最高價 - SL × Point()
多單出場方式 (階段性動態停損):
停利目標:
多單停利價格 = 進場價 + (TP + Day5Range × 0.618) × Point()
原始 TP + 5 日平均波動範圍的 0.618 倍(費波那契比例)
階段性停損調整:
階段一(浮動獲利 ≤ 1.5 × SL):
多單停損價格 = 進場價 - SL × Point()
使用原始固定停損
階段二(1.5 × SL < 浮動獲利 ≤ TP):
多單停損價格 = 最高價 - SL × Point() / 2
停損線提升至(最高價 - 0.5 倍 SL),部分鎖定利潤
階段三(浮動獲利 > TP):
多單停損價格 = 最高價 - 浮動獲利 / 2
停損線提升至(最高價 - 一半的浮動獲利),大幅鎖定利潤
主要出場條件:
LX_Cond = (LXcond61 == true || LXcond62 == true)
LXcond61 = (進場價 < 停利價 && Close[1] <= 停利價 && Bid > 停利價)
LXcond62 = (進場價 > 停損價 && Close[1] >= 停損價 && Bid < 停損價)
出場條件 1:價格向上突破停利價(觸及停利)
出場條件 2:價格向下跌破停損價(觸及停損)
空單出場
停損停利設定:
停利:進場價 - TP × Point()
停損:進場價 + SL × Point()
最小停利:進場價 - 點差 × 3
移動停損(啟用時):
觸發條件:進場後最低價 < 進場價 - TP × 0.3
停損調整為:最低價 + SL × Point()
空單出場方式 (6 小時線收盤價目標):
停利目標:
空單停利價格 = get_LRangeOHLC(Symbol(), PERIOD_H6, MODE_CLOSE, 3, 2)
從當前算起第 3 根 6 小時 K 棒的第 2 個數據點的收盤價
主要出場條件:
SX_Cond = (SXcond251 == true || (Close[1] <= 停損價 && Ask > 停損價))
SXcond251 = (進場價 > 停利價 && Close[1] >= 停利價 && Ask < 停利價)
出場條件 1:價格向下突破停利價(觸及停利)
出場條件 2:價格向上突破停損價(觸及停損)
//+------------------------------------------------------------------+
//| MT5 自動交易程式 (Expert Advisor)
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh> // 引入 MT5 交易函數庫
#include <MagicMT5_函數庫V2.mqh> // 引入自定義函數庫
ENUM_TIMEFRAMES 時間週期 = PERIOD_M10; // 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 棒的測試性進出場(市價買入後立即平倉,通常用於測試連結或初始化參數)
多單進場單號 = Buy_at_MARKET(Symbol(),Lots,TP,SL,"1st_K",MagicNumber) ;
LX_CloseByTicket(多單進場單號,Lots) ;
空單進場單號 = Short_at_MARKET(Symbol(),Lots,TP,SL,"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 邏輯(如刪除掛單、更新數據)
交易時段賦值(); // 更新目前是否處於可交易時段
}
// 即時更新市場數據變數
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)
{
// 判斷當前時間是否為接近收盤時段(18:00-01:00)
接近收盤 = (getTM_hour(TimeCurrent()) >= 18 || getTM_hour(TimeCurrent()) <= 1) ;
// 若接近收盤,則禁止新倉進場(僅允許平倉)
允許交易時段 = (允許交易時段 && !接近收盤) ;
}
// 交易時段判斷:只有在允許交易的時段內才執行進場邏輯
if(允許交易時段 == true)
{
//+------------------------------------------------------------------+
//| 多單進場邏輯區塊
//+------------------------------------------------------------------+
// 確保止損點數不低於最小止損要求,避免滑價或點差過大導致無效止損
SL = MathMax(SL,最小止損) ;
set_BuyCondition(); // 載入多單過濾條件
// 判斷條件:符合進場信號、點差小於平均值
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 掛單買入(突破買入),有效期 3600 秒(1 小時)
多單進場單號 = Buy_at_STOP(Symbol(),MagicNumber,買入價格,Lots,TP,SL,"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 掛單賣出(突破賣出),有效期 3600 秒(1 小時)
空單進場單號 = Short_at_STOP(Symbol(),MagicNumber,賣出價格,Lots,TP,SL,"Short STOP",3600) ;
OrderBarNo = iBarShift(Symbol(),時間週期,LoadEA); // 紀錄下單時的 K 棒
}
} //end of BarSinceExit > 1
} // end of 空手且不同根K棒() == true
} // end of SE_Cond == true
} //end of 允許交易時段 == true
//+------------------------------------------------------------------+
//| 當沖平倉檢查:若啟用當沖模式,在指定時間強制平倉 |
//+------------------------------------------------------------------+
if(當沖 == true && (getTM_hour(TimeCurrent()) == 當沖出場時間 || getTM_hour(TimeCurrent()) == 1))
{
// 檢查是否有持倉部位需要平倉
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棒()
{
// 每逢新 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_OHLC_Week_Series(); // 設定週線 OHLC 陣列
Get_OHLC_Week(5) ; // 取得最近 5 週數據
// 計算技術指標
set_BigThreeLine(); // 計算大三線指標
ThreeDayHL(); // 計算三日高低點
TwoWeekHL(); // 計算兩週高低點
FloatWeekHL(); // 計算浮動週線高低點
set_DEMARK(); // 計算 DEMARK 指標(TD Sequential)
// ***************
計算BigPOC() ; // 計算大週期的成交量集中點(Point of Control)
// 計算最近 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 當沖平倉()
{
// 檢查是否到達當沖出場時間或凌晨 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) ;
// 紀錄平倉時的 K 棒編號,避免重複平倉
CloseOrderNo = iBarShift(Symbol(),時間週期,LoadEA) ;
}
}
//+------------------------------------------------------------------+
//| 自訂函數:核心監控 - 處理停損、停利、移動止損 |
//+------------------------------------------------------------------+
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()) ; // 計算停損價格
// 移動停損 (Trailing Stop) 邏輯
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()) ;
}
// 動態調整停利停損的進階管理
bool LXcond61,LXcond62 ;
double LE_WinPoint ;
// 計算進場後的最高價與浮動獲利點數
多單最高價 = iHigh(Symbol(),時間週期, iHighest(Symbol(),時間週期,MODE_HIGH,LE_BarsSinceEntry(MagicNumber,多單進場單號,時間週期),1));
LE_WinPoint = 多單最高價-多單進場價格 ; // 計算當前浮動獲利
// 停利目標:原始 TP + 5 日平均波動範圍的 0.618 倍(費波那契比例)
多單停利價格 = NormalizeDouble(多單進場價格 + (TP+Day5Range*0.618) * Point(),Digits()) ;
// 階段一:浮動獲利未達 1.5 倍 SL 時,使用原始固定停損
if((LE_WinPoint/Point()) <= (SL*Point()*1.5))
多單停損價格 = NormalizeDouble(多單進場價格-SL*Point(),Digits());
// 階段二:浮動獲利介於 1.5 倍 SL 至 TP 之間時,停損線提升至(最高價 - 0.5 倍 SL)
if((LE_WinPoint/Point()) > (SL*Point()*1.5) && (LE_WinPoint/Point()) <= (TP*Point()))
多單停損價格 = NormalizeDouble(多單最高價-SL*Point()/2,Digits());
// 階段三:浮動獲利超過 TP 後,停損線提升至(最高價 - 一半的浮動獲利),鎖定利潤
if((LE_WinPoint/Point()) > (TP*Point()))
多單停損價格 = NormalizeDouble(多單最高價-LE_WinPoint/2,Digits());
// 出場條件 1:價格向上突破停利價(觸及停利)
LXcond61 = (多單進場價格 < 多單停利價格 && Close[1] <= 多單停利價格 && Bid > 多單停利價格) ;
// 出場條件 2:價格向下跌破停損價(觸及停損)
LXcond62 = (多單進場價格 > 多單停損價格 && Close[1] >= 多單停損價格 && Bid < 多單停損價格) ;
// 整合出場條件
LX_Cond = (LXcond61 == true || LXcond62 == true) ;
//---------------------------------------------------------多單出場執行
// 確認出場條件成立、不在同一根 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()) ; // 計算停損價格
// 空單移動停損 (Trailing Stop) 邏輯
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()) ;
}
// 使用 6 小時線的收盤價作為停利目標
bool SXcond251 ;
// 停利價格設定為:從當前算起第 3 根 6 小時 K 棒的第 2 個數據點的收盤價
空單停利價格 = NormalizeDouble(get_LRangeOHLC(Symbol(),PERIOD_H6,MODE_CLOSE,3,2),Digits()) ;
// 出場條件 1:價格向下突破停利價(觸及停利)
SXcond251 = (空單進場價格 > 空單停利價格 && Close[1] >= 空單停利價格 && Ask < 空單停利價格) ;
// 出場條件 2:價格向上突破停損價(觸及停損)
// 整合出場條件
SX_Cond = (SXcond251 == true || (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 ;
// 使用指定時間框架的高點加上 ATR 倍數
// 計算公式:時間框架的高點(HBar 根前的第 2 根)+ ATR * 分數倍數(FracA)
// 適用於突破策略,在前高之上設定掛單
BuyPrice = get_HRangeOHLC(Symbol(),時間框架,MODE_HIGH,HBar,2) + a_ATR[2]*FracA;
// 回傳經過正規化處理的價格(依商品點位精度)
return NormalizeDouble(BuyPrice,Digits()) ;
} // end of get BuyPrice
//+------------------------------------------------------------------+
//| 依編號取得空單賣出價格 |
//+------------------------------------------------------------------+
double Get_ShortPrice()
{
double ShortPrice=0.0 ;
// BigPOC(大週期成交量集中點)策略
// 計算公式:BigPOC 價格 - 前波波幅的 0.382 倍(費波那契回撤比例)
// 適用於 BigFVG(大週期公允價值缺口)環境下,在 POC 下方尋找空單機會
ShortPrice = BigPOC_價格 - Range[2]*0.382; // BigPOC下方進場(BigFVG環境下)
// 回傳經過正規化處理的價格(依商品點位精度)
return NormalizeDouble(ShortPrice,Digits()) ;
} // end of get ShortPrice
//+------------------------------------------------------------------+
//| 多單策略模組:定義買入信號 |
//+------------------------------------------------------------------+
void set_BuyCondition()
{
// 週線位階突破 + 高點時間確認 + K 棒型態過濾
// 條件:
// (1) 收盤價突破兩週 67% 分位數(Week67,代表價格位於週線區間的上方 1/3 位置)
// (2) 三日高點距今至少 2 個交易日(高點已形成一段時間)
// (3) 收盤價高於開盤價(紅 K 棒,代表多頭型態)
// 適用於趨勢突破策略,確認多頭結構後進場做多
LE_Cond = (Close[1] > Week67 && DayHPB >= 2 && Close[1] > Open[1]) ; // 突破兩週67%位+三日高點2日前+紅K
}
//+------------------------------------------------------------------+
//| 空單策略模組:定義賣出信號 |
//+------------------------------------------------------------------+
void set_ShortCondition()
{
// DEMARK 低檔背離 + 三線突破
// 條件:
// (1) DEMARK 指標出現低檔背離(價格創新低但指標未創新低,暗示下跌動能衰竭)
// (2) 收盤價跌破 BigMin3L(大週期三線的最低值,代表關鍵支撐被突破)
// 適用於反轉策略,確認背離訊號後,等待價格跌破關鍵支撐線進場放空
SE_Cond = (DEMARK_LDiv_01() && Close[1] < BigMin3L) ; // DEMARK低檔背離01+收盤價跌破三線最低值
}

沒有留言:
張貼留言