人気ブログランキング | 話題のタグを見る
ブログトップ

こんなFXの日記

konnafx.exblog.jp

システムトレーダーとして、日々研鑽を重ねていく…

資金管理の集大成プログラム~最終回

本日は、1枚のEAの中で5つのマジックナンバーを設定してポートフォリオを組む場合に、VST化搭載の複利プログラムをどのように記述すればよいか考えたいと思います。


やり方は人によっていろいろあると思いますので、あくまでもサンプルとしてご理解ください。040.gif


まずは、マジックナンバーと外部パラメーターを設定します。


資金管理の集大成プログラム~最終回_a0204254_1141148.gif



私の場合、ポートフォリオを組むときは、各個のシステムの計算期間などは、外部パラメーターとせずに、スタート関数内にその数値を直接記述します。バックテストはそれぞれのシステムごとに行うべきだし、ポートフォリオで各個のシステムの計算期間まで外部パラメーターにしてしまうと、あまりにも見苦しいからです。なので、上の例では、VST化のための損切り率や利食い率などは記述されていません。


次に、スタート関数へ入る前に、いくつかオリジナル関数(グローバル関数)を宣言しておきます。


まずは、double型の最適枚数算出関数で、パラメーターは、


int ab = AccountBalance()
double slw = 損切り幅



の2つです。


資金管理の集大成プログラム~最終回_a0204254_1121543.gif



次は、各システムごとの損切り損失額の合計算出関数で、パラメーターは、


int magic = マジックナンバー


のみです。


資金管理の集大成プログラム~最終回_a0204254_11301768.gif



ロングなら、損失額=(約定価格-損切り価格)×ロット数×100000
ショートなら、損失額=(損切り価格-約定価格)×ロット数×100000


でしたよね。


次は、いよいよ補正枚数算出関数です。パラメーターは、


int ab = AccountBalance()
int ac = AccountCredit()
int elsumsum = すべてのシステムの損切り損失額の合計
int am = AccountMargin()
double slw = 損切り幅
double price = 約定価格
int al = AccountLeverage()



の7つです。


念のため、方程式の解をおさらいすると、


補正枚数=(口座残高+口座クレジット-既存のポジションの損切り損失額の合計-1.5×既存の必要証拠金額の合計)÷(新規のポジションの損切り幅+1.5×新規のポジションの約定価格÷レバ)÷10000



でしたよね。これを1ロット=10万通貨で千通貨単位の業者用に関数化すると、


資金管理の集大成プログラム~最終回_a0204254_11371536.gif



となります。


あとは、発注関数(通信エラー対策などは省略します)で、パラメーターは、


int magic = マジックナンバー
double lots = ロット数
double slw = 損切り幅
double tpw = 利食い幅



の4つにしておきます。


資金管理の集大成プログラム~最終回_a0204254_11592122.gif




これで、オリジナル関数がすべて出来上がりました。いよいよスタート関数へ入ります。


まずは、必要な口座情報を入手します。


資金管理の集大成プログラム~最終回_a0204254_1242561.gif



次に、先ほど宣言したオリジナル関数の一つである、マジックナンバーごとの損切り損失額の合計の算出関数(ELSUM()関数)を呼び出して、各システムの損切り損失額をすべて合計し、これをELSUMSUMという変数に渡します。


資金管理の集大成プログラム~最終回_a0204254_1302999.gif



ここで、VST化のための標準偏差を呼び出しますが、計算期間については、前述のように、直接数値を書き込みます。


資金管理の集大成プログラム~最終回_a0204254_1355218.gif



あとは、本日最初に宣言したオリジナル関数を適宜呼び出して、前回までと同様に、


1.VSTによる最適損切り幅の算出
2.BestLots1()関数による最適枚数の算出
3.BestLots2()関数による補正枚数の算出
4.MathMin()関数による選択
5.「0」ロット発注の防止


という流れになります。


資金管理の集大成プログラム~最終回_a0204254_1331266.gif



なお、蛇足ですが、上の記述で、たとえば、double Lots12 というのは、「システム1のBestLots2」という意味です。なので、


システム2であれば、double Lots22 
システム3であれば、double Lots32


という具合に記述すれば、混乱を避けられるので、私はいつもこのように変数を宣言しています。



さて、完成したプログラムでバックテストをしてみましょう。034.gif


その前に、自作のシステムの中から適当に5つほどセレクトして、まず単利のポートフォリオを組んでみました。


資金管理の集大成プログラム~最終回_a0204254_13482999.gif



資産増加倍率 3.04倍(直近2年)



これを、VST化搭載の複利プログラムで運用したものが次です。


資金管理の集大成プログラム~最終回_a0204254_13552063.gif



ちょっと見づらいですが、画面をクリックして、下の緑の棒グラフ(ロット数)の変化に注目してください。


普通の複利プログラムの場合、緑の棒グラフがきれいに増えていきますが、VST化を搭載した場合、そのときどきの標準偏差に応じて損切り幅とロット数が反比例するために、トレード毎にロット数が激しく変動しているのがわかります。このようにして、コンピューターが自動的にリスクヘッジしてくれるわけです。045.gif


ちなみに、このVST化搭載型の複利ポートフォリオのパフォーマンスは、


1トレードにおける最大許容損失率 2.0%
資産増加倍率 28.74倍(直近2年)
最大ドローダウン率 16.76%



でした。


そこで、もう少し、最大ドローダウン率を下げるために、外部パラメーターとして設定した、


資金管理の集大成プログラム~最終回_a0204254_14101512.gif



という部分を最適化し、最大ドローダウン率を15%以内に抑えましょう。その結果が次です。


資金管理の集大成プログラム~最終回_a0204254_14174112.gif



1トレードにおける最大許容損失率 1.7%
資産増加倍率 17.77倍(直近2年)
最大ドローダウン率 14.31%



これならなんとか運用できそうです。004.gif



応援よろしくお願いします。
   ↓
にほんブログ村 為替ブログへ
にほんブログ村
by xchsshzo | 2011-07-19 14:36 | メタトレーダー

by xchsshzo