ブログトップ 記事一覧 ログイン 無料ブログ開設

とあるMetaTraderの備忘秘録 RSSフィード Twitter

忙しいです。ネタもないし・・・

2010-07-01

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

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

f:id:fai_fx:20100630213553p:image

↑普通のFX口座では問題無いコードでも、以下のいずれかの条件を満たす口座では意図した動作をしません。

(1) 接尾辞の付いた通貨ペア (USDJPYFXF..)

(2) 円建て口座で conv が取得できなかった場合

(3) 変則的な最小ロット設定


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







さて、下記の改造例ですが、(1) は、こちらで解説されています。

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

f:id:fai_fx:20100630213552p:image

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



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

f:id:fai_fx:20100630213551p:image

(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

kartzkartz 2010/07/01 07:45 faiさん、こんにちは。

> 真面目に TickSize と TickValue から計算
MarketInfo(MODE_TICKVALUE) は、スプレッドと同様、直近(現在)の値に固定されますので、バックテストを考えるとマズイ場合があります (FXDD で確認済み)。MarketInfo(MODE_BID/ASK) はヒストリーを参照するんですが。

そのまま使っちゃう人がいるといけないのでコメントしときます。

fai > kartzfai > kartz 2010/07/01 20:29 kartzさん、こんばんは。

それは…
MarketInfo(MODE_TICKVALUE) とMarketInfo(Symbol(), MODE_TICKSIZE) の比率が変わってしまうということでしょうか^^;

この辺りは何を犠牲にするか悩みどころです...orz

kartzkartz 2010/07/02 08:47 faiさん、こんにちは。

バックテスト時は、MarketInfo(MODE_TICKVALUE) も MarketInfo(MODE_TICKSIZE) も、テスターのスタートボタンを押した時の値でロックされますので、二者の比率は (どの商品・どの口座でも) 一定になります (なってしまいます)。ドル建て商品 (EURUSD、GOLD、SP500等) を円建て口座で売買する(等の)場合、フォワードテストやライブ運用では二者の比率は売買する時点のドル円レート(等)に応じて決まり、変動しますので、動作が違って問題ですねという意味です。

すべての MT4 でテストしたわけではありませんが、MarketInfo(MODE_TICKVALUE) を使う人は、上記の差異に注意してお使いくださいというコメントでした。

MMXMMX 2010/11/18 07:08 こんばんは。いつも参考にさせて頂いております。

>MODE_TICKSIZE は、直前に動いたティック幅なので、必ずしも Point とは一致しません
「急に 2pips 動いたタイミング」でロットを計算した場合は不正なロット数になるということでしょうか。

fai>MMXfai>MMX 2010/11/18 07:16 私はそのように理解しています。

MMXMMX 2010/11/18 08:44 ありがとうございます。
という事は、下記のようにすれば、常に正常なロット数を取得出来るという理解でいいのでしょうか。
( Ask/Point ) * MarketInfo( Symbol(), MODE_TICKVALUE)/( MarketInfo(Symbol(), MODE_TICKSIZE )/Point )

MMXMMX 2010/11/21 00:50 度々の質問ですみません、勉強中の者です。

MathCeil(lots/lot_step)*lot_step;

lot_digits = MathLog(1.0/lot_step)/MathLog(10.0);
double lots = NormalizeDouble(lots, lot_digits);
でも代替かのうでしょうか。

fai>MMXfai>MMX 2010/11/21 10:15 lot_step が 0.25の場合に代替できるかどうか考えてみてください。
実際にそのような業者があるかどうかはわかりませんが。。^^;

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/fai_fx/20100701/1277912834