22銘柄12年✕3→利益!ドンチアン・トレンド・システムをTradingViewで検証

22銘柄12年✕3→利益!ドンチアン・トレンド・システムをTradingViewで検証

・ 1980年代にウォール・ストリート・ジャーナルに取り上げられた投資集団の手法
年利平均80%を、リアルマネーで実現した手法
10年前に出版された本でも有効であるとされた手法
そんな手法が「現在でも通用するのか」がわかります。

10年以上も前に「利益が出る」と紹介された手法が、現在でも通用するのか

この記事は、2007年10月に出版された「伝説のトレーダー集団 タートルズ流投資の魔術」に掲載されている手法を、TradingViewで再現するものです。

  1. ATRチャネル・ブレイクアウト
  2. ボリンジャー・ブレイクアウト
  3. ドンチアン・トレンド・システム ◀ イマココ
  4. 時限退出付きドンチアン・トレンド
  5. ダブル移動平均
  6. トリプル移動平均

22銘柄12年✕3→利益!
ドンチアン・トレンド・システムをTradingViewで検証

  1. タートルズ流 投資の魔術 からの引用
  2. ストラテジーを作成
    1. エントリーとイグジット
  3. バックテスト
    1. テスト1
    2. テスト2
    3. テスト3
    4. テスト結果の比較
  4. 考察
  5. ストラテジーのPineスクリプト
    1. TradingViewでも公開しています!
  6. バックテストならTradingView

1. タートルズ流 投資の魔術 からの引用

まずは、「ドンチアン・トレンド・システム」について書かれている箇所を「伝説のトレーダー集団 タートルズ流投資の魔術」から引用します。

 ここで紹介するドンチアン・トレンド・システムは、5章で説明しているが、わたしたちがタートル時代用いていたものを単純にしたバージョンだ。これは20日ブレイクアウトを仕掛けに、10日ブレイクアウトを手じまいに使用し、350日/25日移動平均をトレンドフィルターとして用いる。

 取引は、速いほうの移動平均が示す方向にのみ行われる。25日移動平均が350日移動平均を上回っていれば、買いもちのみ、25日移動平均が350日移動平均を下回っていれば、売り持ちのみということになる。システムは当初のタートル・システムと同じように2ーATRストップを用いる。

引用元
伝説のトレーダー集団 タートルズ流投資の魔術 (P.167)

この記事は、上記の手法をTradingViewで再現することを目的としたものです。

目次へ

2. ストラテジーを作成

TradingViewストラテジー ドンチアン・トレンド・システム

今回は、各指標について明記されていたため本に掲載されている図と比較することはしていません。パラメーターやコードは「5. ストラテジーのPineスクリプト」をご覧ください。

目次へ

2-1. エントリーとイグジット

買いエントリー

  • 「EMA25 が EMA350 を上回っている + 20日間の最高値をブレイク」で買いエントリー
  • 買い持ちの状態で「10日最安値をブレイク」で決済

※ EMA●●:●●日指数平滑移動平均

TradingViewストラテジー ドンチアン・トレンド・システム 買いシグナルとイグジット

売りエントリー

  • 「EMA25 が EMA350 を下回っている + 20日間の最安値をブレイク」で売りエントリー
  • 売り持ちの状態で「10日最高値をブレイク」で決済

※ EMA●●:●●日指数平滑移動平均

TradingViewストラテジー ドンチアン・トレンド・システム 売りシグナルとイグジット

今回は、なんといっても取引回数が大幅に増えています。これが全体の成績にどのような影響を与えるのか。確かめるには試してみるしかないですね。

3. バックテスト

同じ条件で手法を比べるために、今回も、以下の「基本条件」でテストしていきます。

バックテストの基本条件

  • 期間

    • 2005年1月1日 ~ 2017年12月31日
    • 12年間
  • 銘柄

    • 為替(5):
      USDJPY、EURJPY、GBPJPY、CHFJPY、CADJPY
    • 株価指数(5):
      UKY日経225、DJI NYダウ、DAXドイツ、UKXイギリスFTSE、HSI香港ハンセン
    • 日本株(5):
      6098リクルート、4452花王、5711三菱マテリアル、7201日産、9984ソフトバンクグループ
    • 米株(5):
      AAPLアップル、AXPアメリカン・エクスプレス、BAボーイング、JNJジョンソン・エンド・ジョンソン、MCDマクドナルド
    • 海外商品(5):
      金、白金、原油、コーン、大豆
  • その他

    • 資金管理:単利

