システムトレード用の開発ツールです。エクセルのVBAを駆使して最高のパフォーマンスを目指します。基本は無料
逆張り指標の代表選手であるストキャティクスを使ったシステムを作成します。基本は2本線のクロスなので使うのはIF関数と2本線の位置関係を表す不等号です。さらに今回は、75%以上を超えると買われ過ぎ、25%を割り込むと売られ過ぎを表すフィルターもシステムに組み込みます。
解説する前にメニューバー「指標」→「その他の補助指標」→「基本的な売買式」を選択し、選択肢の中から「ストキャティクスによる逆張り」を選んでください。
通常ストキャティクスは3本線の内(%K、%D、SD)の2本線の関係を見て売買の判断を見ます。%Kと%Dの関係を見て売買判断すると売買シグナルは早めにでますが、その分だましも多くなります。逆に%DとSDの関係を見て売買判断すると、売買シグナルが遅い分、だましは減ります。どちらの組み合わせを使うかは好みです。というか市場に合った方を選んでください。今回は%Kと%Dの関係をみて売買判断をしてみます。

図1のAのところで買い、Bで手仕舞います。今回は25%と75%のフィルターも売買式で表す必要があります。これがないと図1のEのようなところでも買いまたは手仕舞いが発動します。
BG34(先頭行)の関数式をクリックして確認してください。
=IF($C34>AL$4,IF(AND(BF33=0,Z33<AA33,Z34>AA34,Z33<AL$2),"買い",""),"")
となっていると思います。
では、BG34(1から5の条件を満たすと「買い」と表示させる)に入っている関数の主要部分の説明です。
1.C列にはC34を先頭に1から順に番号を振っています。行が1行下がるごとに1つづつ増えます。
2.AL4はデータの先頭行部分周辺で誤ったシグナルを出さないようにするための変数が入っているセルです。%Kの計算期間とSDの計算期間を足した数になります。
3.BF列は、「買い」がBG列に表示されてから、「手仕舞い」が表示されるまでは「1」を返します。何もない場合は「0」を返します。よって、BF33=0なら「0の時のみBG列に「買い」を表示させよ」になります。
1から3までの条件は「買い」→「手仕舞い」→「買い」→「手仕舞い」・・・・・と正しくまた、交互に表示さるために必要な構文です。よってどどのような売買式を自作するにしろ1から3の条件文は必要です。これから説明する4と5がストキャティクスの逆張り部分を表す関数式となります。
4.Z列は%Kの値が入っている列です。AA列には%Dの値が入っています。「Z33<AA33」で前日の%Kと%Dの位置関係を表しています。つまり、「Z33<AA33」は前日の%Kが前日の%D以下の状態指しています。そして、「Z34>AA34」は本日の%Kと本日の%Dの位置関係です(数字が1増えて34になっています)。つまり、本日は%Kが%D以上の値になったという意味です。両方で「前日は%Kは%D以下だったが、本日は%Kが%Dを上回った」という意味になります。
注意1:ストキャティクスのクロスの部分も前回のゴールデンクロスのように、本日の%Kと本日の%Dの位置関係を不等式で表すだけでも同じ結果がでることがテスト中に分かりました。混乱させてすいません。つまり、不等式「Z33<AA33」は別にあってもなくてもいいということです。
=IF($C34>AL$4,IF(AND(BF33=0,Z34>AA34,Z33<AL$2),"買い",""),"")
5.Z33<AL$2 のAL2には%Kの下限値(25%)が入っています。ですのでこの「Z33<AL$2」は「前日の%Kが25%以下ならば」というフィルターの役目を表しています。
4と5を合わせると、
「もし前日の%Kが%Dを下回っていて、且つ本日%Kが%Dを上回り、且つ前日の%Kが25%以下の時は「買い」と表示せよ。」
という意味になります。
次に「手仕舞い」の表示をさせる、BH34をクリックして関数式を確認してください。
=IF($C34>AL$4,IF(AND($BF33=1,Z33>AA33,Z34<AA34,Z33>AL$3),"手仕舞い",""),"")
となっていると思います。
BH34(1から4の条件を満たすと「手仕舞い」と表示させる)に入っている関数の主要部分の説明です。
1.C34
2.AL4
3.BF33=1
1から3は「ゴールデンクロスを作る(1)」の中の「手仕舞い」の1から3の条件と全く同じです。
4.Z列は%Kの値が入っている列です。AA列には%Dの値が入っています。「Z33>AA33」は%K>%Dに置き換えられ、「Z34<AA34」は%K<%Dに置き換えることができます。つまり「買い」の時の真逆をしなさいという構文になります。
5.Z33>AL$3のAL3セルには%Kの上限値の75%が入っています。ですのでこの「Z33>AL$3」は「前日の%Kが75%以上ならば」というフィルターの役目を表しています。
4と5を合わせると、
「もし前日の%Kが%Dを上回っていて、且つ本日%Kが%Dを下回り、且つ前日の%Kが75%以上の時は「手仕舞い」と表示せよ。」
という意味になります。
ところでこの「手仕舞い」のシグナルは図1のBで出るのでしょうか?それとも図1のCで出るのでしょうか?Cで「手仕舞い」のシグナルが出れば理想なのですが、実際は図1のBで「手仕舞い」のシグナルが出ます。説明するまでもありませんが、エクセルからすればBもCも全く同じ条件を満たしていることになります。ですので早い方のBの地点でシグナルが出てしまいます。もしBでなくてCでシグナルを出したい場合は「手仕舞い」の関数式にそういった条件を加えることが必要です。ちょっと複雑ですがやり方を説明します。まず、BO列とBP列は予備列になっているので以下の関数式を入れます。
BO列の34行目に以下の関数を挿入し、最終行まで更新してください(「操作」→「更新」→「関数更新」)。
=IF($C34>AL$4,IF(AND(Z33>AA33,Z34<AA34,Z33>AL$3),1,0),0)
=IF($C34=1,0,IF(BG34="買い",0,IF(BO34=1,BO34+BP33,BP33)))
=IF($C34>AL$4,IF(AND($BF33=1,BP34=2),"手仕舞い",""),"")
以上で図1のCの時に「手仕舞い」をする関数式が完成しました。しかしやってみると分かると思うのですが、今回は図1のCの方がBの時よりパフォーマンスが良さそうなのは明らかですが、他の売買機会も図1のCの方がパフォーマンスが良いとは限りません。売買式を複雑にすればするほどカーブフィットに陥り易いので注意が必要です。
次に「売り」から入る場合の仕掛けの説明ですが、ドテンするだけですので説明は省略します。「ゴールデンクロスを作る(1)」などを参考に自身で確かめてください。

投稿者 システムトレーダー壱式 : 2008年05月24日 01:23
このエントリーのトラックバックURL:
http://systemtrader.info/cgi/mt/mt-tb.cgi/62