エクセルVBAによるシステムトレードソフトの作り方

エクセルVBAを使ってトレードシステムを自動構築するツールを無料で配布しています。複数の相場データに対して複数の手法を連続的に自動で検証できます。FX、先物、個別株なんでも使えます。ファイルのダウンロードはこちらから。ファイルを使いこなすことで得られるメリットはこちらで解説してます。

カテゴリ: 第2章 システムトレードのためのExcelワークシート構築法入門

シートSTEP14をご覧ください。
今までのシートではEXITサインが出ても、ポジションが継続されてしまっている状態で、シート

の構築をしてきました。このままでは、シートが使い物になりませんので、ロスカットかEXITのサインが出たらポジションが消失するようにシートを修正します。
 
前回の修正と同じように、IF-ブランクで囲んで修正していきます。
 
セルL21には次のように書き換え、オートフィルでデータの入っている最終行までワークシート関数をコピーします。
 
■STEP13以前の修正前
=IF(OR(K20="sell",K20="buy"),B21,L20)
 
■STEP14における修正後
=IF(OR(R20<>"",S20<>""),"",IF(OR(K20="sell",K20="buy"),B21,L20))
 
ここで書き加えた関数の意味は、
=IF(OR(R20<>"",S20<>""),"",
ロスカットサインの列とEXITサインの列のいずれかが、ブランクではない場合'ポジションを仕切るサインが出ていた場合、ブランクを返す
 
※また、ワークシート関数の左端にIF追加したので、それに対応したカッコが右端にひとつ増えるのでご注意ください。
 
修正前 ・・・L20) → 修正後 ・・・L20))
 
ということです。
 
続いて、セルM21も次のように書き換え、オートフィルでデータの入っている最終行までワークシート関数をコピーします。
 
■STEP13以前の修正前
=IF(K20="sell","sell",IF(K20="buy","buy",M20))
 
■STEP14における修正後
=IF(L21="","",IF(K20="sell","sell",IF(K20="buy","buy",M20)))

ここで書き加えた関数の意味は、
=IF(L21="","",
当日の約定値段の列がブランクだったら、ブランクを返す
※また、ワークシート関数の左端にIF追加したので、それに対応したカッコが右端にひとつ増えるのでご注意ください。
 
修正前 ・・・M20)) → 修正後 ・・・M20)))
ということです。
 
続いて、セルO21も次のように書き換え、オートフィルでデータの入っている最終行までワークシート関数をコピーします。
 
■STEP13以前の修正前
=IF(OR(K20="sell",K20="buy"),N20,O20)
 
■STEP14における修正後
=IF(L21="","",IF(OR(K20="sell",K20="buy"),N20,O20))
 
ここで書き加えた関数の意味は、
=IF(L21="","",
当日の約定値段の列がブランクだったら、ブランクを返す
※また、ワークシート関数の左端をIF追加したので、それに対応したカッコが右端にひとつ増えるのでご注意ください。
 
修正前 ・・・O20) → 修正後 ・・・O20))
ということです。
 
続いてセルP21を次のように書き換え、オートフィルでデータの入っている最終行までワークシート関数をコピーします。
 
■STEP13以前の修正前
=IF(K20="sell",B21+2*J20,IF(K20="buy",B21-2*J20,P20))

■STEP14における修正後
=IF(L21="","",IF(K20="sell",B21+2*J20,IF(K20="buy",B21-2*J20,P20)))
 