手法は、市場との相性があるケースも多いので、主要な各市場から5銘柄ずつピックアップしてテストしています。

TradingView のバックテストの資金管理は単利で検証するのが良いと思います。実戦向きな設定がないので。

目次へ

3-1. テスト1

まずは、いつものように「こうだっただろう」設定でテストをしていきます。

テスト1設定

DC-en DC-ex EMA-m EMA-l Losscut Pyramiding
20 10 25 350 2-ATR None

テスト1結果

損益 最大DD 取引数 勝数 勝率 RR比 勝ち保有 負け保有
Total 2043 773 37.84 2.200
USDJPY 11.97 15.49 89 25 28.09 2.971 32 10
EURJPY 12.39 34.69 89 28 31.46 2.391 29 10
GBPJPY 88.09 20.92 82 40 48.78 2.125 26 11
CHFJPY 3.29 12.29 89 31 34.83 1.948 27 9
CADJPY 3.59 35.85 85 29 34.12 2.012 29 10
NKY 11113.52 3743.34 76 35 46.05 2.135 30 10
DJI 8294.76 2905.75 88 32 36.36 3.035 34 9
DAX 2261.61 3540.36 89 31 34.83 2.322 30 10
UKX -2364.9 3704.3 94 33 35.11 1.266 27 9
HSI 13234.81 5877.74 84 39 46.43 1.783 26 8
6098 659 248 11 4 59.09 4.433 43 11
4452 1753 1085 84 32 38.1 2.213 25 9
5711 6075 1250 69 27 39.13 3.056 31 11
7201 -439.29 739.1 82 26 31.71 1.688 27 9
9984 4192 1920 73 30 41.1 2.168 29 10
AAPL 85.64 23.38 81 37 45.68 2.399 31 8
AXP -6.74 30.85 93 29 31.18 2.059 30 10
BA 189.03 50.53 85 33 38.82 3.817 29 9
JNJ 7.41 24.87 84 31 36.9 1.87 28 9
MCD 12.99 26.03 87 33 37.93 1.863 30 8
GOLD 32750 21400 82 40 48.78 1.342 25 9
PLATINUM 26605 30440 85 39 35.29 2.275 28 9
WTI 42200 69770 87 33 37.93 2.089 27 8
CORN -4625 20625 89 24 26.97 2.44 30 9
SOY BEANS 3237.05 30600 86 32 37.21 1.75 27 9

※ 「勝ち保有」「負け保有」は、保有期間(日)の平均

このシステムは取引回数が圧倒的です。総取引回数が 2043回で、「ボリンジャー・ブレイクアウト」の 159回、「ATRチャネル・ブレイクアウト」の 383回と比べても "ダントツ" です。

勝率やRR比は、「それぞれで比較しても分かりづらい」ので、「破産の確率」や「期待値」、「収益の見込み」を算出して比較します。本来は他にもたくさんの「比較する要素」があるのですが、TradingView のバックテストだと、このあたりが(たぶん)限界です。手軽さを考えると十分すぎるくらいですが。

テスト1統計

破産の確率 0.01%
期待値/リスク 0.21
収益の見込み 429.89

※ 破産の確率は、損失の許容=2%で算出

※ 期待値/リスク = 勝率 ✕ RR比 -|1- 勝率|

※ 収益の見込み = 期待値/リスク ✕ 取引回数

実際に算出してみると、以下のようなことがわかりますね。

  • 破産の心配はない
  • 期待値はこれまでのテストでもっとも低い
  • しかし、収益の見込みはこれまでのテストでもっとも多い

すこし変数を調整してバックテストをしてみます。

目次へ

3-2. テスト2

以前、「ロスカットは必ずしも有効ではない」という記事を書いたことがあるのですが、それに習って「ロスカットなし」のテストをしてみます。

テスト2設定

DC-en DC-ex EMA-m EMA-l Losscut Pyramiding
20 10 25 350 None None

テスト2結果

