核心策略
多單:RSI 站上 50 + FVG 多頭下緣反彈 + 有效漲幅確認(Buy_at_STOP 突破掛單)
空單:VIDYA 帶上影線跌破 + 收黑確認(Short_at_MARKET 市價賣出)
👉 [ 點擊此處領取 範例 EA 體驗版]
交易限制
時段:交易時段(02:00~18:00)
當沖模式:接近收盤時段(>=21:00 或 <=01:00)禁止新倉
商品預設停止下單時間:收盤整點時刻自動刪除所有掛單
每日限 2 次進場:EntriesToday < 2
同根 K 棒不重複下單:BarNumber != OrderBarNo
點差過濾:SP < 商品平均點差 * Point()
資金風控:帳戶餘額 < 資金風控門檻時,強制刪除所有掛單、平倉全部部位並退出 EA
時段:交易時段(02:00~18:00)
當沖模式:接近收盤時段(>=21:00 或 <=01:00)禁止新倉
商品預設停止下單時間:收盤整點時刻自動刪除所有掛單
每日限 2 次進場:EntriesToday < 2
同根 K 棒不重複下單:BarNumber != OrderBarNo
點差過濾:SP < 商品平均點差 * Point()
資金風控:帳戶餘額 < 資金風控門檻時,強制刪除所有掛單、平倉全部部位並退出 EA
進場條件
多單模組:
多單模組:
a_RSIA[1] > 50(RSI 站上 50)+ Close[1] > FVG_多頭下緣價格(FVG 下緣反彈)+ Close[1] > Close[2] + Range[2]*0.2(有效漲幅確認)
空單模組:
空單模組:
High[1] > a_VIDYA_B[1] && Close[1] < a_VIDYA_B[1](VIDYA 帶上影線跌破)+ Close[1] < Open[1](收黑確認)
進場方式
多單下單方式:Buy_at_STOP 突破掛單,有效期 3600 秒
掛單價:a_KC_UPPER[1] + a_StdDEV[2]0.5(肯特納上軌 + 標準差緩衝)
距市價須 > 最小止損2,且 < 價格遠距上限(Close[1]*突破距離百分比)
條件:Close[1] < 買入價格 且非商品收盤時間,且當前無掛單
空單下單方式:Short_at_MARKET 市價賣出,即時成交
多單下單方式:Buy_at_STOP 突破掛單,有效期 3600 秒
掛單價:a_KC_UPPER[1] + a_StdDEV[2]0.5(肯特納上軌 + 標準差緩衝)
距市價須 > 最小止損2,且 < 價格遠距上限(Close[1]*突破距離百分比)
條件:Close[1] < 買入價格 且非商品收盤時間,且當前無掛單
空單下單方式:Short_at_MARKET 市價賣出,即時成交
出場條件
多單出場方式:
多單出場方式:
創新高時(Close[1] > High[2] && High[1] == 多單最高價)TP 上移 TP0.2,SL 以 Bid - SLPoint() 追蹤(停損停利只向有利方向移動);觸及 多單停損價格 / 多單停利價格 即平倉
空單出場方式:
布林帶壓縮後的「不進則退」— 已達最小停利 && BBwidth 收縮 && 連續兩根陽線 觸發平倉;或直接觸及 空單停損價格 / 空單停利價格
當沖強制出場:當沖出場時間(整點)或 01:05 後仍有部位,強制全平
停損停利設計
進場首根 K 棒(BarsSinceEntry == 0)立即呼叫 TPSLchange() 推送初始停損停利至券商端
停損停利價格每 Tick 從 PositionGetDouble(POSITION_TP/SL) 動態讀取,反映追蹤止損的即時狀態
多單:初始停利 = 進場價 + TP*Point();初始停損 = 進場價 - SL*Point()
空單:初始停利 = 進場價 - TP*Point();初始停損 = 進場價 + SL*Point()
進場首根 K 棒(BarsSinceEntry == 0)立即呼叫 TPSLchange() 推送初始停損停利至券商端
停損停利價格每 Tick 從 PositionGetDouble(POSITION_TP/SL) 動態讀取,反映追蹤止損的即時狀態
多單:初始停利 = 進場價 + TP*Point();初始停損 = 進場價 - SL*Point()
空單:初始停利 = 進場價 - TP*Point();初始停損 = 進場價 + SL*Point()
換K棒更新指標
收盤時間前自動刪除全部掛單
更新指標:BBAND、RSI、VIDYA、Keltner Channel、FVG 價格、ATR、波動率、Bar/Day OHLC、Day5Range(五日均幅)
收盤時間前自動刪除全部掛單
更新指標:BBAND、RSI、VIDYA、Keltner Channel、FVG 價格、ATR、波動率、Bar/Day OHLC、Day5Range(五日均幅)
//+------------------------------------------------------------------+
//|
//+------------------------------------------------------------------+
void OnTick()
{
if(!IsMarketOpen(10))
return;
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) ;
ExpertRemove();
return;
}
BarNumber = iBarShift(Symbol(),時間週期,LoadEA);
BarSinceExit = BarNumber - CloseOrderNo;
if((BarNumber == 1 && BarNumber != JudgeNo))
{
CloseOrderNo = -1; // 直接設定,不開倉
}
if(BarNumber != JudgeNo)
{
換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()) ;
//+------------------------------------------------------------------+
//|計算交易手數
//+------------------------------------------------------------------+
if(動態計算手數 == true)
{
Lots = get_dynamic_lot_size(是否偶數單,Symbol(),風險百分比,AccountBalance,SL) ;
Lots = MathMin(0.3,MathMax(0.01,Lots)) ;
}
if(當沖 == true)
{
接近收盤 = (getTM_hour(TimeCurrent()) >= 21 || getTM_hour(TimeCurrent()) <= 1) ;
允許交易時段 = (允許交易時段 && !接近收盤) ;
}
交易時段外也可停損停利();
if(允許交易時段 == true)
{
double 價格遠距上限 = Close[1] * 突破距離百分比; // 距市價不超過0.004%
double 價格遠距下限 = Close[1] * 限價距離百分比; // 距市價不超過0.002%
// SL = MathMax(SL,最小止損*2) ;
//+------------------------------------------------------------------+
//|多單進場
//+------------------------------------------------------------------+
set_BuyCondition();
if(LE_Cond == true && SP < NormalizeDouble(商品平均點差*Point(),Digits()))
{
if(多單部位() == 0 && 空單部位() == 0 && BarNumber != OrderBarNo && BarNumber != CloseOrderNo) // OnTradeTransaction 設定
{
買入價格 = Get_BuyPrice() ;
if(EntriesToday(MagicNumber,Symbol()) < 2)
{
if(買入價格 > Ask + (最小止損*Point()) * 2 // 高於市價且超過最小止損距離*2
&& 買入價格 < Ask + 價格遠距上限 // 距離不超過收盤價0.4%
&& Close[1] < 買入價格 && getTM_hour(TimeCurrent()) != 商品收盤時間)
{
// 空手+掛單突破買入
if(total_pending_order_count(Symbol(), MagicNumber,-1) == 0)
{
Print("✅✅✅ 準備開突破多單 | K棒:", BarNumber,
" | 掛單價:", 買入價格,
" | 距市價%:", DoubleToString((買入價格 - Ask) / Close[1] * 100, 3));
多單進場單號 = Buy_at_STOP(Symbol(),MagicNumber,買入價格,Lots,TP,SL,"BUY STOP",3600) ;
}
}
} // end of EntriesToday
} // end of 空手且不同根K棒() == true
} // end of LE_Cond == true
//+------------------------------------------------------------------+
//|空單進場
//+------------------------------------------------------------------+
set_ShortCondition() ;
if(SE_Cond == true && SP < NormalizeDouble(商品平均點差*Point(),Digits()))
{
if(多單部位() == 0 && 空單部位() == 0 && BarNumber != OrderBarNo && BarNumber != CloseOrderNo) // OnTradeTransaction 設定
{
if(EntriesToday(MagicNumber,Symbol()) < 2)
{
// 空手+市價賣出
Print("✅✅✅ 準備開市價空單 | K棒:", BarNumber);
空單進場單號 = Short_at_MARKET(Symbol(),Lots,TP,SL,"Short Market",MagicNumber) ;
} //end of EntriesToday
} // end of 空手且不同根K棒() == true
} // end of SE_Cond == true
} //end of 允許交易時段 == true
//+------------------------------------------------------------------+
//|
//+------------------------------------------------------------------+
if(當沖 == true && (getTM_hour(TimeCurrent()) == 當沖出場時間 || (getTM_hour(TimeCurrent()) == 1 && getTM_min(TimeCurrent()) > 5)))
{
if(多單部位() > 0 || 空單部位() > 0)
{
當沖平倉();
}
}
//+------------------------------------------------------------------+
//|
//+-------------------------------------------------------------------+
// 交易時段外也可停損停利();
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 ;
}
//+------------------------------------------------------------------+
//|
//+------------------------------------------------------------------+
void 換K棒()
{
// 商品收盤時間前刪除所有掛單
if((getTM_hour(TimeCurrent()) == 商品收盤時間) && (total_pending_order_count(Symbol(), MagicNumber,-1) != 0))
{
delete_pending_orders_all(Symbol(), MagicNumber, -1, 0x0000ff);
}
Set_OHLC_Bar_Series(); //保留
Set_OHLC_Day_Series(); //保留
Get_OHLC_Bar(30) ; //保留
Get_OHLC_Day(15) ; //保留
set_BarInfo(); //保留
set_ATR(); //保留
Get_Volatility() ; //保留
set_BBAND();
set_RSI();
set_VIDYA() ;
set_KELTNER_CHANNEL() ;
計算FVG價格() ;
Day5Range = ((HighD[1] - LowD[1])+(HighD[2] - LowD[2])+(HighD[3] - LowD[3])+(HighD[4] - LowD[4])+(HighD[5] - LowD[5]))/5;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void 交易時段賦值()
{
允許交易時段 = (getTM_hour(TimeCurrent()) >= 2 && getTM_hour(TimeCurrent()) < 18);
}
//+------------------------------------------------------------------+
//|
//+------------------------------------------------------------------+
void 當沖平倉()
{
if((getTM_hour(TimeCurrent()) == 當沖出場時間 || getTM_hour(TimeCurrent()) == 1))
{
if(多單部位() > 0 && BarNumber != CloseOrderNo)
LX_CloseByTicket(多單進場單號,Lots) ;
if(空單部位() > 0 && BarNumber != CloseOrderNo)
SX_CloseByTicket(空單進場單號,Lots) ;
// CloseOrderNo = BarNumber ;
}
}
//+------------------------------------------------------------------+
//|
//+------------------------------------------------------------------+
void 交易時段外也可停損停利()
{
// 交易時段外也可停損停利
if(多單部位() > 0)
{
//+------------------------------------------------------------------+
//| 多單出場邏輯
//+------------------------------------------------------------------+
double 多單最小停利 = 0.0, 多單保本價格 = 0.0 ;
bool LX_MinPF = false, LongPull = false;
多單進場價格 = LE_EntryPrice(MagicNumber, 多單進場單號);
多單最小停利 = NormalizeDouble(多單進場價格 + SP * 3, Digits());
LX_MinPF = Bid > 多單最小停利;
// 計算進場後的最高價
多單最高價 = iHigh(Symbol(), 時間週期, iHighest(Symbol(), 時間週期, MODE_HIGH, LE_BarsSinceEntry(MagicNumber, 多單進場單號, 時間週期), 1));
多單最高價 = NormalizeDouble(多單最高價, Digits());
//--- 進場時設定初始停損停利
if(LE_BarsSinceEntry(MagicNumber, 多單進場單號, 時間週期) == 0)
{
double 初始停利 = NormalizeDouble(多單進場價格 + TP * Point(), Digits());
double 初始停損 = NormalizeDouble(多單進場價格 - SL * Point(), Digits());
TPSLchange(Symbol(), 多單進場單號, 初始停利, 初始停損, 時間週期);
}
// 獲取當前實際的 TP/SL (供 LX_Cond 判斷用)
if(PositionSelectByTicket(多單進場單號))
{
多單停利價格 = PositionGetDouble(POSITION_TP);
多單停損價格 = PositionGetDouble(POSITION_SL);
}
//+------------------------------------------------------------------+
//| 出場方式計算
//+------------------------------------------------------------------+
//--- 出場方式 :創新高時 TP 向上移動 TP*0.2
if(Close[1] > High[2] && High[1] == 多單最高價)
{
double 新停利 = NormalizeDouble(多單停利價格 + (TP * 0.2) * Point(), Digits());
double 新停損 = NormalizeDouble(Bid - SL * Point(), Digits());
if(新停利 > 多單停利價格)
多單停利價格 = 新停利 ;
if(新停損 > 多單停損價格)
多單停損價格 = 新停損 ;
TPSLchange(Symbol(), 多單進場單號, 多單停利價格, 多單停損價格, 時間週期);
}
LX_Cond = (Bid <= 多單停損價格) || (Bid >= 多單停利價格);
//+------------------------------------------------------------------+
//| 多單出場執行
//+------------------------------------------------------------------+
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;
空單進場價格 = SE_EntryPrice(MagicNumber, 空單進場單號);
空單最小停利 = NormalizeDouble(空單進場價格 - SP * 3, Digits());
SX_MinPF = Ask < 空單最小停利;
// 計算進場後的最低價
空單最低價 = iLow(Symbol(), 時間週期, iLowest(Symbol(), 時間週期, MODE_LOW, SE_BarsSinceEntry(MagicNumber, 空單進場單號, 時間週期), 1));
空單最低價 = NormalizeDouble(空單最低價, Digits());
//--- 進場時設定初始停損停利
if(SE_BarsSinceEntry(MagicNumber, 空單進場單號, 時間週期) == 0)
{
double 初始停利 = NormalizeDouble(空單進場價格 - TP * Point(), Digits());
double 初始停損 = NormalizeDouble(空單進場價格 + SL * Point(), Digits());
TPSLchange(Symbol(), 空單進場單號, 初始停利, 初始停損, 時間週期);
}
// 獲取當前實際的 TP/SL (供 SX_Cond 判斷用)
if(PositionSelectByTicket(空單進場單號))
{
空單停利價格 = PositionGetDouble(POSITION_TP);
空單停損價格 = PositionGetDouble(POSITION_SL);
}
//+------------------------------------------------------------------+
//| 出場方式計算
//+------------------------------------------------------------------+
// 布林帶壓縮後的「不進則退」
SX_Cond = (Ask < 空單最小停利 && a_BBwidth[1] < Low_BBW && Close[1] > Open[1] && Close[2] > Open[2])
|| (Ask >= 空單停損價格) || (Ask <= 空單停利價格);
//+------------------------------------------------------------------+
//| 空單出場執行
//+------------------------------------------------------------------+
if(SX_Cond == true && BarNumber != OrderBarNo && BarNumber != CloseOrderNo &&
SE_BarsSinceEntry(MagicNumber, 空單進場單號, 時間週期) > 0)
{
SX_CloseByTicket(空單進場單號, Lots);
}
} // end of 空單部位() > 0
} // end of 交易時段外也可停損停利()
//+------------------------------------------------------------------+
//| 依編號Get_BuyPrice
//+------------------------------------------------------------------+
double Get_BuyPrice()
{
double BuyPrice = 0.0;
BuyPrice = a_KC_UPPER[1] + a_StdDEV[2]*0.5;
return NormalizeDouble(BuyPrice,Digits()) ;
} // end of get BuyPrice
//+------------------------------------------------------------------+
//|多單模組編號
//+------------------------------------------------------------------+
void set_BuyCondition()
{
LE_Cond = (a_RSIA[1] > 50 && Close[1] > FVG_多頭下緣價格 && Close[1] > Close[2] + Range[2] * 0.2); // 編號261: RSI站上50+FVG下緣反彈+有效漲幅確認
}
//+------------------------------------------------------------------+
//| 空單模組編號
//+------------------------------------------------------------------+
void set_ShortCondition()
{
SE_Cond = High[1] > a_VIDYA_B[1] && Close[1] < a_VIDYA_B[1] && Close[1] < Open[1];
}

沒有留言:
張貼留言