TradingView:バックテスト(Strategy)の Pineスクリプトサンプルまとめ

TradingView:バックテスト(Strategy)の Pineスクリプトサンプルまとめ

TradingView(トレーディングビュー)の Pineスクリプトでつくる「Strategy(バックテスト)」のよく使う組み合わせをまとめてみました(主に自分用)。どれもコピペで機能をつけ加えることができる簡単なものです。

今後も、新たに見つけたり思いついたものがあれば、ここに加えていく予定です!

この記事でご紹介するコードのStrategy()は、すべて次のようにしています。

Strategy()は、TradingViewのバックテストのプログラムにおいて、必ず最初に記述しなければならない関数です。

Pineスクリプト

//@version=3
strategy("___TITLE___"
  , default_qty_type = strategy.fixed
  , default_qty_value = 1
  , pyramiding = 4
  , overlay = true )

シンプルな手法の成果をみたい場合は、default_qty_type = strategy.fixeddefault_qty_value = 1とすることで「値幅を基準にした成績」を得ることができます。また、ピラミッティングはタートルズと同じく最大4ユニットまでしか行わないため、pyramiding = 4としています。

TradingView:Strategy(バックテスト)のサンプルTip集

  1. バックテストの期間を指定する
  2. 取引日数を数える
  3. エントリーした価格からラインを引く
  4. 損切りやピラミッティング+価格にラインを引く
  5. タートルズの資金管理

1.バックテストの期間を指定する

デフォルトでは全期間(TradingView基準)で行われるバックテストの期間を、区切る(指定する)ことができるようになります。

TradingView バックテストの期間を指定する

Pineスクリプト

fromYear = input(2017 ,type=integer ,minval=1900 ,title="test start")
endYear  = input(2018 ,type=integer ,minval=1900 ,title="test end")
isWork   = timestamp(fromYear ,1 ,1 ,00 ,00) <= time and time < timestamp(endYear+1 ,1 ,1 ,00 ,00) 
posi     = strategy.position_size != 0

L_EntrySig = isWork and __YOUR_PROGRAM__
S_EntrySig = isWork and __YOUR_PROGRAM__

if(posi)
    L_ExitSig = __YOUR_PROGRAM__
    S_ExitSig = __YOUR_PROGRAM__
    strategy.close_all(when = L_ExitSig or S_ExitSig or not isWork)

if(L_EntrySig)
    strategy.entry("L-Entry" ,strategy.long ,comment="L-Entry1")

if(S_EntrySig)    
    strategy.entry("S-Entry" ,strategy.short ,comment="S-Entry1")
    
bgcolor(color
  = not isWork ? #aaaaaa
  : na
  ,transp=70 ,title="背景色")

__YOUR_PROGRAM__に任意のコードを入れる必要があります

目次へ

2.取引日数を数える

取引日数に関連したスキームを作成する場合につかいます。

Pineスクリプト

countTradingDays     = na
countNonTradingDays  = na
countTradingDays    := not posi ? 0 : countTradingDays[1]    + 1 
countNonTradingDays := posi     ? 0 : countNonTradingDays[1] + 1

// plot(countTradingDays    ,transp=0 ,title="取引日数")
// plot(countNonTradingDays ,transp=0 ,title="ノンポジ日数")

3.エントリーした価格にラインを引く

「どこで利益が発生したのか」が、より分かりやすくなります。

TradingView エントリーした価格にラインを引く

Pineスクリプト

posi_l = strategy.position_size > 0
posi_s = strategy.position_size < 0
posi   = strategy.position_size != 0

entry1  = close
entry1 := not posi ? na : L_EntrySig[1] or S_EntrySig[1] ? open : entry1[1]

L_EntrySig = __YOUR_PROGRAM__
S_EntrySig = __YOUR_PROGRAM__

if(L_EntrySig)
      strategy.entry("L-Entry1" ,strategy.long ,comment="L-Entry1")

if(S_EntrySig)    
      strategy.entry("S-Entry1" ,strategy.short ,comment="S-Entry1")

plot(entry1 ,title="entry1" ,color=blue ,transp=0 ,style=linebr)

__YOUR_PROGRAM__に任意のコードを入れる必要があります

目次へ

4.ピラミッティングや損切り+価格にラインを引く

TradingView 損切りやピラミッティング+価格にラインを引く

Pineスクリプト

MAX_N   = input(4    ,type=integer ,minval=1 ,maxval=4 ,title="maximun num of unit")
SO_bool = input(true ,title="loss cut")

posi_l = strategy.position_size > 0
posi_s = strategy.position_size < 0
posi   = strategy.position_size != 0