損益 最大DD 取引数 勝数 勝率 RR比 勝ち保有 負け保有
Total 1993 771 38.69 2.07
USDJPY 15.02 19.04 89 26 30.23 2.784 32 11
EURJPY 10.17 41.29 87 29 33.33 2.147 30 11
GBPJPY 98.17 13.53 80 40 50 2.279 26 12
CHFJPY -1.68 13.85 90 31 34.44 1.866 27 10
CADJPY 5.07 40.77 81 29 35.8 1.901 31 11
NKY 9679.24 4072.17 76 35 46.05 1.93 30 10
DJI 9088.3 2292.62 84 32 38.1 3 35 10
DAX 2014.5 4051.45 86 31 36.05 2.142 31 11
UKX -3025.7 4818.1 90 33 36.67 1.1 27 11
HSI 10194.4 8126.61 84 39 46.43 1.546 26 9
6098 596 260 11 4 36.36 3.932 43 11
4452 1292 1217 81 32 39.51 1.863 25 11
5711 6210 1590 67 28 41.79 2.723 31 12
7201 -504.1 834.1 80 27 33.75 1.492 27 10
9984 3725 2076 73 31 51.03 1.922 29 11
AAPL 107.75 18.85 75 38 50.67 2.506 30 11
AXP -1.42 30.69 90 29 32.22 2.073 30 11
BA 199.95 42.04 79 34 43.04 3.492 30 11
JNJ 3.2 21.45 83 31 37.35 1.742 28 10
MCD 15.65 25.65 85 33 38.83 1.845 31 9
GOLD 38340 20840 80 40 50 1.342 25 11
PLATINUM 33240 34585 83 30 36.14 2.307 29 10
WTI 18470 79120 86 33 38.37 1.775 28 9
CORN -5650 19937.5 87 24 27.59 2.32 30 11
SOY BEAN -4012.5 34475 86 32 37.21 1.616 27 9

※ 「勝ち保有」「負け保有」は、保有期間(日)の平均

ロスカットがない分、取引回数が減っています。勝率が上がって、RR比は低下。

テスト2統計

破産の確率 0.01%
期待値/リスク 0.187
収益の見込み 372.6

※ 破産の確率は、損失の許容=2%で算出

※ 期待値/リスク = 勝率 ✕ RR比 -|1- 勝率|

※ 収益の見込み = 期待値/リスク ✕ 取引回数

収益の見込みを算出すると、テスト1と比較して「悪化した」ことが分かりますね。ドンチアン・トレンド・システムにおいては「ロスカットは有効(かもしれない)」ということが言えそうです。

目次へ

3-3. テスト3

最後に、テスト1に「ピラミッティングを加えたシステム」のバックテストをしてみます。

テスト3設定

DC-en DC-ex EMA-m EMA-l Losscut Pyramiding
20 10 25 350 2-ATR 1-ATR 上限4

「エントリーした価格からプラス方向にATRの1倍動いたらポジションを追加する」というものです。最初のものを含めて4回のエントリーが上限です。タートルズの用語で言うと「ロード」の状態ですね。

テスト3結果

損益 最大DD 取引数 勝数 勝率 RR比 勝ち保有 負け保有
Total 5187 1916 36.94% 2.23
USDJPY 51.9 42.89 204 70 34.31 2.492 31 9
EURJPY -19.47 75.98 215 69 32.09 1.961 25 9
GBPJPY 77.88 82.57 237 87 36.71 2.114 24 8
CHFJPY -12.34 67.28 211 65 30.81 2.109 27 8
CADJPY 0.4 86.21 204 69 33.82 1.946 28 9
NKY 24196.85 7703.55 212 82 38.68 2.608 28 9
DJI 29991.63 5830.94 217 102 27 2.564 29 8
DAX 9162.11 5504.51 218 90 41.28 2.06 28 8
UKX -7690.8 8475.6 234 73 31.2 1.222 23 8
HSI 3538.84 32801.44 235 95 40.43 1.543 24 8
6098 2752 454 30 10 33.33 7.354 55 9
4452 1888 2858 213 75 35.21 2.09 22 9
5711 15660 2870 191 80 41.88 2.59 27 9
7201 -2447.5 2660.4 217 60 27.65 1.483 23 8
9984 7991 5140 200 79 39.5 2.178 25 10
AAPL 247.16 39.34 235 111 47.23 2.455 27 9
AXP -26.53 100.92 227 76 33.48 1.789 28 9
BA 518.54 77.84 223 90 40.36 3.857 27 9
JNJ 49.57 47.19 192 71 36.98 2.246 29 9
MCD 75.7 69.33 218 80 36.7 2.332 29 8
GOLD 25220 83980 221 95 42.99 1.437 23 9
PLATINUM 42340 99125 222 79 35.59 2.115 25 8
WTI 138170 170150 211 74 35.07 2.544 28 9
CORN 20900 34500 202 61 30.2 2.754 29 8
SOY BEAN 50212.5 50712.5 198 73 36.87 2.17 27 9

