MQL4MQL5 スクリプト 注文・決済
指値・逆指値注文を出したい
結論:MQL4 は OrderSend() の種類に OP_BUYLIMIT・OP_BUYSTOP など、MQL5 は CTrade の BuyLimit()・BuyStop() などを使います。
考え方
現在値より有利な価格で待つのが指値(買いなら下、売りなら上)、不利な価格で待つのが逆指値(買いなら上、売りなら下)です。ここでは、現在値から指定した pips だけ離れた位置に、4種類のどれかの待機注文を置くスクリプトを例にしています。
- 注文の種類に合わせて、現在値から上か下かに注文価格を決める
- 注文価格もストップレベル以上離し、NormalizeDouble() で丸める
- 待機注文を送信する
そのまま使えるコード
MetaEditor の「新規作成」で「スクリプト」を選び、できたファイルの中身をすべてこのコードに置き換えてコンパイル(F7)します。ファイルは Scripts フォルダに保存され、ナビゲーターからチャートにドラッグして使います。
MQL4(MT4)
#property strict
#property script_show_inputs
// 現在値から指定 pips 離して待機注文を置くスクリプト(MT4)
enum PendingType { BUY_LIMIT, SELL_LIMIT, BUY_STOP, SELL_STOP };
input PendingType InpType = BUY_LIMIT; // 注文の種類
input double InpDist = 30; // 現在値からの距離(pips)
input double InpLots = 0.1; // ロット
void OnStart()
{
RefreshRates();
double pip = (_Digits == 3 || _Digits == 5) ? _Point * 10 : _Point;
double d = InpDist * pip;
int cmd;
double price;
switch(InpType)
{
case BUY_LIMIT: cmd = OP_BUYLIMIT; price = Ask - d; break;
case SELL_LIMIT: cmd = OP_SELLLIMIT; price = Bid + d; break;
case BUY_STOP: cmd = OP_BUYSTOP; price = Ask + d; break;
default: cmd = OP_SELLSTOP; price = Bid - d; break;
}
price = NormalizeDouble(price, _Digits);
int ticket = OrderSend(_Symbol, cmd, InpLots, price, 0, 0, 0, "pending");
if(ticket < 0)
Print("待機注文失敗 error=", GetLastError(), " price=", price);
else
Print("待機注文 ticket=", ticket, " price=", price);
}MQL5(MT5)
#property script_show_inputs
// 現在値から指定 pips 離して待機注文を置くスクリプト(MT5)
#include <Trade\Trade.mqh>
enum PendingType { BUY_LIMIT, SELL_LIMIT, BUY_STOP, SELL_STOP };
input PendingType InpType = BUY_LIMIT; // 注文の種類
input double InpDist = 30; // 現在値からの距離(pips)
input double InpLots = 0.1; // ロット
void OnStart()
{
double pip = (_Digits == 3 || _Digits == 5) ? _Point * 10 : _Point;
double d = InpDist * pip;
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
CTrade trade;
bool sent;
switch(InpType)
{
case BUY_LIMIT: sent = trade.BuyLimit(InpLots, NormalizeDouble(ask - d, _Digits)); break;
case SELL_LIMIT: sent = trade.SellLimit(InpLots, NormalizeDouble(bid + d, _Digits)); break;
case BUY_STOP: sent = trade.BuyStop(InpLots, NormalizeDouble(ask + d, _Digits)); break;
default: sent = trade.SellStop(InpLots, NormalizeDouble(bid - d, _Digits)); break;
}
if(!sent || trade.ResultRetcode() != TRADE_RETCODE_DONE)
Print("待機注文失敗 ", trade.ResultRetcode(), " ", trade.ResultRetcodeDescription());
else
Print("待機注文 order=", trade.ResultOrder());
}MT4 版・MT5 版とも MetaEditor でコンパイル(エラー・警告なし)を確認済みです。実際の口座で使う前に、デモ口座やストラテジーテスターで動作を確かめてください。
カスタマイズのポイント
- 有効期限を付けたいときは、MQL4 は OrderSend() の expiration、MQL5 は BuyLimit() などの type_time に ORDER_TIME_SPECIFIED と expiration を指定します。
- 前日高値に逆指値を置くなら、価格を iHigh(_Symbol, PERIOD_D1, 1) にします。
注意点
- 注文価格が現在値に近すぎる(ストップレベル内)と、価格が不正としてエラーになります。
このコードで使っている関数
うまく動かないときに出やすいエラー
あわせて読みたいレシピ
- 待機注文(指値・逆指値)をすべて取り消したいMQL4 は OrderType() が OP_BUYLIMIT 以上の注文を OrderDelete()、MQL5 は OrderGetTicket() で順に取り出して trade.OrderDelete() します。
- 前日の高値・安値ブレイクを判定したいiHigh(_Symbol, PERIOD_D1, 1)・iLow(_Symbol, PERIOD_D1, 1) で前日の高値・安値を取得し、現在値と比べます。
- 成行で買い・売りの注文を出したいMQL4 は OrderSend(銘柄, OP_BUY, ロット, Ask, …)、MQL5 は CTrade の trade.Buy(ロット) を使います。