entry1   = close
entry2   = close
entry3   = close
entry4   = close
entry1  := not posi ? na : entry1[1]
entry2  := not posi ? na : entry2[1]
entry3  := not posi ? na : entry3[1]
entry4  := not posi ? na : entry4[1]

lo2      = close
lo3      = close
lo4      = close
lo2     := not posi ? na : lo2[1]
lo3     := not posi ? na : lo3[1]
lo4     := not posi ? na : lo4[1]

L_EntrySig = __YOUR_PROGRAM__
S_EntrySig = __YOUR_PROGRAM__
    
lo_sig2 = posi_l ? lo2 < high : posi_s ? lo2 > low : na
lo_sig3 = posi_l ? lo3 < high : posi_s ? lo3 > low : na
lo_sig4 = posi_l ? lo4 < high : posi_s ? lo4 > low : na

losscut   = close
losscut  := SO_bool==false ? na
         :  L_EntrySig and not posi ? __YOUR_PROGRAM__
         :  S_EntrySig and not posi ? __YOUR_PROGRAM__
         :  posi_l and (lo_sig2 or lo_sig3 or lo_sig4) ? __YOUR_PROGRAM__
         :  posi_s and (lo_sig2 or lo_sig3 or lo_sig4) ? __YOUR_PROGRAM__
         :  posi ? losscut[1] 
         :  not posi ? na
         :  na
          
if(posi)
    L_ExitSig = __YOUR_PROGRAM__
    S_ExitSig = __YOUR_PROGRAM__
    strategy.close_all(when = L_ExitSig or S_ExitSig)
    if(L_ExitSig or S_ExitSig)
        entry1  := na
        entry2  := na
        entry3  := na
        entry4  := na
        lo2     := na
        lo3     := na
        lo4     := na
        losscut := na

if(posi_l)
    strategy.exit("L-Entry1" ,stop=losscut)
    if(entry2!=na) 
        strategy.exit("L-Entry2" ,stop=losscut)
    if(entry3!=na) 
        strategy.exit("L-Entry3" ,stop=losscut)
    if(entry4!=na) 
        strategy.exit("L-Entry4" ,stop=losscut)
    if(lo_sig2 and MAX_N >= 2)
        lo2 := na
        if(SO_bool)
            strategy.entry("L-Entry2" ,strategy.long ,stop=losscut ,comment="L-Entry2")
            strategy.exit("L-Entry1" ,stop=losscut)
        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=losscut ,comment="L-Entry3")
            strategy.exit("L-Entry2"  ,stop=losscut)
            strategy.exit("L-Entry1"  ,stop=losscut)
        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=losscut ,comment="L-Entry4")
            strategy.exit("L-Entry3"  ,stop=losscut)
            strategy.exit("L-Entry2"  ,stop=losscut)
            strategy.exit("L-Entry1"  ,stop=losscut)
        else
            strategy.entry("L-Entry4" ,strategy.long ,comment="L-Entry4")

if(posi_s)
    strategy.exit("S-Entry1" ,stop=losscut)
    if(entry2!=na) 
        strategy.exit("S-Entry2" ,stop=losscut)
    if(entry3!=na) 
        strategy.exit("S-Entry3" ,stop=losscut)
    if(entry4!=na) 
        strategy.exit("S-Entry4" ,stop=losscut)
    if(lo_sig2 and MAX_N >= 2)
        lo2 := na
        if(SO_bool)
            strategy.entry("S-Entry2" ,strategy.short ,stop=losscut ,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=losscut ,comment="S-Entry3")
            strategy.exit("S-Entry2"  ,stop=losscut)
            strategy.exit("S-Entry1"  ,stop=losscut)
        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=losscut ,comment="S-Entry4")
            strategy.exit("S-Entry3"  ,stop=losscut)
            strategy.exit("S-Entry2"  ,stop=losscut)
            strategy.exit("S-Entry1"  ,stop=losscut)
        else
            strategy.entry("S-Entry4" ,strategy.short ,comment="S-Entry4")
    
if(L_EntrySig)
    entry1 := close
    if(SO_bool)
        strategy.entry("L-Entry1" ,strategy.long ,stop=losscut ,comment="L-Entry1")
    else
        strategy.entry("L-Entry1" ,strategy.long ,comment="L-Entry1")
    lo2 := MAX_N >= 2 ? __YOUR_PROGRAM__ : na
    lo3 := MAX_N >= 3 ? __YOUR_PROGRAM__ : na
    lo4 := MAX_N >= 4 ? __YOUR_PROGRAM__ : na

