iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
SideProject30

從零開始的外匯自動程式交易系列 第 18

DAY18 建立下單類型與除錯(上)

  • 分享至 

  • xImage
  •  

前面學會了用OrderSend()函數下單,而現在我們就可以用OOP(物件導向程式設計)來創建可重複使用的下單類型(order class)。

在這邊我會用與mql5預設相同的檔名來分享,而真正在範例或預設檔中的程式碼沒那麼簡單。
實際操作中,可以在MQL5/Include中創建屬預自己的資料夾,再將測試碼儲存其中。
如圖:
https://ithelp.ithome.com.tw/upload/images/20231003/2016311496hqnZoPAN.png

創建CTrade

先創建一個class,而習慣上使用class都是開頭大寫C,後面隨便加一個大寫的class名,此處為交易class,所以使用CTrade。

class CTrade{
    private:
        MqlTradeRequest request;
    public:
        MqlTradeResult result;
};

添加物建至宣告中,他們是最常用的。而因為request物件為設計師的交易策略,通常不公開,所以設成私人,result因為所有人都需要獲取交易返回碼來確認交易結果所以設公開。

1° OpenPosition()

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,表示為本地函數的變數。

2° 定義OpenPosition()

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變數。

3° 確認交易量

本函數設定目的為:開一口淨多/空倉。

首先我們要先確定原先有沒有已開啟的倉位,如果有,則檢索類型及數量。

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),反之亦然。
若當前無賣出/買入倉位,則下單手數便是預期下單手數。

4° 確定買賣

最後我們要分配目前市價給變數,若為買單是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


上一篇
DAY17 下單與交易請求結構(下)
下一篇
DAY19 建立下單類型與除錯(下)
系列文
從零開始的外匯自動程式交易30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言