ホーム » ソース共通化 » 取引関数 » OrderComment() – 取引関数

OrderComment() – 取引関数

取引関数

取引関数OrderComment()PositionComment()について、MQL4とMQL5のソースコード共通化する方法を説明しています。

関数定義

MQL4の定義

string  OrderComment();

ポジション、オーダーの区別はなくコメントを取得します。

MQL5の定義

定義なし

MQL5には、OrderComment()がありません。

共通化方法

  • Order系関数はオーダーで使用することとする
    OrderComment()
  • Position系関数はポジションで使用することとする
    PositionComment()

ただし、MQL5でオーダーはOrder系関数を使った記述をしても、MQL4に移植するとポジションも含まれてしまいます。

ソースを共通化するだけではなく、MQL4→MQL5とMQL5→MQL4への移植のケースもあると思います。よってこれら2つのケースも考慮したソース共通化を考えます。

No.移植方法特徴
1MQL4→MQL5オーダー、ポジション共にOrderComment()でコメントの取得が行われている
OrderComment()はオーダー、ポジションの区別をしない使われ方をしていることを考慮する必要がある
PositionComment()の使用に分けた実装にすることが望ましい
2MQL5→MQL4MQL4と同じ引数のOrderComment()を定義するが、OrderComment()はオーダーのコメントを取得することと定義し、ポジションはPositionComment()関数を定義して利用することとする
考慮すべき移植方法

ソース共通化

対処方法

共通化するためにMQL4とMQL5用の定義をします。
#ifdef __MQL5__ ~ #elseを使用することでMQL5のコンパイルにのみ有効となります。
#else~#endifはMQL5以外となるため、必然的にMQL4でのコンパイルのみ有効となります。

#ifdef __MQL5__
///////////////////////////////////////////////////////////////////////////////
// オーダーのコメントを取得
string OrderComment()
{
	string strResult = OrderGetString(ORDER_COMMENT);
	return strResult;
}
///////////////////////////////////////////////////////////////////////////////
// ポジションのコメントを取得
string PositionComment()
{
	string strResult = PositionGetString(POSITION_COMMENT);
	return strResult;
}
#else	//__MQL4__
///////////////////////////////////////////////////////////////////////////////
// ポジションのコメントを取得
string PositionComment()
{
	return OrderComment();
}
#endif

MQL5にOrderComment()とPositionComment()の定義をし、MQL4にはPositionComment()を定義しています。
MQL4のPositionComment()は、OrderComment()をそのまま呼び出す移植用のラッパー関数でしかありません。そのため、オーダーに対して使用してもそのまま動作します。よってMQL5に移植した場合に動作が不一致になるため、間違った使用をしないように注意が必要です。

使用例

ポジションとオーダーをオープンし、それぞれでオーダー、ポジションのコメントを取得しています。

input	int			MagicNumber = 1;
int iNewTicket = -1;
int OnInit()
{
#ifdef __MQL5__
	Print("これはMT5で動作しています");
#else	//__MQL4__
	Print("これはMT4で動作しています");
#endif
	return(INIT_SUCCEEDED);
}
void OnTick()
{
	if (-1 == iNewTicket) {
		iNewTicket = OrderSend(Symbol(), OP_BUY, 0.02,
					NormalizeDouble(Ask, Digits()),		//注文価格
					10,
					NormalizeDouble(20000, Digits()),	//S/L
					NormalizeDouble(25500, Digits()),	//T/P
					"Position",
					MagicNumberOrder,
					0,
					clrBlue);
		if (0 <= iNewTicket) {
			if (PositionSelect(iNewTicket, SELECT_BY_TICKET)) {
				Print("PositionComment():", PositionComment());
				Print("OrderComment():", OrderComment());
			}
		}
		int iNewOrder = OrderSend(Symbol(), OP_BUYSTOP, 0.03,
					NormalizeDouble(22000, Digits()),		//注文価格
					10,
					NormalizeDouble(20000, Digits()),		//S/L
					NormalizeDouble(25000, Digits()),		//T/P
					"Order",
					MagicNumberPosition,
					0,
					clrBlue);
		if (0 <= iNewOrder) {
			if (OrderSelect(iNewOrder, SELECT_BY_TICKET)) {
				Print("PositionComment():", PositionComment());
				Print("OrderComment():", OrderComment());
			}
		}
	}
}

以下の関数については別途説明します。

  1. OrderSend()
  2. OrderSelect()、PositionSelect()
MT5での実行結果
MT5での実行結果

1回目のOrderComment()はポジションであるため、コメントは取得できません
2回目のPositionComment()は最初のコメントがそのまま引き継がれているため、1回目のポジションのコメントはPositionになります。

MT4での実行結果
MT4での実行結果

1回目のOrderComment()はポジションにもかかわらず、ポジションと同じでコメントはPositionになります。
2回目のPositionOpenTime()はオーダーにもかかわらず、ポジションと同じでコメントはOrderになります。

これらの差が、ポジションとオーダーを区別していないMQL4での特徴です。この特徴を認識した上で注意した実装が必要です。

余談

ヒナタ
ヒナタ

MQL5で無くなった関数名ね

ITサービス屋
ITサービス屋

オーダーとポジションそれぞれに用意するとリファレンスが増えるから纏めたと予想

ヒナタ
ヒナタ

大人の事情なのね・・・💤

コメント

タイトルとURLをコピーしました