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つ目の引数にどんな値が渡されていて、それが本当に存在するチケットナンバーとなるようになっているのか要確認です。

注意ですが、私の様にマジックナンバーと混同しないようにしてください。

めっさん
  • めっさん
  • 当サイトの管理人。ニューヨークの大学を飛び級で卒業。その後日系企業でグローバル案件に携わる。大小様々な企業を転々としながら、マレーシアやアメリカへの赴任経験を持つ。バイリンガルITエンジニアとしていかに楽に稼ぐか日々考えている。年齢は秘密だけど定年も間近かな。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です