こんにちは、aQuinです。

Fund Manager PROのMT5版を、
ゴールド対応にアップデートしました。

直したのは自動ロット計算の部分です。

同じところで詰まっている人がいるかもしれないので、
何が起きていたのかを書いておきます。

ロット計算がやっていること

ロット調整の機能は、損切りラインまでの距離と、
「1万円まで」(または口座残高の割合)という設定から、発注ロットを計算します。

その計算に必要なのが「1ポイント動いたら損益はいくらか」という数字で、
TickValue(ティックバリュー)といいます。

必要ロット数 = 許容損失額 ÷ 損切り幅 ÷ TickValue

ロット計算といえばこれが当たり前で、このツールもそうしていました。

通貨ペアでは、これが正しく機能しています。

ドル円でもユーロドルでも、設定した通りの金額で損切りされます。

ゴールドだけ、返ってくる数字がおかしい

ところが、ゴールドだけTickValueの返す数字がおかしいのです。

仕様では、TickValueは口座通貨で返ることになっていて、
日本人の多くが口座通貨を円にしているはずです。

実際、ユーロドルのTickVaLueは約158.00で返ってきます(現在のレートによります)。

ところがゴールドでは、1.00でした。ドル建てのままです。

値札に「1」とだけ書いてあって、店はドルのつもり、
こちらは円のつもりで読んでいる状態です。

この数字をそのまま式に入れると、
1万円のつもりの損切りが、158万円の損切りになります。

原因はMT5の銘柄定義

なぜこんなことが起こるのか。

MT5に登録されている銘柄定義、つまりサーバー側のデータが、
ゴールドだけ他と違う状態になっていました。

同じ業者の同じ口座で、通貨ペアは正しく、ゴールドだけおかしい。

さらにMT4では、TickValueは正しく返ってきます。

MT5に登録されたゴールドの定義に不備がある、というのが実態です。

厄介なのは、プログラム側からこれを判定できないことです。

TickValueは計算結果ではなく、ブローカーが書き込んだ設定値です。

しかも1.00という値そのものは、異常な数値ではありません。

信じるしかない数値が間違っていた、という状況でした。

TickValueを使うのをやめた

そこでMT5版のFund Managerでは、TickValueを使うのをやめて、
OrderCalcProfit() に置き換えました。

TickValueが「あらかじめ用意された数字」なのに対して、
OrderCalcProfit() は業者が持っている計算エンジンを呼ぶ関数です。

「1ポイントいくらか」ではなく、
「1ロットで、ここからここまで動いたらいくらか」と聞くと、金額が返ってきます。

そこから1ポイント当たりの価値を逆算する形にしました。

この方式なら金額そのものが返ってくるので、通貨に換算する必要がありません。

業者側の定義に不備があっても、ゴールドでも原油でも指数でも、
業者を乗り換えたとしても、正しくロットが計算されます。

お気づきの通り、私のせいではなく業者の定義が間違っていたのだ、
もう手の打ちようがないよね、という言い訳を長々と書きました。

ありがとうございます。

MT5でロット調整を含むEAを組むなら、参考にしてみてください。

実装で詰まったところや、この方式で分からない部分があれば、
FTCコミュニティで私に聞いてください。