MQL4プログラミング:ロング・ショートポジションを判定してグローバル変数に格納する方法
MetaTrader 4(MT4)での自動売買プログラムでは、現在のポジションがロング(買い)かショート(売り)かを判定し、それに基づいて処理を分岐することがよくあります。今回は、OrderSelect()関数を使ってポジションの種類を判定し、その結果をグローバル変数に格納する方法を解説します。
ロジック概要
1. ポジション情報の取得
OrderSelect()関数で現在のポジション情報を取得します。
2. ポジションの種類を判定
OrderType()関数を使用して、ロングポジション(OP_BUY)またはショートポジション(OP_SELL)かを確認します。
3. グローバル変数への格納
ロングの場合はグローバル変数myPositionに1を、ショートの場合は-1を格納します。
サンプルコード
以下は、現在のポジションを確認してグローバル変数myPositionに値を代入するサンプルコードです。
int myPosition = 0; // 1: ロング, -1: ショート, 0: ポジションなし
// ポジションの種類を判定する関数
// グローバル変数
void CheckPosition() {
int totalOrders = OrdersTotal(); // 現在の未決済ポジション数を取得
myPosition = 0; // 初期化(ポジションなしの場合の値)
for (int i = 0; i < totalOrders; i++) {
// ポジション情報を選択
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
// 現在のポジションがロングかショートかを判定
if (OrderType() == OP_BUY) {
myPosition = 1; // ロングポジション
Print("ロングポジションを確認しました。");
} else if (OrderType() == OP_SELL) {
myPosition = -1; // ショートポジション
Print("ショートポジションを確認しました。");
}
break; // 最初に確認したポジションで処理を終了
} else {
// エラー処理
Print("ポジション選択に失敗しました: エラーコード ", GetLastError());
}
}
// ポジションがない場合のログ
if (myPosition == 0) {
Print("現在ポジションは保有していません。");
}
}
実行のポイント
1. OrdersTotal()で未決済ポジション数を確認
OrdersTotal()関数で現在保有しているポジション数を取得します。これが0の場合、ポジションは保有していないことになります。
2. OrderSelect()でポジション情報を取得
ループ処理を使い、1件ずつポジション情報を選択します。
3. ポジションの種類を判定
OrderType()を使用して、ロングポジション(OP_BUY)かショートポジション(OP_SELL)かを判定します。
4. グローバル変数myPositionに代入
ロングポジションの場合は1、ショートポジションの場合は-1を代入します。ポジションがない場合は0を保持します。
出力例
ケース1: ロングポジションを保有している場合
ログに以下のメッセージが表示されます。
ロングポジションを確認しました。
ケース2: ショートポジションを保有している場合
ログに以下のメッセージが表示されます。
ショートポジションを確認しました。
ケース3: ポジションを保有していない場合
ログに以下のメッセージが表示されます。
現在ポジションは保有していません。
注意点
1. 複数ポジションへの対応
このサンプルコードでは最初に確認したポジションを基にmyPositionを設定しています。複数ポジションを管理する場合は、ロジックを拡張する必要があります。
2. エラー処理
OrderSelect()が失敗した場合のエラーハンドリングを適切に行うことで、プログラムの安定性を向上させます。
まとめ
このように、OrderSelect()とOrderType()を組み合わせることで、現在のポジションの種類を判定し、グローバル変数で管理することができます。ポジション情報を適切に取得することで、EA(エキスパートアドバイザ)のロジックをより高度に制御することが可能になります。
ぜひ、自分の自動売買プログラムに応用してみてください!
つづくStep3 ポジション決済 OrderClose()関数