Step3 ポジション決済 OrderClose()関数

シンプルな自動決済ロジック:ロング・ショートポジションを条件に応じて決済する

MetaTrader 4(MT4)の自動売買プログラムを作成する際、ロングポジション(買い)やショートポジション(売り)を条件に基づいて自動で決済するロジックを組み込むことが基本となります。この記事では、OrderClose()関数を使ったシンプルな自動決済の仕組みを解説します。

ロジック概要

1. ポジションを取得

OrderSelect()で現在保有しているポジションを1つずつ取得します。

2. ロング・ショートを判定

OrderType()でポジションの種類を確認します。

3. OrderClose()で決済

条件を満たした場合、OrderClose()関数を使ってポジションを決済します。

サンプルコード

以下は、ロングポジションとショートポジションを条件に応じてクローズするサンプルコードです。

int slippage = 3; // スリッページを決めておく

   for (int i = 0; i < OrdersTotal(); i++) {

      // ポジションを選択

      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {

         // ロングポジションの処理

        if (OrderType() == OP_BUY) {

           myPosition = 1;

            if (/* 条件を満たしたら */) {

               // ロングポジションを決済

              if (OrderClose(OrderTicket(), OrderLots(), Bid, slippage, clrBlue)) {

                  myPosition = 0;
                  Print("ロングポジションを決済しました: チケット番号=", OrderTicket());

              } else {

                 Print("ロングポジションの決済に失敗しました: エラーコード=", GetLastError());

              }

            }

        }

         // ショートポジションの処理

         if (OrderType() == OP_SELL) {

            myPosition = -1;

            if (/* 条件を満たしたら */) {

              // ショートポジションを決済

               if (OrderClose(OrderTicket(), OrderLots(), Ask, slippage, clrRed)) {
                  myPosition = 0;

                  Print("ショートポジションを決済しました: チケット番号=", OrderTicket());

               } else {

                  Print("ショートポジションの決済に失敗しました: エラーコード=", GetLastError());

              }

            }

         }

      } else {

        // エラー処理

         Print("ポジション選択に失敗しました: エラーコード=", GetLastError());

      }

  }

}

関数の詳細解説

OrderClose()

ポジションを決済するための関数です。

bool OrderClose(int ticket, double lots, double price, int slippage, color arrow_color);

• ticket: 決済するポジションのチケット番号(OrderTicket()で取得)。

• lots: 決済するロット数(OrderLots()で取得)。

• price: 決済価格(ロングの場合はビッド価格、ショートの場合はアスク価格)。

• slippage: 許容するスリッページ(ピップ単位)。

• arrow_color: 決済価格を示す矢印の色。

戻り値:

• true: 決済成功。

• false: 決済失敗(エラーコードはGetLastError()で確認)。

「条件を満たしたら」とは?

「条件を満たしたら」の具体例として以下のような条件が考えられます:

1. 利益が一定額に達した場合

if (OrderProfit() > 10) // 利益が10ドル以上なら

2. 一定時間が経過した場合

if (TimeCurrent() – OrderOpenTime() > 3600) // ポジション保有時間が1時間以上なら

3. テクニカル指標の条件を満たした場合

if (iRSI(NULL, 0, 14, PRICE_CLOSE, 0) > 70) // RSIが70を超えたら

出力例

以下は、実行時に条件を満たしてポジションがクローズされた場合のログ例です。

ロングポジションをクローズした場合

ロングポジションを決済しました: チケット番号=12345

ショートポジションをクローズした場合

ショートポジションを決済しました: チケット番号=67890

決済が失敗した場合

ロングポジションの決済に失敗しました: エラーコード=4756

注意点

1. スリッページの設定

スリッページは市場のボラティリティに応じて適切な値を設定してください。

2. エラー処理

OrderClose()が失敗した場合は、必ずGetLastError()を使用してエラーの原因を確認しましょう。

3. ポジション管理

複数ポジションを保有している場合、ループ内で適切に処理することが重要です。

まとめ

今回紹介した方法を使用すれば、ロングポジションとショートポジションを条件に基づいて簡単に決済できます。OrderClose()関数の使用方法を理解し、条件の設定を適切に行うことで、自動売買ロジックの精度を向上させることができます。

自分のトレード戦略に合わせて条件をカスタマイズし、実践的なEAを構築してみましょう!

つづく