EAを実際に稼働させていると、バックテストでは現れなかった「OrderSend Error 129」というエラーが生じることがあります。
1.OrderSend Error 129 とは
「OrderSend Error 129」とは、定数が「ERR_INVALID_PRICE」(=無効な価格)となっているように、EAがOrderSend()関数によって注文を出す際に、無効な価格で発注していることから生じるものです。
- 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()関数(詳細については「こちら」を参照してください。)を使用する。
具体的には、以下のようになります。
#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);
}
……
}