if(S_EntrySig)    
    entry1 := close
    if(SO_bool)
        strategy.entry("S-Entry1" ,strategy.short ,stop=losscut ,comment="S-Entry1")
    else
        strategy.entry("S-Entry1" ,strategy.short ,comment="S-Entry1")
    lo2  := MAX_N >= 2 ? __YOUR_PROGRAM__ : na
    lo3  := MAX_N >= 3 ? __YOUR_PROGRAM__ : na
    lo4  := MAX_N >= 4 ? __YOUR_PROGRAM__ : na
    
    
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(losscut ,title="losscut" ,color=red  ,transp=0 ,style=linebr)

__YOUR_PROGRAM__に任意のコードを入れる必要があります

目次へ

5.タートルズの資金管理

タートルズの資金管理をさまざまな角度から検証できるようになります。

  • タートルズの資金管理の有無
  • 単利か、タートルズの複利か
  • 未決済の損益を含めるか
  • 年ごとの複利

勝率は難しいですが、資金管理を行うことでRR比を改善することができます。「値幅のRR比」と「損益のRR比」の違いによるものです。この検証を TradingView で気軽に行うことができるのは非常にありがたい。

Pineスクリプト

cash_bool = input(true ,title="amount management")
manage_op = input("turtle compound" ,title="amount management type" ,options=["turtle compound" ,"simple"])
incl_open = input(true ,title="unit calc include open profit")
y_reset   = input(true ,title="yearly DD reset")
lot       = input(100  ,title="lot" ,minval=1)
currency  = input("None" ,title="currency" ,options=["None" ,"USD" ,"EUR" ,"GBP" ,"AUD" ,"CAD" ,"CHF"])

atr = ema(tr ,20)

sc1(currency) =>
     currency=="None" ? 1 :
     currency=="USD" ? security("usdjpy" ,"D" ,close)[1] :
     currency=="EUR" ? security("eurjpy" ,"D" ,close)[1] :
     currency=="GBP" ? security("gbpjpy" ,"D" ,close)[1] :
     currency=="AUD" ? security("audjpy" ,"D" ,close)[1] :
     currency=="CAD" ? security("cadjpy" ,"D" ,close)[1] :
     currency=="CHF" ? security("chfjpy" ,"D" ,close)[1] :
     na

balance = strategy.initial_capital + strategy.netprofit
maximum_balance   = na
maximum_balance  := y_reset and year > year[1] ? balance
                 :  balance > nz(maximum_balance[1]) ? balance : nz(maximum_balance[1])

unit_source  = incl_open==false ? balance
             : balance + strategy.openprofit
maximum_source  = na
maximum_source := y_reset and year > year[1] ? unit_source
               :  unit_source > nz(maximum_source[1]) ? unit_source : nz(maximum_source[1])

dd = maximum_source - unit_source
unit_value = manage_op=="turtle compound" and dd==0 ? unit_source / 100
           : manage_op=="turtle compound" and dd > 0 ? (maximum_source - dd * 2) / 100
           : strategy.initial_capital / 100

amount  = na
amount := cash_bool ? round(unit_value / (atr * sc1(currency)) / lot) * lot : na

posi_l = strategy.position_size > 0
posi_s = strategy.position_size < 0
posi   = strategy.position_size != 0

L_EntrySig = __YOUR_PROGRAM__
S_EntrySig = __YOUR_PROGRAM__

if(posi)
    L_ExitSig = __YOUR_PROGRAM__
    S_ExitSig = __YOUR_PROGRAM__
    
    strategy.close_all(when = L_ExitSig or S_ExitSig)

if(L_EntrySig)
    strategy.entry("L-Entry1" ,strategy.long ,qty=amount ,comment="L-Entry1")

if(S_EntrySig)    
    strategy.entry("S-Entry1" ,strategy.short ,qty=amount ,comment="S-Entry1")

__YOUR_PROGRAM__に任意のコードを入れる必要があります

目次へ

Back to Top

最高のトレード環境を実現する「サクソバンク証券」

ボクが唯一つかっている取引会社です。

世界中のほとんどの市場に対応していて、日本株をCFDで取引すれば個別株とFXの損益を通算することもできます。何よりも、ひとつの口座に入金するだけですべての銘柄を取引できるのが本当に便利。

SaxoTraderGO
  • 「FX口座」150以上の通貨ペア
  • 「株価指数CFD口座」約250種類
  • 「個別株CFD口座」日米中など世界22カ国・34市場
  • 「バラエティCFD口座」債券やVIX、商品など約100種類
  • MT4にも対応!

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のアップグレード行う、もしくはその他のブラウザを使用しての閲覧をお願いします。