『新メタトレ入門本』スクリプト:トレード関数の使い方(新規の売買注文)


新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.mq4ex9_scr.mq4に対応するコードを紹介します。まずは、新規注文の画面が以下のようになっているケースです。

MT4と同じくタイプは成行注文と指値注文が選べますが、成行注文の表示が「成行注文」となっていて、「スリッページ」の指定ができるケースです。

このケースの業者で成行買い注文を発注するコードは以下のように書けます。

MqlTradeRequestMqlTradeResultは、MQL5で定義してある構造体の名前です。それぞれ複数のフィールドをもっています。各フィールドは、構造体変数requestresultの後に「.」をつけて指定します。

コードの流れとしては、まず、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本の「共通ライブラリ」をご検討ください。

メタトレーダー4&5共通ライブラリによるEA開発入門

前へ

『新メタトレ入門本』スクリプト:組み込み関数の使い方

次へ

『新メタトレ入門本』スクリプト:トレード関数の使い方(口座・ポジション情報)