FXメタトレーダー実践プログラミングへの補足(3)/CalculateLotsの改良?

3日目は CalculateLots() の話しです。私個人は豊嶋先生のライブラリを使っていないのですが、EAのソースコードについて相談しに来られる人が高確率で利用されていて、悩むところも同じようなので、改造例を紹介します。

↑普通のFX口座では問題無いコードでも、以下のいずれかの条件を満たす口座では意図した動作をしません。
(1) 接尾辞の付いた通貨ペア (USDJPYFXF..)
(2) 円建て口座で conv が取得できなかった場合
(3) 変則的な最小ロット設定


変則的な最小ロット設定とは、注文可能な最小ロットが 0.1 なのに、ロット変更単位が 0.01 という..FXopenのおかしな設定のことです。そんな例外事例に対応する意味はあまり無いので、その辺りは興味のある人だけ続きをどうぞ..。







さて、下記の改造例ですが、(1) は、こちらで解説されています。
(2) は、ドル建て口座では、どの通貨ペアでも変換レートを 1 で近似すれば近い値になるのですが、円建て口座では、2桁も変わってしまうので、 近似値を100 に変えます。

↑(3) は、MODE_MINLOT の代わりに MODE_LOTSTEP を使って、ロット数がロットステップの整数倍になるようにしています。FXOpen で動作を確認するとそれなりに正しいロットが返ると思います。



FXに限定せずに、金/銀/原油のようなCFD にも適用できるようにするには、conv = 1 or 100 の近似値ではズレが大きくなってしまうので、真面目に TickSize と TickValue から計算するようにします。

(4)は、1Tickの動きが、証拠金通貨でいくらに相当するか?が MarketInfo(Symbol(), MODE_TICKVALUE) で、
現在の価格は何Tick分 に相当するか?=Ask/MarketInfo(Symbol(), MODE_TICKSIZE)
なので、掛け合わせれば、1ロットが証拠金通貨でいくらに相当するか?になります。
この計算式なら、通貨ペア名の問題を気にする必要が無いので汎用性が高いのですが..MODE_TICKSIZEが不正な問題も過去に起きているので、どこまで安定的に動くか?は分かりません。
(…とは言うものの、CFD ではこれを使うしかないと思うのですよ..。
ちなみに、MODE_TICKSIZE は、直前に動いたティック幅なので、必ずしも Point とは一致しません。1pip ずつ動いている間は、同じ値ですが、急に 2pips 動くとティックサイズは 2*Point になるらしいです..。


(5)は、必要証拠金から求まる最大ロットで制限するコードです。これに引っ掛かるようなロット数で売買するのは何か間違っていますが..理論上は制限をしておく必要があります。



今日紹介したコードは、必ずしもそれが優れているという訳ではないので、CalculateLots が上手く動かない時にいろいろ試してみると良いでしょう..。
CalculateLots をマルチポジションなEAで動かすと問題になる話しはまた明日...Zzz