【MQL4】OrderSelect関数の使い方!保有ポジションの選択のやり方

MT4向けのEAで使用されるプログラム言語MQL4では、いくつかの頻繁に利用される関数があります。

その中でも今回紹介するOrderSelect関数はその一つです。

では、なぜOrderSelect関数が頻繁に利用されるのでしょうか。

そこで今回はOrderSelect関数について中心に解説し、具体的な記述方法も触れながら解説していきます。

この記事を読むことで、OrderSelect関数の利便性の高さが理解できるでしょう。

こんな方におすすめ

  • 保有ポジションを選択する関数が知りたい
  • EAで決済する関数を理解したい
  • OrderSelect関数の書き方を知りたい

OrderSelect関数とは

OrderSelect関数は、MQLのEA開発でよく使用される関数で、端的に言えば保有ポジションを1つ選択するための関数です。

EAでは、選択時や決済時に必ず使用されます。

したがって、OrderSelect関数を使用することで、特定のポジションを選択したり、決済することができます。

ただし、OrderSelect関数だけでは保有ポジションを選択するだけの機能しか持ちません。

そのため、選択したポジションの情報を取得するには、他の関数と組み合わせる必要があります。

このような注意点がありますが、利用する際にはまず選択できるようにすることが重要です。

以下では、選択操作を単独で利用する方法について、次の4つを解説していきましょう。

  • トレーディングプール
  • ヒストリープール
  • オーダープール
  • インデックス

トレーディングプール

トレーディングプールは、注文やポジションが集められて管理される場所であり、トレードプールとも呼ばれます。

ただし、すべての注文やポジションが集められるわけではありません。

次のような注文やポジションが集められることが特徴です。

  • 約定していない待機注文
  • 決済されていない保有ポジション

つまり、約定されていないまたは決済されていない、将来のトレードに関連する注文やポジションをOrderSelect関数を使用して選択する方法です。

具体的には、OrderSelect関数を使用してインデックス番号を指定し、トレーディングプールからオーダーを選択します。

ヒストリープール

ヒストリープールも、OrderSelect関数を使用して選択することができます。

ヒストリープールとは、すでにトレード操作が行われたオーダーや注文が集められる場所です。

主に次のようなオーダーや注文が含まれます。

  • 決済が完了したオーダー
  • キャンセルされた待機注文

つまり、決済が完了したオーダーや、注文は行われたものの、何らかの操作や事情でキャンセルされた注文がヒストリープールに集まっています。

OrderSelect関数では、ヒストリープールからもインデックス番号を指定して、ヒストリープールからオーダーを選択する操作が可能です。

オーダープール

オーダープールは、トレーディングプールにオーダーが追加された状態の集まり、または単独の注文や保有ポジションを指します。

オーダープールは、ヒストリープールとトレーディングプールの中間的な状態にある注文やポジションです。

具体的な流れとしては、新しいオープンポジションや待機注文が作成されると、それらがトレーディングプールに追加されます。

そして、決済注文やポジションの注文のキャンセル注文が入力された場合、これらの注文やオーダーはトレーディングプール内に存在しますが、他のトレーディングプールの注文やオーダーとは異なる状態になります。

これがオーダープールに存在する状態です。

オーダーや注文が処理され、決済または待機注文のキャンセルが行われると、それらはトレーディングプールから消え、同様の内容が新しいインデックスのオーダーとしてヒストリープールに追加される仕組みです。

つまり、トレーディングプール、オーダープール、ヒストリープールという3つの順番でオーダーや注文が処理されるイメージとなります。

インデックス

OrderSelect関数におけるインデックスとは、簡単に言えばオーダーや注文に自動的に割り当てられる番号のことです。

注文時に自動的に割り当てられる識別番号とも言えるインデックスであり、OrderSelect関数を使用して選択されます。

インデックスは0から始まり、ポジションが1つしかない場合、そのポジションには0が割り当てられます。

さらに2つ目は1、3つ目は2というように、ポジションの数から1を引いた番号が自動的に割り当てられます。

ただし、オーダーが決済されると、割り当てられたインデックス(番号)も消去され、再びインデックスの割り当てが行われる仕組みもMQL4では提供されています。

OrderSelect関数の書き方

OrderSelect関数は、様々なリストから1つのインデックス(番号)を選択する機能を持つ関数です。

