- 1.基本的な資金管理の方法について
- 2.1トレード毎にリスクを計算して運用したらどうなるのか?
- 3.計算方法
- 4.検証した結果(この間紹介したモーニングスキャルを例にやってみます。)
- 5.結果を踏まえた考察
- 6.今回の検証を踏まえて、この資金管理を生かすには?
- 7.今回使用した資金管理のコード
1.基本的な資金管理の方法について
資金管理は、基本的には資金に対しての許容リスク(大体1%~3%)を決めておいて、ロットを計算して運用していくのが基本だと色々なサイトや本に書いています。
(=複利運用というやつです。)
また、EAのプログラム上、固定ロットで行うような場合もありますが、これも結局リスクを計算した上で固定ロットを決めていくのが基本なので、やることは複利運用と変わりません(-_-;)
(↑最近気づきました)
2.1トレード毎にリスクを計算して運用したらどうなるのか?
1で記載した基本的な資金管理方法でも十分に増えていきますが、、、もっと資金を急激に増やしたいということで、今回は、1トレード当たりのリスクを計算した上で、複利運用するとどうなるのか?を検証してみました。
3.計算方法
Lots=NormalizeDouble(AccountFreeMargin()*MaximumRisk/risk/1000,2);
・総資金×許容リスク/1トレード当たりのリスク/1000=運用ロット(小数第2位四捨五入)
通常の複利運用では、1トレード当たりのリスクを固定(最大値や平均値など)で行うのですが、今回の検証では、ここを1トレード毎に計算してます。
4.検証した結果(この間紹介したモーニングスキャルを例にやってみます。)
①複利運用で行った場合(1%で運用)
(資金10,000ドルで1%運用 期間2013~2018)
純益 818.36
総利益 3033.68
総損失 -2215.32
プロフィットファクタ 1.37
期待利得 1.46
最大ドローダウン 162.29
②1トレード当たりのリスクを計算した上でトレードした場合
純益 2578.55
総利益 20151.73
総損失 -17573.18
プロフィットファクタ 1.15期待利得 4.88
最大ドローダウン 1204.22 (9.40%)
5.結果を踏まえた考察
前述したとおり、複利運用は安定運用ができますが、資金の増え方は緩やかなものとなります。一方で1トレード毎にリスクを計算した上で運用した場合は負けこんだ時の落ち込みはすごいですが、はまれば爆益が得られそうな感じです。
勝率が高いEAの場合で、時期的にも調子が良い時に、目標額を決めて一時的な運用とすれば、可能性が広がりそうですね。
ただ今回実験したEAの場合、固定ロットで運用した前提のEAでロスカットもそれを前提に作成しているので、資金面からみた1トレードにかかるリスクが一定になると固定ピップで損切やってるような感じになってしまって、本来のEAの能力が発揮できなくなると思われます。
6.今回の検証を踏まえて、この資金管理を生かすには?
資金管理も含めてEAということを踏まえると今回のような資金管理を前提としたEAを作るのがいいのかもしれないですね。
あるいは、直近の勝率を踏まえた資金管理方法をEAで表現できれば面白そうな気がします。
ただ、表現するすべがわからないので、まだまだ勉強しないとですね……
7.今回使用した資金管理のコード
(ネットに転がってた計算式を参考にして作ったので、変数名を見て盗作したな・・・!と思う方もいるかもしれませんが、参考元を忘れましたスミマセン)
【変数】
input double MaximumRisk =0.1;
input double DecreaseFactor=3;
input bool accountlot=false;
input bool AccountUSD =false;
input double lot=0.01;
double Lots ;
//+------------------------------------------------------------------+
//| LotsOptimized
//+------------------------------------------------------------------+
double LotsOptimized(double risk)
{
if(AccountUSD==true)
Lots=NormalizeDouble(AccountFreeMargin()*MaximumRisk/risk/1000,2);
else Lots=NormalizeDouble(AccountFreeMargin()*MaximumRisk/risk/1000000,2);
if(accountlot==false)Lots=lot;
if(Lots<=0.01) Lots=0.01; if(Lots>=10) Lots=10;
//--- return lot size
return(Lots);
}