最初にProtraを利用した際に、サンプルの動作確認でエラーが発生し何もわからないので確認を断念した結果が2つありました。
そろそろ理解力もついてきたので、修正してバックテストを試してみます。
Breakout Plus
直近55日間の高値を上抜いたらentry、下抜いたらexit
ソースコード
実行エラーが「0での割り算」だったので、その部分だけケア。何も難しくないです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# Brekout Plus -- 20日ブレークアウトシステム # Copyright 2013 panacoran # This program is licensed under the GPL version 3 or later. # # 直近55日間の高値を上抜いたらentry、下抜いたらexitする。 # 価格は翌日の寄り付きか当日の終値。買い数量は約100万円。 # +5%でポジションを追加する。 # -10%で直近のポジションをロスカットする。 require "TIlib" def Num(price) unit = Unit2(price) if ! (unit * price) return 0 end return (1000000 / (unit * price)) * unit end def CheckEntry return Close > 50 && Volume * Close > 10000 end position_max = 10 if !$HL $HL = {-1}HighLow_new(20) $index = 0 $prices = [position_max] $nums = [position_max] $prev_price = 10000000 else HighLow_next($HL) end high = HighLow_high($HL) low = HighLow_low($HL) if !high || !low return end price = {+1}Open if !price price = Close end num = Num(price) sell = 0 i = 0 while i < $index if Low && Low < $prices[i] * 0.9 sell = sell + $nums[i] $prices[i] = 0 $nums[i] = 0 end i = i + 1 end if $index > 0 && Low && Low < low i = 0 while i < $index if $nums[i] != 0 sell = sell + $nums[i] $prices[i] = 0 $nums[i] = 0 end i = i + 1 end $index = 0 $prev_price = 10000000 end if sell Sell(price, sell) return end if High > $prev_price * 1.05 $prev_price = price if !CheckEntry return end i = 0 while i < $index if $nums[i] == 0 break end i = i + 1 end if i == $index if $index == position_max return end i = $index $index = $index + 1 end $nums[i] = num $prices[i] = price Buy(price, num) return end if $index == 0 && High > high && CheckEntry $prices[0] = $prev_price = price $nums[0] = num $index = 1 Buy(price, num) return end |
バックテスト結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
ファイル: Breakout Plus.pt 株価データ: 日足 銘柄リスト: 日経平均構成銘柄 10/01/05~29/05/15における成績です。 ---------------------------------------- 全トレード数 14331 勝ちトレード数(勝率) 3020(21.07%) 負けトレード数(負率) 11311(78.93%) 全トレード平均利率 -3.34% 勝ちトレード平均利率 7.23% 負けトレード平均損率 -6.16% 勝ちトレード最大利率 180.17% 負けトレード最大損率 -40.56% 全トレード平均期間 47.72 勝ちトレード平均期間 96.85 負けトレード平均期間 34.60 ---------------------------------------- 必要資金 \755,503,000 最大ポジション(簿価) \961,972,200 最大ポジション(時価) \1,226,775,000 純利益 \448,960,400 勝ちトレード総利益 \1,463,526,000 負けトレード総損失 -\1,014,565,000 全トレード平均利益 \31,328 勝ちトレード平均利益 \484,611 負けトレード平均損失 -\89,697 勝ちトレード最大利益 \19,160,200 負けトレード最大損失 -\1,104,000 プロフィットファクター 1.44 最大ドローダウン(簿価) -\116,277,500 最大ドローダウン(時価) -\186,245,000 ---------------------------------------- 現在進行中のトレード数 175 |
利益曲線は次のとおりです。
Channel Breakout
過去20日の高値の逆指値でentry、安値の逆指値でexit
ソースコード
同日売買だけケアしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# Channel Breakout.pt -- 20day Channel Breakout System by Richard Donchian # 過去20日の高値の逆指値でentry、安値の逆指値でexit。 # ただし、終値50円以下、出来高1000万円以下の場合はentryしない。 # 買い数量は約100万円。 # revised by nehori.com require "TIlib" def Num(price) unit = Unit2(price) return (1000000 / (unit * price)) * unit end if !$O $O = {-1}HighLow_new(20) else HighLow_next($O) end if HighLow_high($O) != null if ! $wait // 同日の売買禁止 if !$long && High >= HighLow_high($O) && Close > 50 && Volume * Close > 10000 price = Max(HighLow_high($O), Open) $long = Num(price) Buy(price, $long) $wait = 1 // 翌日まで売買しない end else $wait = $wait - 1 end if ! $wait // 同日の売買禁止 if Low <= HighLow_low($O) && $long price = Min(HighLow_low($O), Open) Sell(price, $long) $wait = 1 // 翌日まで売買しない $long = 0 end else $wait = $wait - 1 end end # Local Variables: # tab-width: 4 # End: |
バックテスト結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
ファイル: Channel Breakout.pt 株価データ: 日足 銘柄リスト: 日経平均構成銘柄 10/01/05~29/05/15における成績です。 ---------------------------------------- 全トレード数 14594 勝ちトレード数(勝率) 5631(38.58%) 負けトレード数(負率) 8963(61.42%) 全トレード平均利率 1.33% 勝ちトレード平均利率 14.02% 負けトレード平均損率 -6.64% 勝ちトレード最大利率 282.17% 負けトレード最大損率 -100.00% 全トレード平均期間 48.88 勝ちトレード平均期間 80.43 負けトレード平均期間 29.05 ---------------------------------------- 必要資金 \164,104,200 最大ポジション(簿価) \189,824,200 最大ポジション(時価) \247,261,500 純利益 \184,166,200 勝ちトレード総利益 \706,553,000 負けトレード総損失 -\522,386,800 全トレード平均利益 \12,619 勝ちトレード平均利益 \125,476 負けトレード平均損失 -\58,283 勝ちトレード最大利益 \2,631,200 負けトレード最大損失 -\997,500 プロフィットファクター 1.35 最大ドローダウン(簿価) -\61,022,960 最大ドローダウン(時価) -\66,191,010 ---------------------------------------- 現在進行中のトレード数 177 |
利益曲線は次のとおりです。
まとめ
今回の修正は、難しい部分はありませんでした。
Protraの欠点として、同一売買ができません(マニュアルには次のように書いてあります)。
成績計算の都合上、同一銘柄を同一日に一回しか売買できません。二回目のBuyやSellの実行はエラーになります。
同日売買が禁止だとすると、「途転買い(ドテン買い)」ができないと思われますが、サンプルでもできることが記載されています。
※ ドテンとは、売りポジションを決済すると同時に、買いポジションを持つこと
ドテン売りは保有株式の売却と空売りを1回のSellで、ドテン買いは空売りの返済と買いを1回のBuyで行ってください
まだドテン売買を使う戦略まで辿り着いてないです。