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

【実装】12:30に仕掛ける5分足トレード

http://ameblo.jp/traderssystem/entry-10104338263.html


---------------------------------------------------------------
//12:30までのレンジ
Value1 = DayOpen(0);
Value2 = DayLow(0) + ((DayHigh(0) - DayLow(0)) / 4);
Value3 = TimeHigh(103000, Time);
Value4 = TimeHigh(090000, 102959);
Value5 = TimeHigh(103000, 103459);
Value6 = TimeHigh(093000, 093459);

Value12 = DayHigh(0) - ((DayHigh(0) - DayLow(0)) / 4);
Value13 = TimeLow(103000, Time);
Value14 = TimeLow(090000, 102959);
Value15 = TimeLow(103000, 103459);
Value16 = TimeLow(093000, 093459);


//その日の始値は12:30までのレンジの25%以下で寄り付いている
//その日の高値が10:30以降についている
//10:30を含む足の高値が9:30を含む足の高値よりも高い
//3つを満たすとき12:30に買い、大引け10分前で決済
If sTime == 123000 then {
If Value1 <= Value2 and
Value3 > Value4 and
Value5 > Value6 then {

Buy("DT0801新規買", OnClose);
}
}


//その日の始値は12:30までのレンジの75%以上で寄り付いている
//その日の安値が10:30以降についている
//10:30を含む足の安値が9:30を含む足の安値よりも安い
//3つを満たすとき12:30に売り、大引け10分前で決済
If sTime == 123000 then {
If Value1 >= Value2 and
Value3 < Value4 and
Value5 < Value6 then {

Sell("DT0801新規売", OnClose);
}
}

SetStopEndofday(150000);

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

個々の要素は難しくないと思います。

これだけの変数をValueで使うのはどこかで間違いがあっても

気づきにくくなるので危険ですね

あと、時間のところもちょっと怪しいかもしれません。


【実装】】%Fと移動平均の交差

http://ameblo.jp/traderssystem/entry-10104973420.html


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

Input : F_Period(5), Ma_Period(3);

Var : PercentF(0);


//%F=100×(終値-終値の予測値)/終値
//EasyLanguageではLinearRegValue()関数を利用
PercentF = 100 * (Close[0] * LRL(Close, F_Period)) / Close;
//PercentF = 100 * (Close[0] * LRS(Close, F_Period)) / Close;


//本日5日%Fが3日単純移動平均を上抜くとき
If CrossUp(PercentF, Ma(PercentF, Ma_Period)) Then {

//翌日の寄り付きで買い
Buy("SW3001新規買", AtMarket);
}


//本日5日%Fが3日単純移動平均を下抜くとき
If CrossDown(PercentF, Ma(PercentF, Ma_Period)) Then {

//翌日の寄り付きで売り
Sell("SW3001新規売", AtMarket);
}

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


LRL()関数が難しいですね。

終値の予測値というアイデアからこれを実装できれば

かなりの実力を持っているといえるのではないでしょうか?

(私はEasy Languageのソースコードを流用しました)


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

/* LRS : (L)inear (R)egression (L)ine
*
* Provided By : YesStock Inc. (c) Copyright 2006
* E-Mail : webmaster@yesstock.com
*/

Input : Value(NumericSeries), Period(NumericSimple);
Var : value1(0), value2(0), AccumValue(0);

AccumValue = accum(1);

value1 = ma(AccumValue, Period);
value2 = ma(Value, Period);

LRL = (ma(Value * AccumValue, Period) - value1 * value2) /
(ma(AccumValue^2, Period) - (ma(AccumValue, Period)^2)) * (AccumValue - value1) + value2;

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


LRL()関数です。

YesStock社、コメント間違えてますね。


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

/* LRS : (L)inear (R)egression (S)lope
*
* Provided By : YesStock Inc. (c) Copyright 2006
* E-Mail : webmaster@yesstock.com
*/

Input : Price(NumericSeries), Len(NumericSimple);
Var : X(0), Num1(0), Num2(0), SumBars(0), SumSqrBars(0), SumY(0), Sum1(0), Sum2(0);

If Len == 0 Then
LRS = 0;

SumBars = Len * (Len - 1) * .5;
SumSqrBars = (Len - 1) * Len * (2 * Len - 1) / 6;
Sum1 = 0;

For X = 0 To Len - 1 Begin
Sum1= Sum1 + X * Price[X];
End;

SumY = AccumN(Price, Len);
Sum2 = SumBars * SumY;
Num1 = Len * Sum1 - Sum2;
Num2 = SumBars * SumBars - Len * SumSqrBars;

If Num2 != 0 Then
LRS = Num1 / Num2;
Else
LRS = 0;

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


LRS()関数です。

そのうち解読していきたいと思いますが、

参考になるサイトがあれば教えてほしいです。。。



【実装】株価指数のブレイクアウト手法

http://ameblo.jp/traderssystem/entry-10104337117.html


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

Input : period(20), high_point(0.2), low_point(-0.2);