※ 「勝ち保有」「負け保有」は、保有期間(日)の平均

テスト3統計

破産の確率 0.02%
期待値/リスク 0.19
収益の見込み 1009.2

※ 破産の確率は、損失の許容=2%で算出

※ 期待値/リスク = 勝率 ✕ RR比 -|1- 勝率|

※ 収益の見込み = 期待値/リスク ✕ 取引回数

ピラミッティングはかなり効果的なようです。

  • 「収益の見込み」がテスト1の倍以上に
  • 「期待値」は低下、「取引回数」が大幅増
  • 破産の危険が少し上昇
  • 「期待値」が 0.2 くらいになると「破産の確率」が顕在化する?(単利・仮説)

目次へ

3-4. テスト結果の比較

さて、今回もテスト結果をまとめて比較してみたいと思います。

取引回数 勝率 RR比 破産の確率 期待値 収益の見込み
テスト1 2043 37.84 2.200 0.01 0.210 429.88
テスト2 1993 38.69 2.070 0.01 0.187 372.60
テスト3 5187 36.94 2.230 0.02 0.190 1009.02
  • もっとも成績が良いのはテスト3
  • 手法の良し悪しは「期待値 ✕ 取引回数」
  • 期待値の低下 ≒ 破産の確率の上昇
  • RR比よりも勝率のほうが「破産の確率」に及ぼす影響が強そう

こんなところでしょうか。以前もやったことのあるテストですが、あらためて行ってみると、また新しい発見がでてきます。ここから考えられそうなことを少し書き出してみようと思います。

目次へ

4. 考察

ここまで、「儲かる」「勝てる」という結果ばかりで思わず忘れてしまいそうですが、(当然)いくつかの注意点もあります。大事な、決して忘れてはいけない注意点です。

  • 破産の確率が「1トレードのリスクを全資金の2%」にしたものだということ
  • ピラミッティングは「やれば良い」というものでもない
  • 勝てるシステムは絶妙なバランスのもとに成り立っている

この辺りがわからない方は、わかるまでやらないほうが良いです。
何かひとつでも崩れたら、あっという間に破産してしまう――
勝てるシステムは、そんな絶妙なバランスのもとに成り立っています。別に、特別むずかしいことではないのですが、知らないとムリです。センスとかじゃなく「知ってるか知らないか」だと思いますので。

さて、今回のバックテストで強く感じたのは、次の点でした。

  • 期待値よりも取引回数の方が増やしやすい
    • 期待値(勝率もしくはRR比)を上げるの大変
    • 取引回数を増やすのはそこまで大変じゃない
  • つまり、儲けたいなら取引回数を増やす方が良い
    • 短期のシステムにする
    • 銘柄数を増やす
    • 足種を短期間のものにする

リスクと資金の管理は必須です。あとは生活との相談。そして、ルールを遵守すること。

目次へ

5. ストラテジーのPineスクリプト

今回行ったバックテストに用いたストラテジーのコード(Pineスクリプト)を公開します。販売や二次配布以外は自由にご利用いただいて差し支えありません。ご自由にお使いください!

Pineスクリプト:Strategy Turtle Donchian Trend System

//@version=3
strategy("Strategy Turtle Donchian Trend System"
  ,default_qty_type=strategy.fixed
  ,default_qty_value=1
  ,pyramiding=4
  ,overlay=true)



