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」(詳細は「こちら」を参照してください。)を指定します。

 しかし、

  • 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()関数(詳細は「こちら」)を使用する。

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


extern int Max_Retry = 10;

int Ticket = 0;

int start()
{
 ……
 //買いエントリー
 if(買い条件)
   {
    RefreshRates();
    
    double Open_Price = NormalizeDouble(Ask,Digits);
    
    Ticket =
    OrderSend(Symbol(),OP_BUY,Lots,Open_Price,……);
    
    if(Ticket < 0)
      {
       int Count = 0;
       
       while(Ticket < 0 && Count < Max_Retry - 1)
            {
             RefreshRates();
             
             Open_Price = NormalizeDouble(Ask,Digits);
             
             Ticket = OrderSend(……,Open_Price,……);
             
             Count++;
             
             Sleep(1000);
            }
      }
   }
 ……
 return(0);
}
  • Digitsの詳細については「こちら」を参照してください。
  • Symbol()関数の詳細については「こちら」を参照してください。
  • while()文の詳細については「こちら」を参照してください。
  • Sleep()関数の詳細については「こちら」を参照してください。

 なお、上記のプログラムは、よりトレードの安定性を高めるため、OrderSend()関数による発注が失敗した場合(=OrderSend()関数の戻り値が「-1」の場合)に、変数Max_Retryで指定した回数、OrderSend()関数による発注を繰り返すようにしています。

関連ツール

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

『EAつくーる』
『EAつくーる』 | fx-on.com

 上記ツール(EAつくーる『EAつくーる』 | fx-on.com)の詳細については「こちら『EAつくーる』 | fx-on.com」を参照してください。

fx-on.com投資クラウドソーシングで報酬GET!


MT4の使い方からプログラミングまで、わかりやすく解説