unknown ticket xxx for OrderClose function
現在FX戦略134番目のアイデアをEA化(自動売買プログラム作成)しています。
発生したエラー
一通りスクラッチで作成して、試験運用を始めたところ、以下のようなエラーが出ていました。
unknown ticket xxxx for OrderClose function
理由はシンプルだと思っています。「こんなチケットナンバーなんて知らないよ」ということです。
実際にコードを見てみた
実際にコードを見てみると、、、理由が分からない…。
抜き出してみました。4~6行目でショートのオープンポジションを探してます。
該当した場合にOrderClose関数を発動します。引き渡すマジックナンバーはOrderMagicNumber()です。ちゃんとOrderSelectでポジション選択しているので問題ないはずです。
しかも、エラーに登場する「1340001」と「1340002」というマジックナンバーには心当たりがあり、実際に保有しているポジションも同じマジックナンバーがついているので、間違いないはずなのですが…。
エイヤ!で修正
今回は私が作る私だけの私のための私のプログラムです。トライアンドエラーで修正します。
ロングポジションにはgMagicLongで定義したマジックナンバーを、ショートポジションにはgMagicShortで定義したマジックナンバーで取引するようにしています。どちらもグローバル変数です。OrderMagicNumberの代わりに、それを突っ込みました。
が、しかし、また出ました。
とんだ勘違い!
久々のプログラミングで勘違いしてました。
OrderSend関数に渡すのは、マジックナンバーではなくチケットナンバーです。
マジックナンバーはそのEAを識別したり、ポジションを分類したりするのに使います。複数のポジションが同じマジックナンバーを持っている場合もあります。一方でチケットナンバーは、各ポジションに振られた固有の番号です。同じチケットナンバーを持つポジションは存在しません。
すぐに思い出せて良かったです。上図の36行目ですね、間違ってマジックナンバーを入れていた、OrderClose関数の1つ目の引数にOrderTicket関数を入れました。
果たして結果はいかに!?
OKです。決済が行われました。
結論(エラーの原因)
今回のエラーの原因は、存在しないチケットナンバーをOrderClose関数に渡してしまっていたことです。
OrderClose関数の1つ目の引数にどんな値が渡されていて、それが本当に存在するチケットナンバーとなるようになっているのか要確認です。
注意ですが、私の様にマジックナンバーと混同しないようにしてください。