勝てば官軍! ~ 日経225システムトレード編 -78ページ目

【検証】マーケットプロファイル2-2

4.30円条件とトレーリングストップ


マーケットプロファイル2_4_1



マーケットプロファイル2_4_2


5.30円条件とストップロス


マーケットプロファイル2_5_1



マーケットプロファイル2_5_2


6.トレーリングストップとストップロス


マーケットプロファイル2_6_1



マーケットプロファイル2_6_2

7.全条件


マーケットプロファイル2_7_1



マーケットプロファイル2_7_2


ちょっと条件を加えただけでもこれだけ確認したいことが増えてしまうのですね。

これに最適化を加えてバックテスト~フォワードテストとしていくと

ものすごい検証時間が必要となりそうです。


【検証】マーケットプロファイル2-1

先ほど実装した結果 を検証してみました。


3つのアイデアを加えましたがいろいろ組み合わせて試してみました

スリッページについて前回は5円ずつとしていましたが、

スリッページが発生しない場合や有利な結果となる場合も考えられるので、

今後は1円で検証していきたいと思います。

(とてもよさそうなアイデアが出てきたら少しきつめにするかもしれません)



1.30円条件のみ


マーケットプロファイル2_1_1



マーケットプロファイル2_1_2

2.トレーリングストップのみ


マーケットプロファイル2_2_1



マーケットプロファイル2_2_2


3.ストップロスのみ

マーケットプロファイル2_3_1



マーケットプロファイル2_3_2


(続きます)

【実装】マーケットプロファイル2

先ほどのアイデア を実装してみました。


--------------------------------------------------------------------

//090000-095959までの高値、安値を算出
If Time == 100000 Then {
Value1 = TimeHighEx(090000, 095959);
Value2 = TimeLowEx(090000, 095959);
Value3 = 0;
//MessageLog("%.2f", Value1);
}


//100000以降に高値を30円上回ったら買い
If Time > 100000 and CrossUp(Close,Value1 + 30) and Value3 == 0 Then {
Buy("買新規");
Value3 = 1;
}


//100000以降に安値を30円下回ったら売り
If Time > 100000 and CrossDown(Close,Value2 - 30) and Value3 == 0 Then {
Sell("売新規");
Value3 = 1;
}


//トレーリングストップ
SetSTopTrailing(40, 100, PointStop, 0);


//ストップロス
SetStopLoss(50, PointStop);


//150500に決済
SetStopEndofday(150500);

--------------------------------------------------------------------


変更点

・IF文のVALUE1, VALUE2に30円+-を加えました。

・トレーリングストップ、ストップロストレスタ 画面から設定できますが

プログラムの勉強のために実装しています。

最適化するために変数にしてもいいかもしれません。




【アイデア】マーケットプロファイル2

昨日の検証 を受けてカスタマイズしてみようと思います。


・トレーリングストップの設定

 勝率アップするはず、1回あたりの利益は減るかも


・ストップロスの設定

 勝率下がるはず、1回あたりの損失は減るはず


・エントリーは高値・安値を30円更新したらに変更

 だまし減るかも



【検証】マーケットプロファイル1

先ほどの記事の検証結果です。


※検証は以下のルールで行っています。

・手数料はトレイダーズ証券 の体系に合わせて105円ずつ、

・スリッページは5円ずつ

・5分足を使用




利益は出ていますが売建からのみで勝率も低いです。




収益曲線もこれでは運用できません。


素性は悪くなさそう(人からのアイデア)なので

いろいろと加えていきたいと思います。


【実装】マーケットプロファイル1

以前書いたアイデア を実装してみました


-----------------------------------------------------

//090000-095959までの高値、安値を算出
If Time == 100000 Then {
Value1 = TimeHighEx(090000, 095959);
Value2 = TimeLowEx(090000, 095959);
}


//100000以降に高値を上回ったら買い
If Time > 100000 and CrossUp(Close,Value1) Then {
Buy("買新規");
}


