OrderSend Error 129 の回避

1.OrderSend Error 129 とは

 EAを実際に稼働させていると、バックテストでは現れなかった「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);
    }
  ……
}

関連ツール

『EAつくーる』
MQL言語の学習ができ、裁量トレーダーもEA開発が可能になる!
MQL言語の学習ができ、裁量トレーダーもEA開発が可能になる!?|?fx-on.com
fx-onで購入する

 MT4で作動するEAをプログラミング不要で作成するためのツールです。

特 徴

  • インジケーターを組み合わせることで、EAを簡単に作ることができます。
    インジケーターは、MT4に標準で装備されているもののほか、市販のものも使用することができます
  • EAはmq4ファイルで作成されるので、mqlの学習にも役立ちます。
  • 作成したEAの著作権は本ツールを使用してEAを作成した本人に属し、販売なども自由です
  • シンプルなロジックのEAから高度なオプション付きのEAまで、簡単に作成することができます。