基本的な書き方は次の通りです。

bool OrderSelect( ①, ②, ③);

この書き方では、返り値(かえりち)がbool型であり、引数(ひきすう)が①~③の3つあることを意味します。

簡単に言えば、選択が成功した場合か失敗した場合のどちらかが表示され、①から③の中から1つを選択するという記述です。

この書き方で使用されている返り値と引数については、次の項目で解説しましょう。

OrderSelect関数の戻り値

戻り値について解説します。

戻り値(もどりち)や返り値(かえりち)あるいはreturn値とも呼ばれるものです。

簡単に言えば、プログラムの返事のことで、成功(要求された値を表示)や失敗など、さまざまな返事をするための値を戻り値や戻り値と言います。

さまざまな返事の方法があり、先ほど基本的な書き方で紹介したbool型は、「true」または「false」の二択形式で表示する方法です。

二択であれば数字としても表現でき、数値にすると「1(true)」または「0(false)」の形で戻り値として表示することも可能です。

ちなみに、OrderSelect関数では、bool型の戻り値(返り値)として「true」または「false」が基本的な表示方法となります。

OrderSelect関数の引数

引数とは入力する値のことです。

簡単に言えば、命令と数が組み合わさったもので、数で命令を指定することを意味します。

OrderSelect関数では、ここでの引数とは、入力するインデックスやその他の値を指します。

そして、主に次のような種類の命令方法がありますので、それぞれ解説していきましょう。

  • int index
  • int select
  • int pool

int index

indexは、ポジションに割り振られた番号であり、選択するための引数です。

ただし、indexといっても2つの種類があります。

  • インデックス:識別番号から選択する
  • チケット番号:変化しない固有の番号から選択する

インデックスは、自動的に割り振られる識別番号のことです。

先ほど紹介した番号の割り振り方のリストに基づき、選択肢が1つの場合は0から始まり、2つある場合は2つ目が1となります。

チケット番号は、固有の番号であり、MQLの場合はFX会社によって割り振られます。

インデックスとは異なり、12345678などの8桁程度の大きな番号が割り振られます。

なお、EA(自動売買システム)でOrderSelect関数を使用する場合、通常はチケット番号を使用します。

例:インデックスの方法で作成したもの

bool select = OrderSelect(0, ②, ③);

int select

これは、先ほど紹介したインデックスかチケット番号で選択するかを指定する方法です。

以下のように記述します。

  • インデックスで選択する場合:(SELECT_BY_POS)と記述
  • チケット番号で選択する場合:(SELECT_BY_TICKET)と記述

これを利用すると、次のように記述します。

例:インデックス番号0を使用して選択する

bool select = OrderSelect(0, SELECT_BY_POS, ③);

int pool

poolは、選択するポジションの状況を指定する設定です。

OrderSelect関数では、poolを使用して次のような状況を指定することができます。

  • 現在のポジションから選択する場合:(MODE_TRADES)と記述
  • 過去のポジションから選択する場合:(MODE_HISTORY)と記述

これまでの設定を使用して、以下のように記述しましょう。

例:インデックス番号0を使用して、過去のポジションから選択する

bool select = OrderSelect(0, SELECT_BY_POS, MODE_HISTORY);

OrderSelect関数の使い方

最後に、OrderSelect関数の具体的な使い方を紹介しましょう。

まず、保有ポジションを一つずつチェックする記述を行います。

OrderSelect関数を使用して、過去のポジションから選択するという流れです。

これらについて最初に紹介し、その後で簡単に解説しましょう。

for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
// ポジションを操作するプログラム
}
}

これは、for文とOrderSelect関数を組み合わせたサンプルコードです。

for文は、同じ処理を繰り返し実行するためのもので、次のような形を取ります。

for(変数の初期化; 条件式; 変数の更新)
{
//繰り返し行いたい処理内容
}

サンプルコードでは、保有ポジションをチェックするための記述として、データを収集する目的で使用されています。

その後、OrderSelect関数を使用して選択するという流れです。

少しずつ上記のコードを改変しながら、仕組みを学んでいきましょう。

弊さいとが独自に開発した「FXオリジナルインジケーター」を無料でプレゼント!

インターネット上に存在しないインジケーター、他では高額な金額で販売されているようなインジケーターも無料で配布する期間限定のプレゼント企画!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です