市佔率穩居首位的外匯交易平台,是由俄羅斯Metaquotes 軟體公司所開發的MetaTrader 4 (MT4)平台,並於2010年推出了MetaTrader 5(MT5)平台,MQL5(MetaQuotes Language 5)是一種強大的編程語言,專為撰寫交易策略、技術指標、腳本和功能庫等自動化交易系統而設計。MQL5 提供了大量預先定義的功能和服務,幫助開發者快速構建複雜的交易機器人(EA)、自定義指標和腳本。讓交易策略的自動化成為可能。無論是專業的交易者還是有志於自動化交易系統開發的程序員,MQL5 都提供了必要的工具和資源,以支持他們的工作。
以往部落格文章主要內容在於應用 MultiCharts 平台開發交易策略,2025開始會應用MT5平台 開發一些外匯商品的交易策略,也期盼在量化交易的推廣上有所助益
PS: 策略寫法是單向持單 (會先平掉反向單 再進場)

#include <Trade\Trade.mqh>
#include <MagicMT5_函數庫V1.mqh>
ENUM_TIMEFRAMES 時間週期 = PERIOD_M20;
//+------------------------------------------------------------------+
//|
//+------------------------------------------------------------------+
int OnInit()
{
LoadEA = TimeCurrent();
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//|
//+------------------------------------------------------------------+
void OnTick()
{
if(AccountInfoDouble(ACCOUNT_BALANCE) <= 資金風控)
{
Alert("********** 資金不足 *************");
return;
}
BarNumber = iBarShift(Symbol(),時間週期,LoadEA); //取得回測區間的 K棒數
BarSinceExit = BarNumber-CloseOrderNo ; // 用來取得距離前一筆交易出場後的K棒數量
if((BarNumber == 1 && BarNumber != JudgeNo))
{
多單進場單號 = Buy_at_MARKET(Symbol(),Lots,0,0,"1st_K",MagicNumber) ;
LX_CloseByTicket(多單進場單號,Lots) ;
CloseOrderNo = iBarShift(Symbol(),時間週期,LoadEA);
FastSma = MathMin(LenA1, LenB1);
SlowSma = MathMax(LenA1, LenB1);
}
if(BarNumber != JudgeNo)
{
換K棒();
允許交易時段 = (getTM_hour(TimeCurrent()) >= 10 || getTM_hour(TimeCurrent()) < 2);
}
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(Lots_AutoCal == true)
{
Lots = get_dynamic_lot_size(Lots_Even,Symbol(),RiskPercent,AccountBalance,SL) ;
Lots = MathMin(0.3,MathMax(0.01,Lots)) ;
}
if(允許交易時段 == true)
{
//+------------------------------------------------------------------+
//|多單進場
//+------------------------------------------------------------------+
LE_Cond = (_3GreatThanBBUp()) ;
if(LE_Cond == true)
{
if(空單部位() > 0 && BarNumber != OrderBarNo)
sell_order_close_all(Symbol(), MagicNumber, ORDER_TYPE_SELL); // 空單先全部平倉
if(多單部位() == 0 && BarNumber != OrderBarNo)
{
買入價格 = NormalizeDouble(Highest_OHLC(Symbol(),PERIOD_D1,MODE_OPEN,HBar) + Range[1]*0.5,Digits()) ;
// 空手+市價單
if(BarSinceExit > 1)
{
多單進場單號 = Buy_at_MARKET(Symbol(),Lots,TP,SL,"BUY MARKET",MagicNumber) ;
OrderBarNo = iBarShift(Symbol(),時間週期,LoadEA);
}
}
}
//+------------------------------------------------------------------+
//|空單進場
//+------------------------------------------------------------------+
SE_Cond = (DayBlack3Bar_LClose() && a_RSIA[1] > 50) ;
if(SE_Cond == true)
{
if(多單部位() > 0 && BarNumber != OrderBarNo)
buy_order_close_all(Symbol(), MagicNumber, ORDER_TYPE_BUY);
if(空單部位() == 0 && BarNumber != OrderBarNo)
{
賣出價格 = NormalizeDouble(Lowest_OHLC(Symbol(),PERIOD_D1,MODE_LOW,LBar) - Range[1]*0.5,Digits());
// 空手+掛單賣出
if(BarSinceExit > 1)
{
if(Close[1] > 賣出價格)
{
空單進場單號 = Short_at_STOP(Symbol(),MagicNumber,賣出價格,Lots,TP,SL,"Short STOP",3600) ;
OrderBarNo = iBarShift(Symbol(),時間週期,LoadEA);
}
}
}
}
}
//+------------------------------------------------------------------+
//| 多單平倉
//+------------------------------------------------------------------+
if(多單部位() > 0)
{
多單進場價格 = LE_EntryPrice(MagicNumber,多單進場單號);
多單停利價格 = 多單進場價格 + TP * Point() ;
多單停損價格 = 多單進場價格 - SL * Point() ;
LX_Cond = ((Close[1] <= 多單停利價格 && Bid > 多單停利價格) || (Close[1] >= 多單停損價格 && Bid < 多單停損價格)) ;
//---------------------------------------------------------多單出場
if(LX_Cond == true && BarNumber != CloseOrderNo)
{
LX_CloseByTicket(多單進場單號,Lots) ;
if(多單部位() == 0)
{
CloseOrderNo = iBarShift(Symbol(),時間週期,LoadEA) ;
}
}
} // end of 多單部位() > 0
//+------------------------------------------------------------------+
//| 空單平倉
//+------------------------------------------------------------------+
if(空單部位() > 0)
{
空單進場價格 = SE_EntryPrice(MagicNumber,空單進場單號);
bool SXcond51,SXcond52 ;
空單停利價格 = MathMin(a_ICHI_SA[1], a_ICHI_SB[1]) - Range[1] * 2;
空單停損價格 = MathMax(a_ICHI_SA[1], a_ICHI_SB[1]) + Range[1] * 2;
SXcond51 = (空單進場價格 > 空單停利價格 && Close[1] >= 空單停利價格 && Ask < 空單停利價格) ;
SXcond52 = (空單進場價格 < 空單停損價格 && Close[1] <= 空單停損價格 && Ask > 空單停損價格) ;
SX_Cond = (SXcond51 == true || SXcond52 == true) ;
//---------------------------------------------------------空單出場
if(SX_Cond == true && BarNumber != CloseOrderNo)
{
SX_CloseByTicket(空單進場單號,Lots) ;
if(空單部位() == 0)
{
CloseOrderNo = iBarShift(Symbol(),時間週期,LoadEA) ;
}
}
} // end of 空單部位() > 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 ;
}
//+------------------------------------------------------------------+
//| 新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();
Set_OHLC_Day_Series();
Get_OHLC_Bar(10) ;
Get_OHLC_Day(10) ;
set_BarInfo();
set_BBAND();
set_RSI();
set_ICHIMOKU();
}
交易商品 XAUUSDXXX 樣本內區間 2019/1/1 ~2022/12/31 交易手數 固定 0.1手


沒有留言:
張貼留言