src = close
len_dc_entry = input(20   ,minval=1 ,title="length of dc entry")
len_dc_exit  = input(10   ,minval=1 ,title="length of dc exit")
len_ema_m    = input(25   ,minval=1 ,title="length of middle ema")
len_ema_l    = input(350  ,minval=1 ,title="length of long ema")
SO_bool  = input(false,type=bool    ,title="loss cut")
SO_len   = input(20   ,type=integer ,minval=1 ,title="loss cut ATR length")
SO_N     = input(2    ,type=float   ,minval=0.5 ,title="loss cut ATR*N")
MAX_N    = input(1    ,type=integer ,minval=1 ,maxval=4 ,title="maximun num of unit")
LO_len   = input(20   ,type=integer ,minval=1 ,title="pyramiding ATR length")
LO_N     = input(1    ,type=float   ,minval=0.5 ,title="pyramiding ATR*N")
Tm_bool  = input(false,type=bool    ,title="timed exit")
Tm_len   = input(80   ,type=integer ,minval=1 ,title="timed exit length")
fromYear = input(2005 ,type=integer ,minval=1900 ,title="test start")
endYear  = input(2017 ,type=integer ,minval=1900 ,title="test end")

isWork   = timestamp(fromYear ,1 ,1 ,00 ,00) <= time and time < timestamp(endYear+1 ,1 ,1 ,00 ,00) 

upper_en = highest(high ,len_dc_entry)[1]
upper_ex = highest(high ,len_dc_exit)[1]
lower_en = lowest(low ,len_dc_entry)[1]
lower_ex = lowest(low ,len_dc_exit)[1]
ema_m    = ema(src ,len_ema_m)
ema_l    = ema(src ,len_ema_l)

atr_SO_ = ema(tr ,SO_len)
atr_LO_ = ema(tr ,LO_len)
atr_SO = atr_SO_*SO_N
atr_LO = atr_LO_*LO_N



countTradingDays     = na
countNonTradingDays  = na
countTradingDays    := strategy.position_size==0 ? 0 : countTradingDays[1] + 1 
countNonTradingDays := strategy.position_size!=0 ? 0 : countNonTradingDays[1] + 1
entry1   = close
entry2   = close
entry3   = close
entry4   = close
entry1  := strategy.position_size==0 ? na : entry1[1]
entry2  := strategy.position_size==0 ? na : entry2[1]
entry3  := strategy.position_size==0 ? na : entry3[1]
entry4  := strategy.position_size==0 ? na : entry4[1]
lo2      = close
lo3      = close
lo4      = close
lo2     := strategy.position_size==0 ? na : lo2[1]
lo3     := strategy.position_size==0 ? na : lo3[1]
lo4     := strategy.position_size==0 ? na : lo4[1]



L_EntrySig = strategy.position_size==0 and high >= upper_en and ema_m >= ema_l
S_EntrySig = strategy.position_size==0 and low  <= lower_en and ema_m <= ema_l
lo_sig2    = strategy.position_size>0 ? lo2 < high : strategy.position_size<0 ? lo2 > low : na
lo_sig3    = strategy.position_size>0 ? lo3 < high : strategy.position_size<0 ? lo3 > low : na
lo_sig4    = strategy.position_size>0 ? lo4 < high : strategy.position_size<0 ? lo4 > low : na
losscut    = close
losscut   := SO_bool==false ? na
          :  L_EntrySig ? close - atr_SO
          :  S_EntrySig ? close + atr_SO
          :  strategy.position_size>0 and (lo_sig2 or lo_sig3 or lo_sig4) ? close - atr_SO
          :  strategy.position_size<0 and (lo_sig2 or lo_sig3 or lo_sig4) ? close + atr_SO
          :  strategy.position_size!=0 ? losscut[1] 
          :  na
ExitPrice  = close
ExitPrice := L_EntrySig or strategy.position_size>0 ? SO_bool ? max(losscut ,lower_ex) : lower_ex
          :  S_EntrySig or strategy.position_size<0 ? SO_bool ? min(losscut ,upper_ex) : upper_ex
          :  na



if(strategy.position_size != 0)
    
    L_ExitSig = (low  <= lower_ex or S_EntrySig) and strategy.position_size > 0
    S_ExitSig = (high >= upper_ex or L_EntrySig) and strategy.position_size < 0
    TimedSig  = countTradingDays > Tm_len and Tm_bool
    
    strategy.close_all(when = L_ExitSig or S_ExitSig or TimedSig)
    
    if(L_ExitSig or S_ExitSig)
        entry1  := na
        entry2  := na
        entry3  := na
        entry4  := na
        lo2     := na
        lo3     := na
        lo4     := na
        losscut := na



