OrderGetTicket関数の役割・働き
OrderGetTicket関数は、特定のインデックスに対応する待機注文のオーダー番号を取得するために使用されます。
オーダー番号は、待機注文のストップロスやテイクプロフィットを修正したり、待機注文自体を削除したりするときに使います。
※待機注文については↓の記事リンクをご参照ください。
MT5内で注文が実行される際、各待機注文は一意(=同じ内容のものがない)のオーダー番号によって識別され、この番号を用いて特定の注文を参照したり操作したりすることが可能になります。
OrderGetTicket関数の引数とその引数に関する説明
OrderGetTicket関数は、単一の引数を取ります。
ulong OrderGetTicket(
int index // 注文リスト内の番号
);
index
: 取得したい注文のインデックス番号を指定する整数型の引数です。
注文はMetaTrader 5 (MT5)において一定の順序でリストされており、このインデックスはそのリスト内の位置を指します。
MetaTrader 5 (MT5)における注文のリスト順序は、注文がプラットフォームによって管理される際の内部的な処理に基づいています。具体的な法則は以下の通りです:
- 時間順: 一般的に、注文はその作成された時間順にリストされます。最初に作成された注文がリストの先頭に来る傾向にあり、新しく作成された注文はリストの後方に追加されます。
- 注文タイプ: 特定の状況では、注文のタイプ(例:成行注文、指値注文、逆指値注文など)によってもリスト内の順序が影響される場合があります。
- サーバーの処理: MT5を運用するブローカーのサーバー側の処理方法やポリシーによって、注文リストの並びが影響を受けることがあります。サーバーは注文を効率的に処理するために、特定のアルゴリズムやルールに基づいて注文を整理する場合があります。
しかし、トレーダーや開発者がリストの順序を直接制御することはできず、MT5のユーザーインターフェースやプログラミングを通じて得られる注文リストは、上記の法則に従って自動的に整理されます。したがって、特定の注文を操作したい場合は、注文のオーダー番号や他の一意の識別子を使用することが重要です。
※インデックスについては↓の記事リンクをご参照ください
OrderGetTicket関数の戻り値について
OrderGetTicket関数の戻り値は、ulong型で、指定されたインデックスの注文に対応するオーダー番号です。もし指定されたインデックスに有効な注文が存在しない場合、OrderGetTicket関数は0
を返します。
OrderGetTicket関数を使う際の注意点
OrderGetTicket関数を使用する際には、有効なインデックス値を指定することが重要です。
インデックスは0から始まり、有効な注文の総数から1を引いた値までの範囲で指定する必要があります。
不正確なインデックス値を使用すると、期待した結果が得られない可能性があります。
MetaTrader 5(MT5)を使っている時、いくつかの重要な用語と概念があります。これらを理解することは、取引をスムーズに行うためにとても重要です。
注文とポジションの違い
MetaTrader 5(MT5)には注文とポジションという概念がある点に注意が必要です。
- 注文とは、取引を開始するためのリクエストです。これは、MQL5の公式リファレンスでの日本語訳では「未決注文(待機注文)」いう訳があてられており、実際に取引が行われる前の段階を指します。
- ポジションとは、実際に取引が行われた後の結果です。つまり、買いまたは売りの注文が実行された後に持つ取引のことを指します。
MetaTrader 5(MT5)の「ツールボックス」の「取引」タブで見られるのはポジションの情報なので、これを待機注文と混同しないようにしましょう。
そして、OrderGetTicket関数を始めとするOrder~から始まる名称の関数は、この「注文」に対する処理を行う関数である、という事を押さえておく必要があります。
※また、MQL5にはオーダー番号とは別に、ポジション番号という概念があります。
保有している各ポジションに割り振られている固有の番号があり、ポジションを決済したり、ポジションに設定されている注文内容を変更する時などにこのポジション番号利用します。
ポジション番号を取得する時にはOrderGetTicket関数ではなく、PositionGetTicket関数を使う事に注意しましょう。
※PositionGetTicket関数についての詳細は↓の記事リンクをご参照ください
ポジションのネッティング計算
- ネッティングとは、同じシンボルに対する複数の取引を一つのポジションに統合する計算方法です。ネッティングシステムにおいては、各シンボルにつき1つのポジションのみを保有することができます。
※ネッティングシステムについては↓の記事リンクをご参照ください
複数ポジションの保有(ヘッジングシステム)
- 一方で、ヘッジングシステムを使用している場合は、各シンボルに対して複数のポジションを同時に保有することが可能です。
※ヘッジングシステムについては↓の記事リンクをご参照ください
OrderGetTicket関数は具体的なデータを取得するためのファーストステップ的役割
OrderGetTicket関数はオーダー番号を取得する働きを担う訳ですが、そもそもなぜこの処理をしているかというと、オーダー番号を取得した後、OrderGetDouble関数、OrderGetInteger関数、OrderGetString
関数などの関数を使って具体的なデータを取得する為です。
従って本来目的とするデータを取得するためのファーストステップ的役割を担っている関数と考えると良いでしょう。
注文がキャンセルされたり変更されたりしても、これらの関数は引き続き注文に関するデータを返します。
OrderGetTicket関数のサンプルコード
以下のサンプルコードはMetaTrader 5(MT5)で現在保持している未決注文(=
待機注文)の情報を取得して表示するためのものです。
これにより、プログラムが実行された際に、各待機注文のオーダー番号、種類、ボリューム、通貨ペア、開始価格、および設定時刻が出力されます。
void OnStart()
{
// 注文の詳細情報を格納するための変数を宣言
ulong ticket; // 注文のオーダー番号
double open_price; // 注文の開始価格
double initial_volume; // 注文の初期ボリューム(注文サイズ)
datetime time_setup; // 注文が設定された時刻
string symbol; // 注文が行われた通貨ペア
string type; // 注文の種類(買い注文、売り注文など)
long order_magic; // 注文のマジックナンバー
long positionID; // 注文に関連付けられたポジションのID
// 現在の未決注文の総数を取得
uint total = OrdersTotal();
// 未決注文を一つずつ確認するループ
for(uint i = 0; i < total; i++)
{
// 注文のオーダー番号を取得。注文が存在すれば、そのオーダー番号が0より大きくなる
if((ticket = OrderGetTicket(i)) > 0)
{
// 注文の各種プロパティを取得
open_price = OrderGetDouble(ORDER_PRICE_OPEN); // 注文の開始価格
time_setup = (datetime)OrderGetInteger(ORDER_TIME_SETUP); // 注文設定時刻
symbol = OrderGetString(ORDER_SYMBOL); // 取引シンボル
order_magic = OrderGetInteger(ORDER_MAGIC); // マジックナンバー
positionID = OrderGetInteger(ORDER_POSITION_ID); // ポジションID
initial_volume = OrderGetDouble(ORDER_VOLUME_INITIAL); // 初期ボリューム
type = EnumToString(ENUM_ORDER_TYPE(OrderGetInteger(ORDER_TYPE))); // 注文の種類を文字列で取得
// 取得した注文情報を表示
printf("#ticket %d %s %G %s at %G was set up at %s",
ticket, // 注文オーダー番号
type, // 注文の種類
initial_volume, // 注文量
symbol, // 通貨ペア
open_price, // 注文の開始価格
TimeToString(time_setup)// 注文設定時刻を文字列で表示
);
}
}
// その他の処理はここに記述
}
printf関数内の表記について
※printf
関数内の
“#ticket %d %s %G %s at %G was set up at %s”
という表記についてですが、
そもそもprintf
関数は、指定されたフォーマットに従って文字列を出力するための関数です。printf
関数の中で使用される%d
、%s
、%G
などは、フォーマット指定子と呼ばれ、変数の種類に応じて出力形式を指定します。それぞれのフォーマット指定子が持つ意味は以下の通りです:
%d
: 整数を10進数で出力します。整数型の変数(例えば、intやlongなど)を出力する際に使用します。%s
: 文字列を出力します。文字列型の変数(stringや文字列の配列など)を出力する際に使用します。%G
: 浮動小数点数を指数形式または10進数で出力し、より短い方を選択します。不要な0は省略されます。浮動小数点型の変数(double
やfloat
など)を出力する際に使用します。
例えば、printf
関数を使って以下のように書くと、
int number = 10;
string text = "apple";
double value = 123.456;
printf("Number is %d, Text is %s, Value is %G", number, text, value);
出力は次のようになります:
Number is 10, Text is apple, Value is 123.456
フォーマット指定し%G と%fの違い
%f
フォーマット指定子は、浮動小数点数を10進数形式で出力する際に使用されます。%f
を使用すると、数値が固定小数点形式で出力され、通常は小数点以下6桁まで表示されます(表示される小数点以下の桁数は、指定によって変更可能です)。%f
は、特に小数点以下の桁数を明確に指定したい場合や、指数形式ではなく常に10進数形式で数値を表示したい場合に適しています。
例えば、%f
を使用して浮動小数点数を出力する例を見てみましょう
double value = 123.456;
printf("Value is %f", value);
Value is 123.456000
小数点以下の桁数を指定したい場合は、%f
の前に.(ピリオド)
と桁数を指定します。たとえば、小数点以下2桁だけを表示したい場合は%.2f
と記述します
printf("Value is %.2f", value);
出力は以下のようになります
Value is 123.46
このように、%f
指定子は浮動小数点数を出力する際に便利で、出力形式を柔軟に制御することができます。一方で、%G
指定子は数値をより短い形式で表現することができ、不要な0を省略するために使われます。どちらを使用するかは、出力したい数値の形式やコンテキストによって決まります。
<参照>
コメント