今回は、複利システムの作り方です。
サンプルプログラムはこちらです。Zip圧縮していますので解凍してご利用ください。
サンプルプログラムの使い方は、以下の記事で説明しています。
福利システムの作り方
複利システムとは、口座の資金が売買取引により増えるたびに、ロット数を増やして行くというものです。(ちなみに資金が減って行くとロット数も減って行きます。)
逆マーチンゲール法と呼ばれるポジションサイジングの手法の一つです。
マーチンゲール法を説明すると長くなるので、ここでの説明は省きますが、気になる人は検索すると直ぐに見つかると思いますので、調べてみてください。
この手法を使うと、取引結果が右肩上がりのシステムでは、資金が何倍にも増加し、取引結果が右肩下がりのシステムでも資金の減少が穏やかになります。
具体的に今回のプログラムでは、常時口座に入っている資金のレバレッジ約10倍のロット数を売買します。
例を出すと、口座に入っているのが1万2千ドルの場合は、1.2ロットの売買をします。
1万6千ドルの場合は1.6ロット、8千ドルの場合は0.8ロットの売買になります。
では、プログラムの説明に行きます。
double alots,blots;
int clots;
//ロット数を、大体レバレッジ10倍にする
//AccountBalance() は、現在の口座に入っている金額を出す
//1万ドルが口座にある場合、1ロットが十万通貨なので、1万で割る
blots = AccountBalance() / 10000;
//小数点第一位までで四捨五入するために、一度10倍にして、0.5を足して、int型に入れる
clots = blots * 10 + 0.5;
//最後に、double型に0.1をかける。
//これにより、口座に入っているのが1万2千ドルの場合は、1.2ロットになる。
alots = clots * 0.1 ;
おそらく、パッと見ただけでは何をしているのか理解出来ないと思います。
今回は少しややこしいので、分かりやすく説明出来るかどうか不安なのですが、なんとか説明して行こうと思います。
まず、dluble型とint型の変数を作ります。
この二つの変数の違いで今回重要なのは、小数点以下が使えるか使えないかというところです。
この違いが後々重要になってくるので覚えて置いてください。
変数の宣言が終わったら、次に下記の処理をします。
blots = AccountBalance() / 10000;
AccountBalance()は、現在の口座にある資金を出してくれます。
一万通貨で0.1ロットなので、今回はレバレッジ10倍にするために、10000で割ります。
口座に一万ドル入っていた場合に、変数blotsに入るロット数を1にするためです。
次に、下記の処理をします。
clots = blots * 10 + 0.5;
変数clotsに blots * 10 + 0.5を入れます。
まず、どうして変数clotsにいちいち入れなおすかということから説明します。
変数clotsがint型だからです。
オーダー関数にロット数を入れるときに、小数点第一位未満の数字を入れると、0.1ロットが取引枚数の最低枚数なので、バグって取引してくれなくなります。
int型は、小数点以下の数字を切り捨ててくれるので、この不具合がなくなります。
次に、何故10倍にしているかの説明です。
0.1ロットの単位を切り捨てて、1ロット以上の単位だけで取引したい場合は、変数blotsだけを入れれば良いのですが、今回は0.1ロットの単位まで入れるために、一度10倍にしてから、int型の変数のclotsに入れます。
int型は小数点以下の数字は入れれないので、小数点以下の数字がある場合は全て切り捨てて変数にいれます。
例えば、1.23という数字を入れようとすれば、小数点以下が切り捨てられて、変数には1が入ります。
そこで、小数点第一の数字まで残しておきたい場合は、一度10倍にして、1.23を12.3にします。
これで、10倍にする前の余分な小数点第一位未満の数字を切り捨てることが出来ます。
あとで、double型に入れるときに10分の1にすれば、ロット数の最低枚数の小数点第一まで変数に入れることが出来ます。
最後に何故、0.5を足しているかの説明です。
結果を先に言うと四捨五入するためです。
int型に入れると、自動的に切り捨てるために四捨五入することが出来ません。
ですので、例えば1.26を10倍にした後の12.6の0.6を四捨五入して、13にしたくても、切り捨てられて12になります。
そこで解決策として、0.5を足します。
これにより、12.6に0.5を足して13.1になり、小数点以下が切り捨てられて13になります。
ちなみに、12.3の場合は0.5を足しても12.8になり、小数点以下が切り捨てられて12になります。
最後には、下記の処理をします。
alots = clots * 0.1 ;
先程int型の変数clotsに10倍にして入れたロット数を10分の1にして、double型の変数alotsに入れます。
これで、例えば口座に12115ドルとか半端な数字で残高が残っていても、レバレッジ約10倍の1.2ロットという数字を入れることが出来ます。
後は、オーダー関数のロット数を入れるところに、変数alotsを入れれば、複利システムの完成です。
複利システムのように取引毎にロット数が変わるシステムにした場合、バックテストのグラフのところの下の方に、ロット数の数量も出るようになりますので、視覚的にも分かりやすいです。
今回はこれで終了です。
ポジションサイジングは、システムトレードだけでなく、投資をする上でかなり重要な要素なので、他にも色々と試してみると良いと思いますよ。