『新メタトレ入門本』スクリプト:トレード関数の使い方(決済注文)
『新MT4対応 FXメタトレーダープログラミング入門』(新メタトレ入門本)連動企画です。
本書の第2章「スクリプトのプログラミング」の「2-6 トレード関数の使い方」の続きです。今回は、最後の「決済注文」を取り上げます。
【目次】
第1章 メタトレーダーの紹介
第2章 スクリプトのプログラミング
2-1 新規ファイルの作成
2-2 文字列の表示(文字列定数)
2-3 チャート上のデータの表示(定義済み変数)
2-4 データの型と変数
2-5 組み込み関数の使い方
2-6 トレード関数の使い方
第3章 カスタム指標のプログラミング
第4章 エキスパートアドバイザー(EA)のプログラミング
本書アップデート情報
このセクションでは、ポジションの決済注文のためのMQL4組み込み関数について説明しています。
今回のアップデートでは、手動でトレードを行う画面で説明の追加を行っています。
「新規の売買注文」の回で触れたように、MT4の最近のビルドでは、スリッページを指定できる注文の種別を「ストリーミング注文」、スリッページを指定できない注文の種別を「成行注文」と表示しています。
決済注文の画面も、それぞれのケースで若干違うので、参考として両方の画面を掲載しました。
上は「決済取引」、下は「成行決済」と表示されていて微妙に違いますが、同じことです。あと、「・ジション」は「ポジション」のことですね。
MT4の日本語表記がおかしくなったり、ときどき変わったりするのは、よくあることです。あまり気にしなくて結構です。
あと、上記の画面が表示されずに、すぐに決済される場合、ワンクリック取引がセットされている可能性があるので、その解除方法について追加しています。
MT4の[ツール]-[オプション]のメニューの[取引]タブに「ワンクリック取引」のチェック項目があります。
取引スタイルにもよりますが、取引に慣れていないうちは、ワンクリック取引は使わない方がいいでしょう。
スクリプトやEAなどプログラムから取引するのであれば、この設定は特に関係ありません。
関連するMT5情報
MQL5でポジションを決済する関数は、MQL4とは異なります。
MQL4のOrderClose()のように決済専用の関数はありません。注文発注と同じOrderSend()関数を使います。
MQL5での決済の考え方は、決済したいポジションに対して逆の取引を行うというものです。
つまり、買いポジションを決済したければ、それと同じサイズで売り注文を発注します。逆に売りポジションを決済したければ、買い注文を発注するわけです。
ただし、買いポジションがある状態で、新規に売り注文を発注すると、さらに売りポジションができて両建ての状態になります。
そこで、取引リクエスト構造体に、新規の注文なのか決済注文なのかを区別するためのフィールドが用意されています。
新規ではなく、ポジションを決済するためには、取引リクエスト構造体の「position」というフィールドに決済したいポジションのチケット番号を代入する必要があります。
これでOrderSend()を実行すると、新規ポジションを建てるのではなく、指定した買いポジションを決済することができるのです。
サンプルプログラムex11_scr.mq4をMQL5用に書き換えたプログラムを以下に示します。
ここでは、既に買いポジションがあり、それを決済したいというケースを考えます。
コードの流れとしては、まず、決済したいポジションのチケット番号を「ticket」という変数に入力します。
この「ticket」を使って、PositionSelectByTicket()でポジションの選択を行います。
次に、OrderSend()に渡す取引リクエスト構造体の設定を行います。
ロット数「request.volume」と取引価格「request.price」は、選択したポジションからPositionGetDouble()で取得します。
そして、「request.position」に「ticket」を代入して、決済したいポジションを指定します。
あと、カウントダウン注文の業者の場合、必要に応じて「request.type_filling」の設定も行ってください。
「request」の設定を行ったら、OrderSend()を実行して決済注文を送信します。
スクリプト実行時に表示させるのは、「ticket」のポジションが正しく選択できたかどうかを表す「ret_select」と、OrderSend()の結果を表すコードが格納された「result.retcode」です。
ポジションが正しく決済されれば、以下のように表示されます。
「ret_select」はbool型なので、正常にポジションが選択されれば「true」という値になります。
また「result.retcode」には、整数値が入りますが、「10009」というのは、「TRADE_RETCODE_DONE」という意味で、正常にリクエストが完了したことを表します。このコードの詳細は、こちらをご参照ください。
なお、売りポジションを決済したい場合は、「request.type」を「ORDER_TYPE_BUY」にしなくてはいけません。条件分岐を使えば自動的に設定することも可能です。詳しくは後ほど紹介します。
もし、MQL5でもMQL4と同じ書式の決済注文関数が利用できた方がよいとお考えなら、以下のkindle本の「共通ライブラリ」をお薦めします。