這是一個基於RSI背離與多重超賣鈍化的反轉交易策略。策略採用當沖模式,結合技術指標背離信號與超賣/超買狀態識別進場時機,並設有保本機制與固定時間強制平倉。
基礎設定
資金門檻: 低於門檻停止交易並發出警示
點差限制: SP < 商品平均點差 × Point()
交易時段: 02:00~10:00
當沖限制: 18:00~01:00禁止開倉,指定時間強制平倉
每日限制: 最多1次進場
冷卻期: BarSinceExit > 1(平倉後至少間隔1根K棒)
新K棒清倉: 自動刪除所有未成交掛單並更新指標
資金門檻: 低於門檻停止交易並發出警示
點差限制: 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基礎班》,用量化思維,開啟你的交易新紀元!
報名連結 =>> 外匯實戰 MT5 EA基礎班

沒有留言:
張貼留言