ここで書き加えた関数の意味は、
=IF(L21="","", 
約定値段の列がブランクだったら、ブランクを返す
 
※また、ワークシート関数の左端にIF追加したので、それに対応したカッコが右端にひとつ増えるのでご注意ください。
 
ということです。
 
STEP14のシートは以上の作業を行ったものです。 STEP13とシート全体を見比べてみてください。
 
これにより、いよいよシステムの検証ができそうなシートに見えてきたと思います。

このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr Clip to Evernote

シートSTEP13をご覧ください。
 
ここでは、sellの損益に引き続き、buyの損益を返します。
 
セルU21に次のように書きこみ、オートフィルでデータの入っている最終行までワークシート関数をコピーします。
=IF(AND(M21="buy",R21="opLC"),(B21-L21)*$K$17*O21-$K$19*O21,IF(AND(M21="buy",R21="losscut"),(P21-L21)*$K$17*O21-$K$19*O21,IF(AND(M20="buy",S20="EXIT"),(B21-L20)*$K$17*O20-$K$19*O20,"")))
 
この関数の意味は、
=IF(AND(M21="buy",R21="opLC") 
もし、ポジションがbuyで、かつ、opLCが出ていたら、
 
(B21-L21)*$K$17*O21-$K$19*O21
'始値-約定値段(×倍率×建玉枚数-手数料×売買枚数 を返す
 
IF(AND(M21="buy",R21="losscut"),
ポジションがbuyで、かつ、losscutが出ていたら
 
(P21-L21)*$K$17*O21-$K$19*O21
'ロスカットの価格-約定値段(×倍率×建玉枚数-手数料×売買枚数 を返す
 
IF(AND(M20="buy",S20="EXIT"),
前日のポジションがbuyで、かつ、前日にEXITサインが出ていたら
 
(B21-L20)*$K$17*O20-$K$19*O20
'始値-約定値段(×倍率×建玉枚数-手数料×売買枚数 を返す
 
,"")))
いずれでもない場合はブランクを返す
 
ということです。

このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr Clip to Evernote

シートSTEP12をご覧ください。
 
ここでは、ポジションがsellのときの損益を返します。
 
なぜ、buyと区別するかと言うと、sellとbuyの損益を分けて集計することによって、パフォーマンスの評価の際に、売り有利、買い有利などのバイアスを見極めることができるようにするためです。
 
また、手数料の計算方法については、便宜上、1枚ごとに1000円と一律に計算することにいたします。
 
セルT21に次のように書きこみ、オートフィルでデータの入っている最終行までワークシート関数をコピーします。
 
=IF(AND(M21="sell",R21="opLC"),(L21-B21)*$K$17*O21-$K$19*O21,IF(AND(M21="sell",R21="losscut"),(L21-P21)*$K$17*O21-$K$19*O21,IF(AND(M20="sell",S20="EXIT"),(L20-B21)*$K$17*O20-$K$19*O20,"")))
 
少々長いですが、分解すると何を表現しているのかわかりますので、じっくり理解してください。

この関数の意味は、
=IF(AND(M21="sell",R21="opLC"),
もし、当日のポジションがsellで、かつ、ロスカットサインがopLCだったら、
 
(L21-B21)*$K$17*O21-$K$19*O21
'約定値段-始値(×倍率×建玉枚数-手数料×建玉枚数 を返す
 
IF(AND(M21="sell",R21="losscut")
当日のポジションがsellで、かつ、losscutのサインが出たら、
 
(L21-P21)*$K$17*O21-$K$19*O21
'約定値段-ロスカットの価格(×倍率×建玉枚数-手数料×建玉枚数 を返す
 
IF(AND(M20="sell",S20="EXIT"),
前日のポジションがsellで、かつ、前日にEXITサインが出ていたら、
 
(L20-B21)*$K$17*O20-$K$19*O20
'約定値段-始値(×倍率×建玉枚数-手数料×建玉枚数 を返す
 
,"")))
いずれでもない場合は、ブランク を返す
 
ということです。
このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr Clip to Evernote

シートSTEP11をご覧ください。
 
続いて、ポジションがEXITの価格に達した場合のEXITサインを返します。
 
セルS21に次のように書きこみ、オートフィルでデータの入っている最終行までワークシート関数をコピーします。
=IF(R21<>"","",IF(AND(M21="sell",Q21<=C21),"EXIT",IF(AND(M21="buy",Q21>=D21),"EXIT","")))
 
この関数の意味は、
=IF(R21<>"","",
 
当日ロスカットのサインの列がブランクではない'当日にロスカットサインが出ている場合(は、ブランクを返す

IF(AND(M21="sell",Q21<=C21),"EXIT"
ポジションがsellで、かつ、当日の高値がEXITの価格以上であるとき、「EXIT」を返す
 
IF(AND(M21="buy",Q21>=D21),"EXIT"
ポジションがbuyで、かつ、当日の安値がEXITの価格以下であるとき、「EXIT」を返す
 
,"")))
いずれでもない場合、ブランクを返す
 
ということです。
このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr Clip to Evernote

シートSTEP10をご覧ください。
 
ここでは、ポジションが損切りの価格に達した場合のロスカットサインを返します。
 
ロスカットの価格に達するのが、日中の場合を「losscut」で、ロスカットの価格に寄り付きの次点で達してしまった場合を「opLC」オープニングロスカット(という記号で表現します。
 
セルR21に次のように書きこみ、オートフィルでデータの入っている最終行までワークシート関数をコピーします。
=IF(M21="","",IF(AND(M20="sell",P20<=B21),"opLC",IF(AND(M20="buy",P20>=B21),"opLC",IF(AND(M21="sell",P21<=C21),"losscut",IF(AND(M21="buy",P21>=D21),"losscut","")))))

この関数の意味は、
=IF(M21="","",
ポジションがブランクの場合、ブランクを返す

IF(AND(M20="sell",P20<=B21),"opLC"
もし、前日sellポジションを持っていて、かつ、当日の始値が前日時点のロスカットの価格以上であれば、「opLC」を返す
 
IF(AND(M20="buy",P20>=B21),"opLC"
もし、前日buyポジションを持っていて、かつ、当日の始値が前日時点のロスカットの価格以下であれば、「opLC」を返す
 
IF(AND(M21="sell",P21<=C21),"losscut"
ポジションがsellで、かつ、当日の高値が損切りの価格以上であるとき、「losscut」を返す
 
IF(AND(M21="buy",P21>=D21),"losscut"
ポジションがbuyで、かつ、当日の安値が損切りの価格以下であるとき、「losscut」を返す
,"")))))
 
いずれでもない場合はブランクを返す
ということです。
このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr Clip to Evernote

このページのトップヘ