MQL4MQL5 スクリプト 注文・決済
成行で買い・売りの注文を出したい
結論:MQL4 は OrderSend(銘柄, OP_BUY, ロット, Ask, …)、MQL5 は CTrade の trade.Buy(ロット) を使います。
考え方
いちばん基本の発注です。MQL4 では OrderSend() に注文の種類・ロット・価格(買いは Ask、売りは Bid)を渡し、成功するとチケット番号が返ります。MQL5 では標準ライブラリの CTrade を使うと、trade.Buy(ロット) の1行で発注でき、執行タイプ(フィリングモード)も自動で合わせてくれます。ここではパラメーターで売買の向きを選んで成行注文するスクリプトを例にしています。
- ロット数を、口座の最小ロット・刻み幅に合わせる
- 買いは Ask、売りは Bid の価格で注文を送る
- 結果を確認し、失敗したらエラー番号(MQL5 はリターンコード)をログに出す
そのまま使えるコード
MetaEditor の「新規作成」で「スクリプト」を選び、できたファイルの中身をすべてこのコードに置き換えてコンパイル(F7)します。ファイルは Scripts フォルダに保存され、ナビゲーターからチャートにドラッグして使います。
MQL4(MT4)
#property strict
#property script_show_inputs
// 成行で買い(または売り)注文を出すスクリプト(MT4)
input bool InpBuy = true; // true=買い、false=売り
input double InpLots = 0.1; // ロット
input int InpMagic = 0; // マジックナンバー
void OnStart()
{
RefreshRates();
int type = InpBuy ? OP_BUY : OP_SELL;
double price = InpBuy ? Ask : Bid;
int ticket = OrderSend(_Symbol, type, InpLots, price, 30, 0, 0, "script", InpMagic, 0, InpBuy ? clrBlue : clrRed);
if(ticket < 0)
Print("注文失敗 error=", GetLastError());
else
Print("注文成功 ticket=", ticket);
}MQL5(MT5)
#property script_show_inputs
// 成行で買い(または売り)注文を出すスクリプト(MT5)
#include <Trade\Trade.mqh>
input bool InpBuy = true; // true=買い、false=売り
input double InpLots = 0.1; // ロット
input ulong InpMagic = 0; // マジックナンバー
void OnStart()
{
CTrade trade;
trade.SetExpertMagicNumber(InpMagic);
trade.SetDeviationInPoints(30);
bool sent = InpBuy ? trade.Buy(InpLots) : trade.Sell(InpLots);
uint rc = trade.ResultRetcode();
if(!sent || (rc != TRADE_RETCODE_DONE && rc != TRADE_RETCODE_PLACED))
Print("注文失敗 ", rc, " ", trade.ResultRetcodeDescription());
else
Print("注文成功 deal=", trade.ResultDeal(), " 価格=", trade.ResultPrice());
}MT4 版・MT5 版とも MetaEditor でコンパイル(エラー・警告なし)を確認済みです。実際の口座で使う前に、デモ口座やストラテジーテスターで動作を確かめてください。
カスタマイズのポイント
- EA に組み込むときは、OnStart() の中身を関数にして、OnTick() の売買条件を満たしたときに呼びます。
- 損切り・利確を同時に付けたいときは「損切り・利確を pips で指定する」レシピを参考にします。
注意点
- ツールバーの「自動売買」がオフだと注文できません(MT4 はエラー4109、MT5 は 10027)。
- MQL5 で CTrade を使わずに OrderSend() を直接使う場合は、銘柄が対応する type_filling を指定しないとリターンコード 10030 になります。
このコードで使っている関数
うまく動かないときに出やすいエラー
あわせて読みたいレシピ
- 損切り・利確を pips で指定して注文したい1pips の大きさ(5桁・3桁口座は _Point × 10)を求め、損切り・利確の価格を計算して NormalizeDouble() で丸めます。
- 指値・逆指値注文を出したいMQL4 は OrderSend() の種類に OP_BUYLIMIT・OP_BUYSTOP など、MQL5 は CTrade の BuyLimit()・BuyStop() などを使います。
- 注文に失敗したら何回か再試行したい一時的なエラー(リクオート・サーバー混雑など)のときだけ、少し待って価格を取り直してから再送します。
- ロット数を最小ロット・刻み幅に合わせたいSYMBOL_VOLUME_STEP(刻み幅)で切り捨て、SYMBOL_VOLUME_MIN・SYMBOL_VOLUME_MAX の範囲に収めます。












