Step2.2 エントリーの有無を変数に格納してみよう

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()関数