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

比較銘柄の活用

トレイダーズ証券のFAQ を見て下のデバッグ文を試してみました。


MessageLog("%.0f %.0f", Close, Data2(Close));

1つ目の銘柄を分足、比較銘柄を日足で作成すれば

分足のシステムの中で日足の条件を組み込めそうです。


これまでいろいろと書いていたのが無駄になりそうな発見です。


【実装】1-2-3-4's

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


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

Input : ADX_Period(14), ADX_LOW_Point(30), ADX_HIGH_Point(70), DI_Period(14),
Entry_Point(10), Exit_Point(0);


//14日間ADXが30以上
//14日間+DIが14日間-DIを上回る
//3日間続けて前日安値を更新 または
//3日間のうちのいずれか2日間の安値更新と1日のはらみ足
//のとき

If ADX(ADX_Period) >= ADX_LOW_Point and
Diplus(DI_Period) > DiMinus(DI_Period) and
((Close[0] < Low[1] and Close[1] < low[2] and Close[2] < low[3]) or
(low[0] > low[1] and High[0] < High[1] and Close[1] < low[2] and Close[2] < low[3]) or
(low[1] > low[2] and High[1] < High[2] and Close[0] < low[1] and Close[2] < low[3]) or
(low[2] > low[3] and High[2] < High[3] and Close[0] < low[1] and Close[1] < low[2])) Then {

//翌日、当日高値のNポイント上に逆指し注文
Buy("SW3601新規買", AtStop, High[0] + Entry_Point);

If MarketPosition == 0 Then {
Value1 = Low[0] + Exit_Point;
}
}


If ADX(ADX_Period) <= ADX_HIGH_Point and
Diplus(DI_Period) < DiMinus(DI_Period) and
((Close[0] > High[1] and Close[1] > High[2] and Close[2] > High[3]) or
(low[0] > low[1] and High[0] < High[1] and Close[1] > High[2] and Close[2] > High[3]) or
(low[1] > low[2] and High[1] < High[2] and Close[0] > High[1] and Close[2] > High[3]) or
(low[2] > low[3] and High[2] < High[3] and Close[0] > High[1] and Close[1] > High[2])) Then {

//翌日、当日高値のNポイント上に逆指し注文
Sell("SW3601新規売", AtStop, Low[0] - Entry_Point);

If MarketPosition == 0 Then {
Value2 = Low[0] - Exit_Point;
}
}


If MarketPosition == 1 Then {
ExitLong("SW3601買決済_損切り", AtStop, Value1);
}


If MarketPosition == -1 Then {
ExitShort("SW3601売決済_損切り", AtStop, Value2);
}

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


ADX()関数、DIPlus()関数、DIMinus()関数はソースやサイトで確認が必要そうです。


3日間のうちのいずれか2日間の安値更新と1日のはらみ足

という条件の実装は難しくはないですがちょっと面倒ですね。


・本日、1日前に安値更新、2日前がはらみ足

・本日、2日前に安値更新、1日前がはらみ足

・1日前、2日前に安値更新、本日がはらみ足

という3つの条件のいずれかという記述を行っています。



【実装】拡大ブレークアウト

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


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

Input : Highest_Range(60), Lowest_Range(60), Range_Date(9),
Entry_Point(10), Exit_Point(10);


If High[0] == Highest(C, Highest_Range) and
Range[0] == Highest(Range, Range_Date) Then {
Buy("SW3501新規買", AtStop, High[0] + Entry_Point);

If MarketPosition == 0 Then {
Value1 = Close[1] - Exit_Point;
}
}


If Low[0] == Lowest(C, Lowest_Range) and
Range[0] == Highest(Range, Range_Date) Then {

Sell("SW3501新規売", AtStop, Low[0] - Entry_Point);

If MarketPosition == 0 Then {
Value2 = Close[1] + Exit_Point;
}
}

If MarketPosition == 1 Then {
ExitLong("SW3501買決済_損切り", AtStop, Value1);
}