//100000以降に安値を下回ったら売り
If Time > 100000 and CrossDown(Close,Value2) Then {
Sell("売新規");
}


//150500に決済
SetStopEndofday(150500);

-----------------------------------------------------


CrossUPについてはトレスタ のマニュアルに下記のように記載されています


関 数 : CrossUP(A,B)
※ A : 判断対象
※ B : 比較対象
説 明 : 上向き突破の可否判断
参 照 : 前足では A が B より小さいか同じだったが、現在足では A が B より大きい。

上向き突破の場合は True(1)、 そうではない場合は False(0)値をリターン

-----------------------------------------------------



【検証】時刻指定売買3





シグナルと最適化の表示です。



【実装】時刻指定売買3

検証に値しないソースです


-----------------------------------------------------

Input : MAKE(5), PLUS(2);


//変数宣言
Var : flgBaibai(1), //flgBaibaiの意味:-1→売り、1→買い
ProfitLossToday(0),
ProfitLossYesterday(0),
maisu(0),
RenpaiKaisu(0);


//時刻が9時0分0秒で売買フラグが買いならば買い
if Time == 090000 and flgBaibai == 1 Then {
Buy("TEST1",OnClose,DEF,maisu);
}


//30円マイナスで損きり
SetStopLoss(30, PointStop);


//時刻が14時59分0秒に当日決済
SetStopEndofday(145900);


if Time == 150000 then {
ProfitLossToday = NetProfit() - ProfitLossYesterday;
ProfitLossYesterday = NetProfit();

if ProfitLossToday < 0 then {
RenpaiKaisu = RenpaiKaisu + 1;
} else {
maisu = 1;
RenpaiKaisu = 0;
}

if RenpaiKaisu >= MAKE Then {
maisu = maisu * PLUS;
}
}

-----------------------------------------------------


ポイント

・当日損益の出し方が判らなかったので

 NetProfit()関数を用いました。

 前日の成績(初日は0)を使い、

 当日損益 = 当日までの全損益(NetProfit) - 前日損益

 で計算しています。


・当日損益が0未満を負けとして、連敗回数を1加算

 連敗回数が指定回数(最適化可能)を超えると、売買枚数をX倍(これも最適化可能)

 にするようにしています。






【実装】時刻指定売買2

先日書いたアイデア を実装してみました。


-----------------------------------------------------

//変数宣言

Var : flgBaibai(1); //flgBaibaiの意味:-1→売り、1→買い


//時刻が9時0分0秒で売買フラグが買いならば買い
if Time == 090000 and flgBaibai == 1 Then {
Buy("TEST1");
}


//時刻が9時0分0秒で売買フラグが売りならば売り
if Time == 090000 and flgBaibai == -1 Then {
Sell("TEST2");
}


//30円マイナスで損きり
SetStopLoss(30, PointStop);


//時刻が15時05分0秒に当日決済
SetStopEndofday(150500);


//売買の向きを逆にする

if Time == 150000 then {
flgBaibai = flgBaibai * -1;
MessageLog("%.2f",flgBaibai);
}

-----------------------------------------------------

機能は実現できていますがちょっとソースが汚いかもしれません。


ポイント

・損きりの場合、SetStopLoss()メソッドを利用する

・ある時間を持って(ここでは150000としています。090000のIF文に加えると

うまくいきませんでした)売買フラグの方向を逆にする。

値を1(買い)、2(売り)とするとコード数が多くなるのでこういう形にしてみました。



本を読む本

前の記事を書いていて、
私の現在の投資本との関わりあい方は
「システムトレード可能なアイデアを収集する」こと
のみに特化して書いていると思い返していたところ
こういう本を最近読んでいたことを思い出したので紹介しておきます。
本を読む本 (講談社学術文庫)/モーティマー・J. アドラー
¥945
Amazon.co.jp

若いうち(特に学生のうち)に読んでおくと有益だと思います。