まくまく投資ノート
更新: / 作成:

MQL で注文を出すときは、クラスベースの CTrade や、関数ベースの OrderSend を使用します。 ここでは、CTrade クラスを使って注文を出す方法を説明します。 OrderSend 関数と違い、CTrade クラスは注文の種類ごとにメソッド名が BuySellBuyLimit のように分かれている ので、わかりやすいコードを記述することができます。

CTrade クラスのインクルード

トレード用クラス のひとつである CTrade クラス を使用すると、取引のための注文を出したり、注文をキャンセルしたりできます。 Ctrade クラスを使用するには、次のように Trade/Trade.mql ヘッダファイルをインクルードする必要があります。

#include <Trade/Trade.mqh>

CTrade trade;  // CTrade インスタンスの生成

成行注文を出す (CTrade.Buy, Sell)

カレントシンボルの成行注文

CTrade.Buy メソッド成行の買い 注文を出すことができます。 第 1 引数 (volume) だけが必須で、ここで取引のロット数(0.1 なら 1万通貨)を指定します。 許容するスリッページ(ポイント数)は、CTrade.SetDeviationInPoints メソッド で指定できます。

次のスクリプトを実行すると、現在のシンボルを 0.1 ロット購入します。

Scripts/Buy.mq5(成行買いのスクリプト実装例)
#include <Trade/Trade.mqh>  // CTrade
const double LOT = 0.1;  // 取引するロット数(ボリューム) 0.1 = 1万通貨

/** スクリプトのエントリポイント */
void OnStart() {
    CTrade trade;
    trade.SetDeviationInPoints(5);  // 許容するスリッページ(ポイント数)を設定
    if (!trade.Buy(LOT)) {  // 現在のチャートの通貨を、現在の買値 (Ask) で購入
        printTradeError(trade);
    }
}

/** トレード関数がエラーになったときのエラー出力 */
void printTradeError(const CTrade& trade) {
    uint code = trade.ResultRetcode();
    string desc = trade.ResultRetcodeDescription();
    printf("ERROR(%u): %s", code, desc);
}

成行の売り 注文を出したいときは、CTrade.Buy メソッドの代わりに CTrade.Sell メソッド を使用します。 パラメータは買い注文と同様です。

いろいろな条件の成行注文

CTrade.Buy メソッドのシグネチャは次のようになっており、第 2 引数以降で条件を指定して注文を出すことができます。 第 1 引数だけ指定した場合は、カレントチャートの通貨を、指定したロット数だけ成行買いすることになります。

CTrade クラスの Buy メソッド
bool Buy(
  double       volume,       // ポジションボリューム(0.1 = 1 万通貨)
  const string symbol=NULL,  // シンボル(NULL なら現在のシンボル)
  double       price=0.0,    // 価格(0 なら現在の買値 (Ask))
  double       sl=0.0,       // 決済逆指値(同時に損切りの逆指値注文を出す)
  double       tp=0.0,       // 決済指値(同時に利食いの指値注文を出す)
  const string comment=""    // コメント
)

次のサンプルスクリプトでは、成行の買い注文を入れると同時に、損切り (stop loss) を 100 ポイント下(USDJPY ならおそらく 0.1 円)、利確 (take profit) を 200 ポイント上に設定します。

Scripts/BuyWithStopLoss.mq5
#include <Trade/Trade.mqh>

void OnStart() {
    CTrade trade;

    // 許容するスリッページ(ポイント数)を設定
    trade.SetDeviationInPoints(5);

    // 損切り価格、利食い価格を指定して成行の買い注文
    string sym = _Symbol;  // カレントチャートの通貨
    double lot = 0.1;  // ロット数
    double ask = SymbolInfoDouble(sym, SYMBOL_ASK);  // 現在の買値
    double sl = ask - pointToPrice(sym, 100);  // 損切りは 100 ポイント下
    double tp = ask + pointToPrice(sym, 200);  // 利食いは 200 ポイント上

    if (!trade.Buy(lot, sym, ask, sl, tp)) {
        printTradeError(trade);
    }
}

// 指定した通貨において、ポイント数を価格に変換します。
double pointToPrice(string symbol, uint point) {
    double rate = SymbolInfoDouble(symbol, SYMBOL_POINT);
    return rate * point;
}

指値注文、逆指値注文を出す (CTrade.BuyLimit, BuyStop, SellLimit, SellStop)

CTrade.BuyCTrade.Sell メソッドの代わりに、次のようなメソッドを使用することで、指値注文や逆指値注文を出すことができます。 パラメータは成行注文とほぼ同様ですが、待機注文になるため、有効期限などを指定できるようになっています。

マジックナンバーを指定する (Ctrade.SetExpertMagicNumber)

EA で注文を出す場合は、あらかじめ CTrade.SetExpertMagicNumber メソッド を使ってマジックナンバーを設定しておく必要があります。 次のサンプルコードは、初回の NewTick イベントで買い注文を入れる EA の実装例です。 グローバル変数が増えるとコードが読みにくくなるので、取引まわりの処理は MyAlgo クラスにまとめています。

Experts/BuyOnce.mq5(EA の例)
#property strict
#include <Trade/Trade.mqh>  // CTrade

input double Lot = 0.1;  // 取引するロット数(ボリューム)
input ulong Slippage = 3;  // 最大許容スリッページポイント
// Auto-generated by https://toushi.maku.blog/p/p6fgxgf/
input ulong Magic = 58146000;  // EA のマジックナンバー

class MyAlgo {
    CTrade m_trade;
    bool m_isOrdered;  // 一度だけオーダーするためのフラグ

public:
    void Init() {
        m_isOrdered = false;
        m_trade.SetDeviationInPoints(Slippage);  // 最大許容スリッページポイント
        m_trade.SetExpertMagicNumber(Magic);  // EA のマジックナンバーを設定
    }

    /** 最初の呼び出し時のみ、成行買いを行います。 */
    void BuyOnce() {
        if (m_isOrdered) return;
        m_isOrdered = true;

        // 現在のチャートの通貨を、現在の買値 (Ask) で購入
        if (!m_trade.Buy(Lot)) printTradeError(m_trade);
    }

private:
    /** トレード関数がエラーになったときのエラー出力 */
    void printTradeError(const CTrade& trade) {
        uint code = trade.ResultRetcode();
        string desc = trade.ResultRetcodeDescription();
        printf("ERROR(%u): %s", code, desc);
    }
};

MyAlgo g_algo;

int OnInit() {
    g_algo.Init();
    return INIT_SUCCEEDED;
}

void OnTick() {
    g_algo.BuyOnce();
}

関連記事

まくまく投資ノート
サイトマップまくへのメッセージ