『新メタトレ入門本』スクリプト:トレード関数の使い方(新規の売買注文)
『新MT4対応 FXメタトレーダープログラミング入門』(新メタトレ入門本)連動企画です。
今回は、本書の第2章「スクリプトのプログラミング」の「2-6 トレード関数の使い方」についてです。トレード関数の使い方は、MT4とMT5とで相当違うところがあるので、いくつかの記事に分けて紹介します。今回はそのなかの「新規の売買注文」について扱います。
【目次】
第1章 メタトレーダーの紹介
第2章 スクリプトのプログラミング
2-1 新規ファイルの作成
2-2 文字列の表示(文字列定数)
2-3 チャート上のデータの表示(定義済み変数)
2-4 データの型と変数
2-5 組み込み関数の使い方
2-6 トレード関数の使い方
第3章 カスタム指標のプログラミング
第4章 エキスパートアドバイザー(EA)のプログラミング
本書アップデート情報
このセクションでは、トレード関数を使うための設定と新規の売買注文のためのMQL4組み込み関数について説明しています。
今回のアップデートでは、手動でトレードを行う画面で若干説明の追加を行っています。
MT4の過去のビルドでは、注文の種別は「成行注文」か「指値注文」のどちらかでした。ただ、最近のビルドでは、スリッページを指定できる注文の種別を「ストリーミング注文」と表示するようです。
成行注文に変わりはないので、ストリーミング注文も成行注文と同じだという説明を追加しています。
関連するMT5情報
トレード関数を使うための設定
トレード関数を使うための設定はMT4と同じです。MT5の[ツール]ー[オプション]の設定から「エキスパートアドバイザ」のタブ画面で、「アルゴリズム取引を許可」にチェックを入れるだけです。
MT5のツールバーの「アルゴリズム取引」のボタンを押して切り替えることもできます。
新規の売買注文のための関数
新規の売買注文を送信する関数は、MQL5でもOrderSend()です。しかし、書式が全く違うため、使い方も全く違います。
MQL5のOrderSend()関数の書式は以下のようになっています。
bool OrderSend(
MqlTradeRequest& request, // 取引リクエスト構造体
MqlTradeResult& result // 取引結果構造体
);
MQL4に比べてシンプルに見えるかもしれません。しかし、この関数は本書で扱っている「引数を入力して戻り値で結果を返す」といった基本的な構造にはなっていません。専門的には、CやC++の構造体や関数の参照渡しなどの仕組みを使っています。
とりあえず、本書のex8_scr.mq4とex9_scr.mq4に対応するコードを紹介します。まずは、新規注文の画面が以下のようになっているケースです。
MT4と同じくタイプは成行注文と指値注文が選べますが、成行注文の表示が「成行注文」となっていて、「スリッページ」の指定ができるケースです。
このケースの業者で成行買い注文を発注するコードは以下のように書けます。
MqlTradeRequest、MqlTradeResultは、MQL5で定義してある構造体の名前です。それぞれ複数のフィールドをもっています。各フィールドは、構造体変数request、resultの後に「.」をつけて指定します。
コードの流れとしては、まず、requestの各フィールドに注文の情報を指定します。
そして、OrderSend()関数を実行します。
すると、取引結果がresultに返ってくるので、必要なフィールドの情報を取得するというわけです。
成行売り注文の場合は、request.priceに売値を表すSymbolInfoDouble(_Symbol, SYMBOL_BID)を代入、request.typeに売り注文を表すORDER_TYPE_SELLを入力するだけです。
ex9_scr.mq4に対応するコードは以下のようになります。
ところで、MT4でも業者によってスリッページが指定できないケースがあったと思いますが、MT5の場合、そのケースでは注文時にコードを追加する必要があります。
例えば、新規注文の画面が次のようなケースです。
タイプの選択が成行注文ではなく、「カウントダウン注文」となっており、「執行条件」の項目がついているケースです。
この「執行条件」は業者で決まっているもので、「FOK注文」あるいは、「IOC注文」となっています。FOKは、注文を全量約定できないときは注文を取り消す注文で、IOCは、注文を可能な部分だけ約定して残りはキャンセルする注文です。
FXの場合、よほど注文量が多くない限り注文したロット数で約定するので、利用者の立場では大きな違いはありません。
ただし、プログラム上はこの違いを指定しなくてはいけません。
FOK注文の場合、OrderSend()を実行する前に以下のコードを追加する必要があります。
request.type_filling = ORDER_FILLING_FOK;
IOC注文の場合は、以下のコードになります。
request.type_filling = ORDER_FILLING_IOC;
このフィールドの省略時にはFOK注文になるようなので、FOKの場合、コードの追加は必要ないかもしれませんが、入れておいた方が確実でしょう。
また、カウントダウン注文の場合、売買価格とスリッページは無効となるので、request.priceと、request.deviationは指定しなくても構いません。
このようにMQL5では、注文発注のコードが大幅に変わっているので注意が必要です。
毎回宣伝ですが、MQL5でもMQL4と同じ書式の発注関数を利用したい場合、以下のkindle本の「共通ライブラリ」をご検討ください。