取引関数のOrderDelete()について、MQL4とMQL5のソースコード共通化する方法を説明しています。
関数定義
MQL4の定義
bool OrderDelete(
int ticket, // ticket
color arrow_color // color
);
オーダー専用の削除です。ポジションを削除するという概念は無く、クローズのためポジションに使うことはありません。
MQL5の定義
定義なし
MQL5には、OrderDelete()がありません。
共通化方法
- Order系関数はオーダーで使用することとする
OrderModify() - Position系関数は必要がない
ソースを共通化するだけではなく、MQL4→MQL5とMQL5→MQL4への移植のケースもあると思います。よってこれら2つのケースも考慮したソース共通化を考えます。
No. | 移植方法 | 特徴 |
---|---|---|
1 | MQL4→MQL5 | オーダーの削除にOrderDelete()が使用される MQL5には存在しない関数のため同じ関数定義で利用可能にする |
2 | MQL5→MQL4 | MQL5には存在しない関数のため同じ関数定義で利用可能にする MQL4に移植した場合は、組込み関数が利用可能である |
ソース共通化
対処方法
共通化するためにMQL5用の定義をします。
#ifdef __MQL5__ ~ #endifを使用することでMQL5のコンパイルにのみ有効となります。
#ifdef __MQL5__
///////////////////////////////////////////////////////////////////////////////
// オーダーを削除する
bool OrderDelete(long lTicket, color arrow_color = clrNONE)
{
bool bResult = false;
MqlTradeRequest mqlRequest = {};
MqlTradeResult mqlResult = {};
ZeroMemory(mqlRequest);
ZeroMemory(mqlResult);
mqlRequest.action=TRADE_ACTION_REMOVE; // 取引操作タイプ
mqlRequest.order = lTicket; // 注文チケット
bResult = OrderSend(mqlRequest, mqlResult);
if (bResult) {
} else {
//Error
}
return bResult;
}
#endif
MQL5にOrdeDelete()の定義をします。
MQL4はOrderDelete()の組込み関数をそのまま利用します。
使用例
OrderSelect()で説明しています。
余談
ヒナタ
これは残していい関数名な気もするけど・・・
ITサービス屋
何が正解ってこともないから、きっとMQL5で関数を設計する人が変わったんだわ
ヒナタ
そういうことなの・・・💤
コメント