AccountFreeMargin()のどうでもいい話。

さて、今日は、AccountFreeMargin()のどうでもいい話をしたいと思います。

この関数は、1ポジションだけ持つ時は意図した正しいロット数が返ります。問題は2ポジション目の時なのですが...個人的にはその結果に違和感を感じるのです...^^;





今、レバレッジ100倍の業者に100万円が口座にあるとします。計算しやすいように1ドル=100円で、ドル円1万通貨の必要証拠金を1万円としておきます。ここでレバレッジ2倍程度の運用をしたいと考えた場合、

(1) 1ポジション目は、0.2ロット(2万通貨)を持つことになります。
(2) 余剰証拠金(AccountFreeMargin)は 98万円に減ります。
(3) 2ポジション目は、CalculateLots に従うと0.19ロットを持ってしまいます。

これでレバレッジが約4倍の状態になります。
レバレッジ2倍換算で2ポジション取れば、4倍になるのは当たり前..なんですけど、、人によっては

(1) 1ポジション目は、0.2ロット(2万通貨)を持つことになります。
(2) レバレッジ2倍で考えた時の余剰証拠金は ゼロに減ります。
(3) 2ポジション目は、持てません。

このような動作が望ましい時もあります。つまり、保有中のポジションも考慮した上で、レバレッジ2倍に制限したいということです。
こういう計算をしたい場合は、以下のような関数でポジションとレバレッジを考慮した余剰証拠金が得られます。

上の関数とほぼ同じ要領で、運用時の実行レバレッジを求める事も可能です。(下図)

ロットの計算は以下のように行います。これらをインジケータに書いたのがこれです。

↑インジケータではゼロ割が厳禁なので、ゼロ割(分母がゼロとなる割り算)が起きないようにチェックを厳重にしています。




実際にドル建て口座で CalculateLots と、ポジションを考慮した CalculateRealLots を比較したのが下図です。

↑証拠金1万ドルで、ポジション無しの場合は、レバレッジ2倍では 0.2ロットと表示されます。

↑実際 0.2ロットを保有すると、 CalculateRealLots はゼロを返すようになります。



複数の通貨ペアで複数のEAを動かしているけど、全てのEAにポジションを取らせるとリスクが高くなってしまう場合には、役に立つかもしれません..。個人的にはロットの計算は、ストップロス金額から求めるこちらの方式が扱いやすいと思いますが、いろいろ考えてみてください。