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

OrderOpenPrice() – 取引関数

取引関数

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

関数定義

MQL4の定義

double  OrderOpenPrice();

ポジション、オーダーの区別はなくオープン価格を取得します。

MQL5の定義

定義なし

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

共通化方法

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

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

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

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

ソース共通化

対処方法

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

#ifdef __MQL5__
///////////////////////////////////////////////////////////////////////////////
// オーダーのオープン価格を取得
double OrderOpenPrice()
{
	double dResult = OrderGetDouble(ORDER_PRICE_OPEN);
	return dResult;
}
///////////////////////////////////////////////////////////////////////////////
// ポジションのオープン価格を取得
double PositionOpenPrice()
{
	double dResult = PositionGetDouble(POSITION_PRICE_OPEN);
	return dResult;
}
#else	//__MQL4__
///////////////////////////////////////////////////////////////////////////////
// ポジションのオープン価格を取得
double PositionOpenPrice()
{
	return OrderOpenPrice();
}
#endif

MQL5にOrderOpenPrice()とPositionOpenPrice()の定義をし、MQL4にはPositionOpenPrice()を定義しています。
MQL4のPositionOpenPrice()は、OrderOpenPrice()をそのまま呼び出す移植用のラッパー関数でしかありません。そのため、オーダーに対して使用してもそのまま動作します。よって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(100, Digits()),		//S/L
					NormalizeDouble(150, Digits()),		//T/P
					"",
					MagicNumber,
					0,
					clrBlue);
		if (0 <= iNewTicket) {
			if (PositionSelect(iNewTicket, SELECT_BY_TICKET)) {
				Print("PositionOpenPrice():", PositionOpenPrice());
				Print("OrderOpenPrice():", OrderOpenPrice());
			}
		}
		int iNewOrder = OrderSend(Symbol(), OP_BUYSTOP, 0.03,
					NormalizeDouble(140, Digits()),		//注文価格
					10,
					NormalizeDouble(100, Digits()),		//S/L
					NormalizeDouble(150, Digits()),		//T/P
					"",
					MagicNumber,
					0,
					clrBlue);
		if (0 <= iNewOrder) {
			if (OrderSelect(iNewOrder, SELECT_BY_TICKET)) {
				Print("PositionOpenPrice():", PositionOpenPrice());
				Print("OrderOpenPrice():", OrderOpenPrice());
			}
		}
	}
}

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

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

1回目のOrderOpenPrice()はポジションであるため、オープン価格は取得できません(0.0)。
2回目のPositionOpenPrice()は最初の価格がそのまま引き継がれているため、2回目のポジションのオープン価格は135.613になります。

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

1回目のOrderOpenPrice()はポジションにもかかわらず、ポジションと同じでオープン価格は135.47になります。
2回目のPositionOpenPrice()はオーダーにもかかわらず、ポジションと同じでオープン価格は140になります。

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

コメント

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