if(strategy.position_size > 0)
    
    strategy.exit("L-Entry1" ,stop=ExitPrice)
    
    if(entry2!=na) 
        strategy.exit("L-Entry2" ,stop=ExitPrice)
    if(entry3!=na) 
        strategy.exit("L-Entry3" ,stop=ExitPrice)
    if(entry4!=na) 
        strategy.exit("L-Entry4" ,stop=ExitPrice)

    if(lo_sig2 and MAX_N >= 2)
        lo2 := na
        if(SO_bool)
            strategy.entry("L-Entry2" ,strategy.long ,stop=ExitPrice ,comment="L-Entry2")
            strategy.exit("L-Entry1"  ,stop=ExitPrice)
        else
            strategy.entry("L-Entry2" ,strategy.long ,comment="L-Entry2")
    if(lo_sig3 and MAX_N >= 3)
        lo3 := na
        if(SO_bool)
            strategy.entry("L-Entry3" ,strategy.long ,stop=ExitPrice ,comment="L-Entry3")
            strategy.exit("L-Entry2"  ,stop=ExitPrice)
            strategy.exit("L-Entry1"  ,stop=ExitPrice)
        else
            strategy.entry("L-Entry3" ,strategy.long ,comment="L-Entry3")
    if(lo_sig4 and MAX_N >= 4)
        lo4 := na
        if(SO_bool)
            strategy.entry("L-Entry4" ,strategy.long ,stop=ExitPrice ,comment="L-Entry4")
            strategy.exit("L-Entry3"  ,stop=ExitPrice)
            strategy.exit("L-Entry2"  ,stop=ExitPrice)
            strategy.exit("L-Entry1"  ,stop=ExitPrice)
        else
            strategy.entry("L-Entry4" ,strategy.long ,comment="L-Entry4")



if(strategy.position_size < 0)
    
    strategy.exit("S-Entry1" ,stop=ExitPrice)
    
    if(entry2!=na) 
        strategy.exit("S-Entry2" ,stop=ExitPrice)
    if(entry3!=na) 
        strategy.exit("S-Entry3" ,stop=ExitPrice)
    if(entry4!=na) 
        strategy.exit("S-Entry4" ,stop=ExitPrice)

    if(lo_sig2 and MAX_N >= 2)
        lo2 := na
        if(SO_bool)
            strategy.entry("S-Entry2" ,strategy.short ,stop=ExitPrice ,comment="S-Entry2")
            strategy.exit("S-Entry1"  ,stop=ExitPrice)
        else
            strategy.entry("S-Entry2" ,strategy.short ,comment="S-Entry2")
    if(lo_sig3 and MAX_N >= 3)
        lo3 := na
        if(SO_bool)
            strategy.entry("S-Entry3" ,strategy.short ,stop=ExitPrice ,comment="S-Entry3")
            strategy.exit("S-Entry2"  ,stop=ExitPrice)
            strategy.exit("S-Entry1"  ,stop=ExitPrice)
        else
            strategy.entry("S-Entry3" ,strategy.short ,comment="S-Entry3")
    if(lo_sig4 and MAX_N >= 4)
        lo4 := na
        if(SO_bool)
            strategy.entry("S-Entry4" ,strategy.short ,stop=ExitPrice ,comment="S-Entry4")
            strategy.exit("S-Entry3"  ,stop=ExitPrice)
            strategy.exit("S-Entry2"  ,stop=ExitPrice)
            strategy.exit("S-Entry1"  ,stop=ExitPrice)
        else
            strategy.entry("S-Entry4" ,strategy.short ,comment="S-Entry4")