//始値±過去3日間の平均レンジの2分の1の水準に
Value1 = High - Low;
Value2 = Average(Value1[0] + Value1[1] + Value1[2], 3) / 2;


//ストップ注文をおいて仕掛ける
If (MarketPosition == 0 ) Then {
Buy("SW1901新規買", AtStop, Open[0] + Value2);
}


If (MarketPosition == 0 ) Then {
Sell("SW1901新規売", AtStop, Open[0] - Value2);
}


//フィルターとして
//2日連続して高く引けたとき+1、
//2日連続して安く引けたとき-1、
//上記以外を0とする
If (Close[0] > Close[1] and Close[1] > Close[2]) Then {
Value3 = 1;
} Else If (Close[0] < Close[1] and Close[1] < Close[2]) Then{
Value3 = -1;
} Else {
Value3 = 0;
}


//過去20日間の平均値がある値以上になったとき、
//翌日に買い注文、売り注文をおく
If Average(Value3, period) >= high_point Then {
ExitLong("SW1901買決済", AtMarket);
}


If Average(Value3, period) <= low_point Then {
ExitShort("SW1901売決済", AtMarket);
}

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


個々の要素は難しくないと思います。

・最初のところでRange()関数を利用する。

・変数名を意味が通じるように定義する

ということをすればもう少しきれいになります





DVD 山口祐介さん

DVD 資産一億円を稼ぐ思考術とシステムトレード戦略/山口祐介
¥29,400
Amazon.co.jp

内容について詳細に書くわけには行きませんが、
実際使われているシステムトレーディングのロジックを2本紹介されています。

これから有効性を検証していきたいと思っています。


【実装】DEMA2つの指数移動平均

http://ameblo.jp/traderssystem/entry-10104972466.html


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

Input : ShortDayRange(8), LongDayRange(18), MaDayRange(9);


Value1 = ma(C, ShortDayRange) - ma(C, LongDayRange);
Value2 = ma(Value1, MaDayRange);


If CrossUp(Value1, Value2) then {
Buy("買", Atmarket);
}


If CrossDown(Value1, Value2) then {
Sell("売", Atmarket);
}

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


アイデアをどのように値として表現するかがわかれば

Value1, Value2のロジックも簡単に書けると思います。

(といって間違えていたら悲惨ですが・・・)



【実装】60分足

http://ameblo.jp/traderssystem/entry-10104336126.html


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

Value1 = DayOpen(0);
Value2 = TimeClose(090000, 095959);
Value3 = TimeClose(100000, 105959);


//最初の2本の60分足の終値がその日の始値よりも高く、
//2本目の足の終値が1本目の足の終値よりも高いとき、
If sTime >= 110000 Then {
If Value1 > Value2 and Value1 > Value3 and Value3 > Value2 Then {

//次の足の成り行きで買い、大引けで手仕舞い
Buy("DT0901新規買", AtMarket);
}
}


SetStopEndofday(150500);

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


5分足を想定して作成しています。

SetStopEndofday(150500)を150500としているのは151010だと注文が飛ぶ前に

場が閉じてしまう可能性を考慮しています。



【実装】日付指定売買

http://ameblo.jp/traderssystem/entry-10104972121.html


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

//火、水、木、金曜日に月曜日の高値か前日金曜の高値の高い方を
//逆指値で買う
//金曜大引けで手仕舞い
//ただし、月曜・金曜どちらかが休日ならサインなし

If CurrentWeek(Date) == 1 Then {
Value1 = High[0];
Value3 = Date;
}


If CurrentWeek(Date) == 5 Then {
Value2 = High[0];
Value4 = Date;

If MarketPosition == 1 Then {
ExitLong("SW3701買決済", OnClose);
}

If MarketPosition == -1 Then {
ExitShort("SW3701売決済", OnClose);
}
}


If CurrentWeek(Date) == 1 and
Date - 3 == Value4 Then {
Buy("SW3701新規買_火曜", AtStop, Max(Value1, Value2));
}


If CurrentWeek(Date) == 2 and
Date - 1 == Value3 and Date - 4 == Value4 Then {
Buy("SW3701新規買_水曜", AtStop, Max(Value1, Value2));
}


If CurrentWeek(Date) == 3 and
Date - 2 == Value3 and Date - 5 == Value4 Then {
Buy("SW3701新規買_木曜", AtStop, Max(Value1, Value2));
}

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


トレコレ さん作のCurrentWeek()関数を利用しています。


ちょっとややこしいので順番に見ていきましょう。


1.月曜日

 当日高値をValue1にセット

 当日の日付をValue3にセット


2.金曜日

 当日高値をValue2にセット

 当日の日付をValue4にセット

 ポジションを保有していたら決済 


3.月曜日かつ3日前がValue4の日付

 (休日の場合はValue4には月曜から見て2週前の値となるので条件を満たさない)

 火曜日の始値のタイミングで逆指し注文


4.火曜日かつ1日前がValue1の日付 かつ 3日前がValue4の日付

 水曜日の始値のタイミングで逆指し注文

 

