MQL で注文を出すときは、クラスベースの CTrade
や、関数ベースの OrderSend
を使用します。
ここでは、CTrade
クラスを使って注文を出す方法を説明します。
OrderSend
関数と違い、CTrade
クラスは注文の種類ごとにメソッド名が Buy
、Sell
、BuyLimit
のように分かれている ので、わかりやすいコードを記述することができます。
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 ロット購入します。
#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 引数だけ指定した場合は、カレントチャートの通貨を、指定したロット数だけ成行買いすることになります。
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 ポイント上に設定します。
#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.Buy
や CTrade.Sell
メソッドの代わりに、次のようなメソッドを使用することで、指値注文や逆指値注文を出すことができます。
パラメータは成行注文とほぼ同様ですが、待機注文になるため、有効期限などを指定できるようになっています。
- CTrade.BuyLimit メソッド … 買い指値注文(現在 Ask 値より低い値段に買い予約)
- CTrade.BuyStop メソッド … 買い逆指値注文(現在 Ask 値より高い値段に買い予約)
- CTrade.SellLimit メソッド … 売り指値注文(現在 Bid 値より高い値段に売り予約)
- CTrade.SellStop メソッド … 売り逆指値注文(現在 Bid 値より低い値段に売り予約)
マジックナンバーを指定する (Ctrade.SetExpertMagicNumber)
EA で注文を出す場合は、あらかじめ CTrade.SetExpertMagicNumber メソッド を使ってマジックナンバーを設定しておく必要があります。
次のサンプルコードは、初回の NewTick イベントで買い注文を入れる EA の実装例です。
グローバル変数が増えるとコードが読みにくくなるので、取引まわりの処理は MyAlgo
クラスにまとめています。
#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();
}
関連記事
- MetaTrader/MQL: OrderSend の引数を理解する - MqlTradeRequest/MqlTradeResult 構造体 (MT5)
- MetaTrader/MQL: 通貨(シンボル)のポイントサイズ、Digit 数を調べる (Point, Digits, SymbolInfoDouble)
- MQL で Hello World
- MetaTrader/MQL: MQL4 と MQL5 のどちらでコンパイルされているか調べる
- MetaTrader/MQL: チャートのサイズ(幅・高さ)を取得する (ChartGetInteger)
- MetaTrader/MQL: インジケーターの実装例 - アカウント(口座)情報を表示する
- MetaTrader/MQL: チャートのタイムフレーム(H1 や M15)を取得する (Period, PeriodSeconds)