Step2 ポジション確認 OrderSelect()関数

close up photo of programming of codes
Photo by luis gomes on Pexels.com

Step1 で構築した基本構造に少しずつコードを書き込んでみましょう

// エントリーの有無を確認する
  OrderSelect( ・・・ );

// エントリーがある場合
  if( 決済ロジック )
  {
    OrderClose( ・・・ );
  }

// エントリーがない場合
  if( エントリーロジック )
  {
    OrderSend( ・・・ );
  }

MetaTrader 4(MT4)での自動売買プログラム作成には、現在のポジションや注文情報を取得するための関数が欠かせません。その中でも重要な役割を果たすのが、OrderSelect()関数です。

この記事では、OrderSelect()関数の使い方と、その具体例をわかりやすく解説します。


OrderSelect()とは?

OrderSelect()は、現在保有しているポジションや、履歴の中から特定の注文情報を取得するための関数です。この関数を使うことで、現在のポジションの詳細(通貨ペア、ロットサイズ、価格など)にアクセスできます。


基本的な構文

bool OrderSelect(int index, int select, int pool = MODE_TRADES);

引数の説明

  1. index
    取得する注文やポジションのインデックス番号。これには、注文番号やループカウンタなどを指定します。
  2. select
    選択方法を指定します。以下の2つの定数を使用できます:
    • SELECT_BY_POS:インデックスで指定する方法(0から始まる番号)。
    • SELECT_BY_TICKET:注文チケット番号で指定する方法。
  3. pool(省略可能)
    どの注文を対象にするかを指定します。以下の定数が利用可能です:
    • MODE_TRADES:現在の未決済ポジションや保留中の注文。
    • MODE_HISTORY:決済済みの注文や履歴。

戻り値

  • true:指定した注文情報を正常に取得した場合。
  • false:取得に失敗した場合。

サンプルコード:現在のポジション情報を取得する

以下は、現在の未決済ポジションを取得して、情報を出力するサンプルコードです。

// 未決済ポジションをループで確認する
   int totalOrders = OrdersTotal(); // 未決済ポジションの数を取得
   
   for (int i = 0; i < totalOrders; i++) {
      // インデックスを指定してポジションを選択
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         // 注文情報を取得
         string symbol = OrderSymbol();      // 通貨ペア
         double lots = OrderLots();          // ロットサイズ
         double openPrice = OrderOpenPrice(); // エントリー価格
         datetime openTime = OrderOpenTime(); // エントリー時間
         
         // 情報をログに出力
         Print("ポジション情報:");
         Print("通貨ペア: ", symbol);
         Print("ロット: ", lots);
         Print("エントリー価格: ", openPrice);
      } else {
         // ポジションの取得に失敗した場合のエラーログ
         Print("注文の選択に失敗しました: ", GetLastError());
      }
   }

サンプルコード:特定の注文を取得する

チケット番号を指定して、特定の注文情報を取得する例です。

void CheckOrderByTicket(int ticket) {
if (OrderSelect(ticket, SELECT_BY_TICKET)) {
// 注文情報を取得
string symbol = OrderSymbol(); // 通貨ペア
double profit = OrderProfit(); // 損益
double lots = OrderLots(); // ロットサイズ
double stopLoss = OrderStopLoss(); // ストップロス
double takeProfit = OrderTakeProfit(); // テイクプロフィット

// 情報をログに出力
Print("注文チケット: ", ticket);
Print("通貨ペア: ", symbol);
Print("ロット: ", lots);
Print("損益: ", profit);
Print("ストップロス: ", stopLoss);
Print("テイクプロフィット: ", takeProfit);
} else {
// エラー処理
Print("チケット番号 ", ticket, " の注文が見つかりませんでした。エラーコード: ", GetLastError());
}
}

注意点

  1. エラー処理を忘れない
    OrderSelect()が失敗する可能性があるため、GetLastError()でエラーコードを確認するのがおすすめです。
  2. MODE_TRADESとMODE_HISTORYを適切に使い分ける
    未決済ポジションなのか、履歴注文を確認したいのかで設定を間違えないようにしましょう。
  3. ループ処理での効率性
    大量の注文を扱う場合は、ループ処理の中で無駄な計算や関数呼び出しを避けることが重要です。

まとめ

OrderSelect()は、現在のポジションや注文を操作する際に欠かせない関数です。この記事で紹介した構文やサンプルコードを参考に、自分のEA開発に取り入れてみてください。

自動売買プログラムを効率的に開発するためには、こうした基本的な関数の理解が不可欠です。次回は、OrderClose()OrderSend()についても詳しく解説しますのでお楽しみに!

つづくStep2.1 OrderSelect()関数の補足