前面學會了用OrderSend()函數下單,而現在我們就可以用OOP(物件導向程式設計)來創建可重複使用的下單類型(order class)。
在這邊我會用與mql5預設相同的檔名來分享,而真正在範例或預設檔中的程式碼沒那麼簡單。
實際操作中,可以在MQL5/Include中創建屬預自己的資料夾,再將測試碼儲存其中。
如圖:
先創建一個class,而習慣上使用class都是開頭大寫C,後面隨便加一個大寫的class名,此處為交易class,所以使用CTrade。
class CTrade{
private:
MqlTradeRequest request;
public:
MqlTradeResult result;
};
添加物建至宣告中,他們是最常用的。而因為request物件為設計師的交易策略,通常不公開,所以設成私人,result因為所有人都需要獲取交易返回碼來確認交易結果所以設公開。
OpenPosition()函數並不是標準的內置函數。而在這邊為自己命名的函數,代表他會開倉,而不是預掛單。
class CTrade{
private:
MqlTradeRequest request;
bool OpenPosition(string pSymbol, ENUM_ORDER_TYPE pType, double pVolume, double pStop = 0, double pProfit = 0,string pComment = NULL); //新增
public:
MqlTradeResult result;
};
此處參數變數開頭以p為開頭,即parameter,表示為本地函數的變數。
bool CTrade::OpenPosition(string pSymbol, ENUM_ORDER_TYPE pType, double pVolume, double pStop = 0, double pProfit = 0,string pComment = NULL){
request.action= TRADE_ACTION_DEAL;
request.symbol= pSymbol;
request.type= pType;
request.sl= pStop;
request.tp= pProfit;
request.comment= pComment;
}
這段定義在上一章有提過,TRADE_ACTION_DEAL為市價單,其他函數則分配給各自的request變數。
本函數設定目的為:開一口淨多/空倉。
首先我們要先確定原先有沒有已開啟的倉位,如果有,則檢索類型及數量。
double positionLots = 0;
long positionType = WRONG_VALUE;
if(PositionSelect(pSymbol) == true){
positionLots = PositionGetDouble(POSITION_VOLUME);
positionType = PositionGetInteger(POSITION_TYPE);
}
此處使用WRONG_VALUE是因為他的常數整數值為-1,而倉位類型是ENUM_POSITION_TYPE,0代表多頭倉位,所以不將其初始化位0在後期若需要排除錯誤會方便許多。
我們已經獲取了目前倉位資訊,下來就要計算交易量了。
if((pType == ORDER_TYPE_BUY && positionType == POSITION_TYPE_SELL) || (pType == ORDER_TYPE_SELL && positionType == POSITION_TYPE_BUY)){
request.volume = pVolume + positionLots;
}
else request.volume = pVolume;
此處表示若市價單類型為買單且當時倉位為賣出倉位,則將預期下單手數(pVolume)加上剛剛獲取已有倉位的手數(positionLots),反之亦然。
若當前無賣出/買入倉位,則下單手數便是預期下單手數。
最後我們要分配目前市價給變數,若為買單是Ask價,賣單則是Bid價:
if(pType == ORDER_TYPE_BUY){
request.price = SymbolInfoDouble(pSymbol, SYMBOL_ASK);
}
else if(pType == ORDER_TYPE_SELL){
request.price = SymbolInfoDouble(pSymbol, SYMBOL_BID);
}
綜合以上,我們已經創建好一個基本的order class了,只要在最後調用OrderSend即可下市場單。
但這還不能在EA中實現下單,僅為在實際操盤中使用的一個東西,真正還需要更多在不同情況下運作的函數。
而且此類型還尚未編寫關於錯誤處理的問題,這些相關的錯誤問題我會在明天的文章說明。
參考資料:
快速學會MetaTrader5貨幣交易 知果文化出版
CHATGPT