if((L_EntrySig or S_EntrySig) and isWork)
    countTradingDays := 0
    entry1           := close
    
    if(L_EntrySig)
        if(SO_bool)
            strategy.entry("L-Entry1" ,strategy.long ,stop=ExitPrice ,comment="L-Entry1")
        else
            strategy.entry("L-Entry1" ,strategy.long ,comment="L-Entry1")
        lo2 := MAX_N >= 2 ? close + atr_LO     : na
        lo3 := MAX_N >= 3 ? close + atr_LO * 2 : na
        lo4 := MAX_N >= 4 ? close + atr_LO * 3 : na

    if(S_EntrySig)    
        if(SO_bool)
            strategy.entry("S-Entry1" ,strategy.short ,stop=ExitPrice ,comment="S-Entry1")
        else
            strategy.entry("S-Entry1" ,strategy.short ,comment="S-Entry1")
        lo2  := MAX_N >= 2 ? close - atr_LO     : na
        lo3  := MAX_N >= 3 ? close - atr_LO * 2 : na
        lo4  := MAX_N >= 4 ? close - atr_LO * 3 : na
    
    
plot(strategy.position_size ,transp=0 ,title="保有ポジションの数")
plot(strategy.openprofit    ,transp=0 ,title="未決済の損益")
plot(strategy.netprofit     ,transp=0 ,title="決済済みの損益")
plot(strategy.closedtrades  ,transp=0 ,title="決済済み取引数")
plot(countTradingDays       ,transp=0 ,title="取引日数")
plot(countNonTradingDays    ,transp=0 ,title="ノンポジ日数")
plot(entry1    ,title="entry1"    ,color=blue ,transp=0 ,style=linebr)
plot(lo2       ,title="lo2"       ,color=red  ,transp=0 ,style=linebr)
plot(lo3       ,title="lo3"       ,color=red  ,transp=0 ,style=linebr)
plot(lo4       ,title="lo4"       ,color=red  ,transp=0 ,style=linebr)
plot(ExitPrice ,title="ExitPrice" ,color=red  ,transp=0 ,style=linebr)
plot(atr_SO    ,transp=0 ,title="ATR_SO")
plot(atr_LO    ,transp=0 ,title="ATR_LO")
// plot(strategy.max_drawdown  ,transp=50 ,title="最大DD")
// plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)

p1 = plot(ema_m ,color=#303F9F ,title="ema_m" ,style=line ,linewidth=1, transp=0)
p2 = plot(ema_l ,color=#4CAF50 ,title="ema_l" ,style=line ,linewidth=1, transp=0)
fill(p1 ,p2 ,color=#2196F3 ,title="fill" ,transp=80)

p3 = plot(lower_en ,color=gray ,title="lower_entry" ,style=linebr ,linewidth=1 ,transp=40)
p4 = plot(upper_en ,color=gray ,title="upper_entry" ,style=linebr ,linewidth=1 ,transp=40)
fill(p3 ,p4 ,color=gray ,title="fill" ,transp=90)

plot(strategy.position_size>0 ? lower_ex : na ,color=red  ,title="lower_exit"  ,style=linebr ,linewidth=1 ,transp=30)
plot(strategy.position_size<0 ? upper_ex : na ,color=red  ,title="upper_exit"  ,style=linebr ,linewidth=1 ,transp=30)

5-1. TradingViewでも公開しています!

TradingView で ストラテジー「Donchian Trend System」を見つける

TradingView のインジケーターの検索で「donchian trend system」と検索するとでてきます。上記のコードと同じストラテジーを使用することができます。

目次へ

TradingViewのバックテストは簡単

6. バックテストならTradingView

TradingViewのテストは大変便利で、かなり自由の効くバックテストを短時間で簡単に、価格データを用意することなく豊富な銘柄と足種を対象に行うことができます。

一方で、その簡便さと引き換えに、TradingViewではできないバックテストも多くあります。

たとえば「分散投資」や「資金管理」があげられますが、これらは投資において非常に重要な要素でもあり、これらを含めたバックテストをするならリアルさが不可欠です。こういったバックテストをするためには、やはりPythonなどのプログラミング言語で自作していくしかないと考えています。

とはいえ、TradingViewが便利であることは間違いなく、最近では、手法の検証はTradingViewで行い、良い手法が見つかったら更に詳細なテストをPythonで行うようにしています。できるものはTradingViewでサクサクやってしまいます。

Back to Top

Investment Tech Hack

Sorry... doesn't support your browser

To get the best possible experience using our site we recommend that you upgrade to a modern web browser. Investment Tech Hackではご利用中のブラウザサポートはしていません。
Internet Explorerのアップグレード行う、もしくはその他のブラウザを使用しての閲覧をお願いします。