MT4EA稼働中に出るOrderSend Error 129の原因や対策方法を解説!

EAを実際に稼働させていると、バックテストでは現れなかった「OrderSend Error 129」というエラーが生じることがあります。

1.OrderSend Error 129 とは

 

「OrderSend Error 129」とは、定数が「ERR_INVALID_PRICE」(=無効な価格)となっているように、EAがOrderSend()関数によって注文を出す際に、無効な価格で発注していることから生じるものです。

2.OrderSend Error 129 の原因

「OrderSend Error 129」が生じる原因には、以下の2つがあります。

⑴ BidやAskが現在値から離れすぎている

OrderSend()関数を用いて成行き注文を出す際には、第4引数に「Bid」又は「Ask」を指定します。

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

しかし、

  • OrderSend()関数による発注処理までに複雑な処理が介在している。
  • 指標発表などで市場の動きが急速である。

といったような場合には、現在の市場価格と、OrderSend()関数で指定した「Bid」値や「Ask」値が、指定したスリッページ以上に離れてしまう場合が生じます。

このような事態が生じると、OrderSend()関数による発注が約定しないことから、「OrderSend Error 129」が発生してしまうことになります。

⑵ 価格の指定の仕方が正しくない

例えば、OrderSend()関数によって指値注文を出す際に、

  • 取引に使用している業者の「EUR/USD」の提示レートが「1.1234」というように、小数点以下4桁表示

なのにもかかわらず、

  • 「EUR/USD」について「1.12345」というように、小数点以下5桁で指値を指定

しているような場合です。

このような場合は、業者の提示レートとOrderSend()関数による指値価格との桁数が合致していないため、無効な価格を指定しているものとして、「OrderSend Error 129」が発生してしまうことになります。

3.具体的な回避策

「OrderSend Error 129」の発生原因が、以上のようなものであることからすれば、当該エラーを生じさせないようにするためには、以下のようにすればよいということになります。

  • OrderSend()関数で使用する「Bid」値や「Ask」値を、最新の市場価格に更新する。
    RefreshRates()関数(詳細については「こちら」を参照してください。)を使用する。
  • OrderSend()関数で使用する指値の桁数を、業者の提示するレートの桁数と合わせる。
    NormalizeDouble()関数(詳細については「こちら」を参照してください。)を使用する。

具体的には、以下のようになります。

サンプルコード


#property strict

input int Magic   = 2525; //マジックナンバー
input double Lots = 0.1;  //取引ロット数

int Ticket = 0;

void OnTick()
{
  ……
  //買いエントリー
  if(買いエントリー条件)
    {
      RefreshRates();
      
      double Open_Price = NormalizeDouble(Ask,Digits);
      
      Ticket = OrderSend(Symbol(),OP_BUY,Lots,Open_Price,10,0,0,NULL,Magic,0,Magenta);
    }
  ……
}