【MQL4】EAで注文を出す時に使うプログラムOrderSend()関数とは?サンプルプログラムあり!

ザフナーラボブログ

OrderSend()関数は、EAで注文を出す時に使う関数です。

EAを開発する際には基本的に必ず使用する関数ですので、是非マスターして下さい。

OrderSend()関数

OrderSend()関数は、以下のように定義されています。

OrderSend()サンプルプログラム

int OrderSend(
string symbol,
int cmd,
double volume,
double price,
int slippage,
double stoploss,
double takeprofit,
string comment,
int magic,
datetime expiration,
color arrow_color
);

各引数の意味は、以下のとおりです。

  • string symbol
    注文を出す通貨ペアを指定します。
    通貨ペア名は、「気配値表示ウィンドウ」に表示されているとおりに記述します。
    特定の通貨ペア名を指定せず、EA等を適用しているチャートの通貨ペアに対して発注したい場合は「Symbol()」と記述します。
    Symbol()関数の詳細については「こちら」を参照してください。
  • int cmd
    以下の表に従って、注文方法を指定します。

    種 類
    定 数
    内 容
    OP_BUY
    成行買い
    OP_SELL
    成行売り
    OP_BUYLIMIT
    指値買い
    OP_SELLLIMIT
    指値売り
    OP_BUYSTOP
    逆指値買い
    OP_SELLSTOP
    逆指値売り
  • double volume
    ロットサイズを指定します。
  • double price
    注文価格を指定します。
  • int slippage
    許容スリッページ数を指定します(単位は「ポイント」です。「ポイント」の詳細については「こちら」を参照してください。)。
  • double stoploss
    損切り価格を指定します。損切り価格を指定しない場合は、「0」と記述します。
  • double takeprofit
    利益確定価格を指定します。利益確定価格を指定しない場合は、「0」と記述します。
  • string comment
    注文に対するコメントを指定します。コメントを指定しない場合は、「NULL」と記述します。
  • int magic
    マジックナンバー(=個々のEAを識別する整数値)を指定します。
  • datetime expiration
    注文の有効期限を指定します。
    有効期限の指定は、待機注文に対してのみ有効です。
    有効期限を指定しない場合は、「0」と記述します。
  • color arrow_color
    MetaTrader4(MT4)では、EAによる注文が執行されてポジションを保有したり、EAによる保有ポジションを決済すると、チャート上の当該位置にオブジェクトが表示されます。
    この引数では、当該オブジェクトの表示色を指定します。
    オブジェクトを表示させたくない場合は、省略するか、「clr_NONE」と記述します。

戻り値

正常に約定した場合はチケット番号が返され、正常に約定しなかった場合は「-1」が返されます。

「-1」が返された場合に、エラーのより詳しい情報を得るためには、GetLastError()関数を使用します。

注文価格の指定についての注意点

注文価格は、成行買いの場合は「Ask」、成行売りの場合は「Bid」しか指定することができません。

  • Askの詳細については「こちら」を参照してください。
  • Bidの詳細については「こちら」を参照してください。

EA等を適用しているチャートの通貨ペアとは異なる通貨ペアに対して発注する場合は、第二引数に「MODE_BID」又は「MODE_ASK」を指定した、MarketInfo()関数を使用して注文価格を指定しなければなりません。

計算されていたり、提示レートの小数点以下の桁数で正規化(四捨五入等する)されていない値を注文価格に指定することはできません。

指定した注文価格が提示レートになかったり、提示レートの小数点以下の桁数で正規化されていない場合は、エラー129(ERR_INVALID_PRICE:無効な価格)が生成されます。

期限切れについての注意点

指定した注文価格が完全に期限切れの場合は、許容スリッページ数の指定とは関係なく、エラー138(ERR_REQUOTE:価格の再提示)が生成されます。

指定した注文価格が期限切れでも、その価格が提示レートに存在していれば、現在価格で注文は執行されます。ただし、現在価格が指定した注文価格に許容スリッページ数を加減した値の範囲内にある場合に限ります。

ストップレベルについての注意点

市場価格に近すぎる損切り価格と利益確定価格を指定することはできません。

損切り価格と利益確定価格が市場価格から最低限どれだけ離れていなければならないか(=ストップレベル)は、第二引数に「MODE_STOPLEVEL」を指定したMarketInfo()関数を使用することによって確認することができます。なお、ストップレベルの値の単位は「ポイント」です。

間違った、又は提示レートの小数点以下の桁数で正規化されていないストップレベルの場合は、エラー130(ERR_INVALID_STOPS:無効なストップレベル)が生成されます。

第二引数に「MODE_STOPLEVEL」を指定したMarketInfo()関数によって取得された値が「0」である場合は、①ストップレベルによる制限が存在しないか、②トレードサーバーが動的にストップレベルをコントロールする何らかの外部の仕組みを利用していることを意味します。

②の場合は、GetLastError()関数は、エラー130(ERR_INVALID_STOPS:無効なストップレベル)を返します。

待機注文の価格は、市場価格に近すぎてはいけません。

待機注文の価格に対するストップレベルは、第二引数に「MODE_STOPLEVEL」 を指定したMarketInfo()関数を使用することによって確認することができます。

待機注文の価格が正しくない場合は、エラー130(ERR_INVALID_STOPS:無効なストップレベル)が生成されます。

有効期限についての注意点

待機注文の有効期限を指定することのできないトレードサーバーを使用している場合に、「0」以外の値を有効期限として指定すると、エラー147(ERR_EXPIRATION_DENIED:有効期限の指定の拒否)が生成されます。

取引量についての注意点

トレードサーバーで許容されている総注文数(=保有ポジション数+待機注文数)を超えている場合は、新しい注文を出すことはできません。

その場合は、トレードサーバーはエラー148(ERR_TRADE_TOO_MANY_ORDERS:注文の過多)を返します。

具体例

一定の条件を満たした場合に成行きで買い注文を出したい場合は、以下のように記述します。

成行き買い注文サンプルプログラム

if(買いエントリー条件)
  {
   int Ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,10,0,0,NULL,1212,0,Magenta);
  }
  • if()文の詳細については「こちら」を参照してください。
  • 決済注文を出す場合については「こちら」を参照してください。