If MarketPosition == -1 Then {
ExitShort("SW3501売決済_損切り", AtStop, Value2);
}

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


クイズの答えが出てます


必要なのはMarketPosition()関数ですね。


これがないと、条件を満たすたびに値が書き換わってしまいます。

ピラミッディングを許容しているときはどちらの値をとるか判断しますが、

許容していないときにエントリーしていないタイミングで

決済価格を設定することになっています。


【実装】15日前30日前価格比較

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


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

Input : short_period(15), long_period(30);


//当日終値>=X日前終値かつY日前終値のとき、
//翌日寄り付きで買い
if(C[0] >= C[short_period] and C[0] >= C[long_period]) then {
Buy("SW1201新規買", AtMarket);
Value1 = C[short_period];
Value2 = C[long_period];
}


//当日終値<=X日前終値、Y日前終値のとき、
//翌日寄り付きで買い
if(C[0] <= C[short_period] and C[0] <= C[long_period]) then {
Sell("SW1201新規売", AtMarket);
Value1 = C[short_period];
Value2 = C[long_period];
}


//当日終値<X日前終値またはY日前終値のとき決済
if(C[0] < C[short_period] or C[0] < C[long_period]) then {
ExitLong("SW1201買決済", AtMarket);
}


//当日終値>X日前終値またはY日前終値のとき決済
if(C[0] > C[short_period] or C[0] > C[long_period]) then {
ExitShort("SW1201売決済", AtMarket);
}

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


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

と同じ問題をかかえています。


正解は後日

【実装】ジョーズ・ジェシー・リバモア

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


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

Input : low_period(8), high_period(8), KeepDay(12);


//本日安値<前日安値 かつ 本日高値>前日高値 のとき
//翌日、前日高値を逆指し買い かつ
//翌日、前日安値を逆指し売り
If (Low[0] < Low[1] and High[0] > High[1]) then {
Buy("SW1301新規買", AtStop, High[1]);
Sell("SW1301新規売", AtStop, Low[1]);
Value1 = Lowest(Low, low_period);
Value2 = Highest(High, high_period);
}


//過去N日間の安値で買い決済
If MarketPosition == 1 Then {
ExitLong("SW1301買決済-逆指", AtStop, Value1);
}


//過去N日間の高値で売り決済
If MarketPosition == 1 Then {
ExitShort("SW1301売決済-逆指", AtStop, Value2);
}


//N日間後に決済
If BarsSinceEntry(0) == KeepDay then {
if MarketPosition == 1 then {
ExitLong("SW1301買決済-期限", OnClose);
}
if MarketPosition == -1 then {
ExitShort("SW1301売決済-期限", OnClose);
}
}

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


微妙にアイデアを実現できていません。


クイズです。

1.どういう場合に想定する動作と異なるでしょうか?

2.何を追加すれば1の問題を回避できるでしょうか?




デバッグ文

MessageLog()関数で複数個の出力がほしいとき



MessageLog("%.0f %.0f %.0f", Date, DayOfWeek(date), Close[0]);

のように書くようです。マニュアルにはのってなかったと思います。


【実装】ボラティリティ・システム

http://ameblo.jp/traderssystem/entry-10104986944.htm


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

Input : period(7), kakeme(3);
Var : Low_Value(0), High_Value(0);


//初回は移動平均との比較で購入
If MarketPosition == 0 Then {
If Close[0] > Ma(Close, 10) Then {
Buy("SW3101新規買_初回", AtMarket);
} Else {
Sell("SW3101新規売_初回", AtMarket);
}
}


//売り玉を維持している期間中の最も安い終値を算出
If MarketPosition == -1 Then {
If Close[0] < Low_Value Then {
Low_Value = Close[0];
}
}


//買い玉を維持している期間中の最も高い終値を算出
If MarketPosition == 1 Then {
If Close[0] > High_Value Then {
High_Value = Close[0];
}
}


