皆さん、超ご無沙汰しております、たかはしです。
元気です(´・ω・`)

プライベートでちょっとゴタついておりまして、何もやる気が起きなくなってしまい更新作業をサボってしまいました。

取りあえず一段落しましたし、新年も無事迎えられましたので、また更新を初めて行こうかなと思っている次第であります。
※トレードで負けすぎて離婚とかそういう話ではありませんので(; ・`д・´)

現状確認出来ている不具合について

ある読者さんからご指摘頂いて発覚した問題です。

現象としましては、通貨ペアの右側がJPYでない場合に「ロスカットまでの余力PIPS」がFX証拠金シミュレーターの結果と異なる計算結果になっています。
なお、右側がJPYとなっているペアに関しては正しい結果が出ていると考えています。

どちらのサイトの計算結果が正しいのか?と悩まれる方もいらっしゃるでしょうから結論から申し上げて僕の計算結果が間違えています

ロスカットまでの余力をギリギリに考えるする人も少ないとは思いますが、中にはギリギリに計算してトレードをする人も居るかもしれませんので、より精度を上げるために修正しようと考えています。

計算がズレた原因

僕の証拠金計算ツールでは5分間隔でXMのMT4からEAを利用してレートを取得しています。

原因はデータの取得方法がちょっとマズかったと言う結論に至りました。

細かい話なんですが、MT4では「MarketInfo」という関数を利用して、下記の様な細かいマーケット情報を取得することができます。

種類定数説明
MODE_LOW1日足の安値
MODE_HIGH2日足の高値
MODE_TIME5Tickの最終更新時間
(サーバー時間)
MODE_BID9最新のビッド値
MODE_ASK10最新のアスク値
MODE_POINT11ポイント
(提示レートの最少変動数)
MODE_DIGITS12提示レートの小数点以下の桁数
MODE_SPREAD13スプレッド
(ポイント単位)
MODE_STOPLEVEL14ストップレベル
(ポイント単位)
MODE_LOTSIZE15基本通貨でのロットサイズ
MODE_TICKVALUE16ティックバリュー
(口座資金が1ロット当たりいくら変動するかを示す値)
MODE_TICKSIZE17直前に動いたティック幅
(ポイント単位)
MODE_SWAPLONG18買いポジションのスワップポイント
MODE_SWAPSHORT19売りポジションのスワップポイント
MODE_STARTING20マーケット開始日時
MODE_EXPIRATION21マーケット有効日時
MODE_TRADEALLOWED22トレードが許可されているか否か
MODE_MINLOT23最少取引ロット数
MODE_LOTSTEP24ロットの単位
MODE_MAXLOT25最大取引ロット数
MODE_SWAPTYPE26スワップの計算方法
0:ポイント単位
1:基準通貨単位
2:百分率
3:証拠金通貨単位
MODE_PROFITCALCMODE27利益計算モード
0:為替
1:CFD
2:先物
MODE_MARGINCALCMODE28証拠金計算モード
0:為替
1:CFD
2:先物
3:インデックス
MODE_MARGININIT291ロット当たりに必要となる基準証拠金
MODE_MARGINMAINTENANCE301ロット当たりに必要となる維持証拠金
MODE_MARGINHEDGED311ロットの両建てに必要となる証拠金
MODE_MARGINREQUIRED321ロット当たりに必要となる余剰証拠金
MODE_FREEZELEVEL33注文のフリーズレベル
(ポイント単位)
執行価格がフリーズレベルに定義された範囲内にある場合、注文の変更・取消し・決済はなされない
MODE_CLOSEBY_ALLOWED34OrderCloseBy()関数の使用が許可されているか否か

証拠金計算のベースとなるのが1枚あたりの証拠金ですので、「MODE_MARGININIT」で取得するのが正解だと思うのですが、どういう訳かXMのMT4ではMODE_MARGININITでの取得ができません。

実装当時のことを覚えておりませんし、今確認しても同様にMODE_MARGININITでのデータ取得ができませんでした。

自分で計算式を書いて1枚あたりの証拠金を計算することも可能なのですが、計算間違いをする可能性もありますし、不要なバグを生む原因ともなりかねないので、できるだけシステムからデータを取得したかったので、唯一データの取得ができる「MODE_MARGINREQUIRED」を利用して計算していたことが原因となっていました。

修正方法の検討

証拠金の計算は「レート×数量÷レバレッジ」で基本的には計算できるのですが、通貨ペアの右側がJPYでない場合には左側のレートに対応するJPYのペアレートを計算してあげる必要があるのです。

具体的にはEURUSDの場合はこういう計算式になります(多分)。
①「EURUSDのレート×数量÷レバレッジ=必要なUSD」
②「必要なUSD×USDJPY=必要証拠金(円)」

上記で多分と書いた理由としては、FX証拠金シミュレーターの必要証拠金との計算結果と合わないからです。
どっちが正しいのか分からない状態ですが、色々調べてみた所上記の計算式が正しいようです。

MaketInfoからデータを抽出できるのが一番簡単で確実ですので、データ取得元のサーバーをXMから他者に切り替えて見ることも考えましたが、MarketInfoのの信頼性が薄くなったので手動で計算する事にします。

この対応の影響としてツールの不具合等発生する可能性がありますが、ツールの精度を高めるための対応とお考え頂ければ幸いです。

近日中に対応する予定ですので、ご不便ご迷惑をおかけしますがよろしくお願いします。