5.水曜日かつ2日前がValue1の日付 かつ 4日前がValue4の日付

 木曜日の始値のタイミングで逆指し注文

 

わかりにくい原因は

・コメントがない

・変数を自分で定義せずValueを用いている

ことにあります。コレを見て難しいと感じた方は上の2点を修正してみてください。



【実装】30分足

http://ameblo.jp/traderssystem/entry-10104335684.html


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

Value1 = DayOpen(0);
Value2 = TimeClose(090000, 092959);
Value3 = TimeClose(093000, 095959);
Value4 = TimeClose(100000, 102959);
Value5 = TimeClose(103000, 105959);
Value6 = TimeClose(123000, 125959);
Value7 = TimeClose(130000, 132959);
Value8 = TimeClose(133000, 135959);
Value9 = TimeClose(140000, 142959);

//30分足の終値がその日の始値よりも高いときは買う(ピラミッディングあり)
If Time == 093000 and Value1 < Value2 Then {
Buy("DT1001新規買_0900", AtMarket);
}

If Time == 100000 and Value1 < Value3 Then {
Buy("DT1001新規買_0930", AtMarket);
}

If Time == 103000 and Value1 < Value4 Then {
Buy("DT1001新規買_1000", AtMarket);
}

If Time == 110000 and Value1 < Value5 Then {
Buy("DT1001新規買_1030", AtMarket);
}

If Time == 130000 and Value1 < Value6 Then {
Buy("DT1001新規買_1230", AtMarket);
}

If Time == 133000 and Value1 < Value7 Then {
Buy("DT1001新規買_1300", AtMarket);
}

If Time == 140000 and Value1 < Value8 Then {
Buy("DT1001新規買_1330", AtMarket);
}

If Time == 143000 and Value1 < Value9 Then {
Buy("DT1001新規買_01400", AtMarket);
}

//大引けですべて手仕舞い
SetStopEndofday(150500);

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

5分足での動作を想定していますが、30分以内の足なら動作しそうです。

Value1はDayOpen()関数でN日前の日足の始値を取得しています

 (0日なので当日ということです)

Value2 - Value9までは

 指定時間の終値を取得しています。

 30分足を用いるならば比較のところで単純にValue1 < Close[0]とすればいいだけです。




【実装】ストキャスの破裂

http://ameblo.jp/traderssystem/entry-10104971602.html


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

Input : fast_period(14), fk_high_value(75), fk_low_value(25),
slow_1_period(14), slow_2_period(14);


//本日14日ファスト%Kストキャスが75を上抜く かつ
//本日14日ファスト%Kストキャス>14日スロー%Kストキャス のとき
//翌日寄り付きで買い
If CrossUp(FastK(fast_period), fk_high_value) and
FastK(fast_period) > SlowK(slow_1_period, slow_2_period) Then {
Buy("SW3201新規買", AtMarket);
}


If CrossDown(FastK(fast_period), fk_low_value) and
FastK(fast_period) < SlowK(slow_1_period, slow_2_period) Then {
Sell("SW3201新規売", AtMarket);
}


//本日14日ファスト%Kストキャスが14日スロー%Kストキャスを下抜くとき
//手仕舞い
If CrossDown(FastK(fast_period), SlowK(slow_1_period, slow_2_period)) Then {
ExitLong("SW3201買決済", AtMarket);
}


If CrossUp(FastK(fast_period), SlowK(slow_1_period, slow_2_period)) Then {
ExitShort("SW3201売決済", AtMarket);
}

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


FastK()関数、SlowK()関数を理解しておくとわかりやすいと思います。

私はストキャスはちょっと苦手です。


【実装】支持線・抵抗線に基づくトレード

http://ameblo.jp/traderssystem/entry-10104335001.html


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

Input : DayRange(3), stockRange(20);


//指定期間の値幅のX%を取得
Value1 = (Highest(High, DayRange) - Lowest(Low, DayRange)) * stockRange / 100;


//指定期間の値幅の上限値を取得
Value2 = Lowest(Low, DayRange) + Value1;


//指定期間の値幅の下限値を取得
Value3 = Highest(High, DayRange) - Value1;


If Highest(Low, DayRange) <= Value2 Then {
Buy("買", Atmarket);
}

If Lowest(High, DayRange) >= Value3 Then {
Sell("売", Atmarket);
}


IF (MarketPosition == 1) then {
ExitLong("買決済", OnClose);
}


IF (MarketPosition == -1) then {
ExitShort("売決済", OnClose);
}

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


Value1 は 

過去N日間の値幅(=過去N日の高値-過去N日の安値)のX%を算出


Value2, Value3 で

過去N日間の値幅のX%~(100-X)%を算出しています


過去3日の高値15000、安値10000、20%で考えると

Value1 = (15000 - 10000) * 20 / 100 = 1000

Value2 = 10000 + 1000 = 11000

Value3 = 15000 - 1000 = 14000


過去3日の最も安い高値が11000を下回ると買いとしています。