//7日間の真の値幅の平均(ATR)の3倍
Value1 = ATR(period) * kakeme;


//本日終値>売り玉を維持している期間中の最も安い終値
//+過去7日間の真の値幅の平均(ATR)の3倍を加えた額のとき
If MarketPosition == -1 Then {
If Close[0] > Low_Value + Value1 Then {

//翌日寄り付きで買い
Buy("SW3101新規買", AtMarket);
High_Value = Close[0];
}
}


//本日終値<売り玉を維持している期間中の最も高い終値
//-過去7日間の真の値幅の平均(ATR)の3倍を加えた額のとき
If MarketPosition == 1 Then {
If Close[0] > High_Value - Value1 Then {

//翌日寄り付きで売り
Sell("SW3101新規売", AtMarket);
Low_Value = Close[0];
}
}

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


玉を維持している期間中の最も安い終値

というのが真新しいところでしょうか。


まず、MarketPositionでポジションを保有している場合のみ処理を行うようにしています。

次に、その中で終値がこれまでの最安値を下回るかを確認します。

下回る場合は最安値を表す変数 Low_Value に、当日終値を設定します。


難しく感じる場合は日々の終値を入れて1行ずつたどってみて下さい。



【実装】フィブ・キャッチャー

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


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

Input : low_period(14), high_period(14), open_period(4), KeepDay(3);


//本日安値が過去X日間の最安値のとき
//翌日、過去Y日の高値で逆指し買い
If (Low[0] == Lowest(Low, low_period)) Then {
Buy("SW1501新規買", AtStop, Highest(High, open_period));
}


//本日安値が過去X日間の最高値のとき
//翌日、過去Y日の安値で逆指し売り
If (High[0] == Highest(High, high_period)) Then {
Sell("SW1501新規売", AtStop, Lowest(Low, open_period));
}


//N日間後に決済
If BarsSinceEntry(0) == KeepDay then {
if MarketPosition == 1 then {
ExitLong("SW1501買決済-期限", OnClose);
}
if MarketPosition == -1 then {
ExitShort("SW1501売決済-期限", OnClose);
}
}

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


これまでに解説してきた機能だけで実装できます。


【実装】方向性指標

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


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

Input : di_period(10), adx_period(14), low_rate(25), high_rate(75);

Value1 = Diplus(di_period);
Value2 = DiMinus(di_period);


//本日+DIが本日-DIを上抜く かつ
//本日14日ADX(R)>25 のとき
If (CrossUp(Value1[0], Value2[0]) and
ADX(adx_period) > low_rate) Then {

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


//本日+DIが本日-DIを下抜く かつ
//本日14日ADX(R)<75 のとき
If (CrossDown(Value1[0], Value2[0]) and
ADX(adx_period) > high_rate) Then {

//翌日寄り付きで買い
Sell("SW2301新規売", AtMarket);
}


//本日+DIが本日-DIを下抜くとき
If (CrossDown(Value1[0], Value2[0]) and
MarketPosition == 1) Then {

//翌日寄り付きで決済
ExitLong("SW2301買決済", AtMarket);
}


//本日+DIが本日-DIを上抜くとき
If (CrossUp(Value1[0], Value2[0]) and
MarketPosition == -1) Then {

//翌日寄り付きで決済
ExitShort("SW2301売決済", AtMarket);
}

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


+DI, -DIについてはDIPlus()関数、DIMinus()関数というのがあるようなので、それを用います。

ADXRについては関数がないのでADX()関数で代用しています。

2つの違いについてはよく知りません。。




曜日の特定

トレコレさん 作のCurrentWeek()関数は非常に有難いです。

と思って使っていたところに、


高橋謙吾さんがこんな関数 を公開されています。


んんん~~~!


さすがプロ!!


洗練されて無駄がない!!!



For文の繰り返しがない分こちらのほうが処理速度が格段に速そうです。

(MessageLog()関数で試してみてください)