新型コロナの治療薬ができるまで感染スピードを抑えて大切な人を守りましょう。詳細はこちら

Trading Viewに無料で3つ以上のインジケータ(出来高プロファイル含む)を表示する方法

Trading View
この記事は約21分で読めます。

無料で扱いやすい株式チャートが見れる「Trading View」ですが、無料だと使えるインジケータが3つまでという制限があり、そのうえ出来高プロファイルも表示できません。。

でもそこは太っ腹の「Trading View」様。インジケータを自作すれば、移動平均線(短期・中期・長期・超長期)、ボリンジャーバンド、RSI、MACD、出来高プロファイル(固定期間)を同時に表示できる道を残してくださっています(感謝です<(__)>)。

「インジケータの自作なんてハードルが高そう…」と思うところですが大丈夫です。コピペだけで簡単にできます。

※この方法はPCでChromeブラウザを利用している方を対象としています。(スマホやタブレットの方ごめんなさい)

移動平均線、ボリンジャーバンド、出来高プロファイルをまとめて設定する

この方法がすべてです(これができればあとはMACD・RSI・出来高を通常通りに追加するだけです)。

移動平均線、ボリンジャーバンド、出来高プロファイルの3つのインジケーターを1つのインジケーターとして自作します。

まず「Trading View」を開きます。

画面の下にある「Pine エディタ」をクリックします。

以下のように「名前なしのスクリプト」というファイルが表示されます。

以下の2行を削除します。 ※上から4行目までは必要なので消さないでください。

study("マイスクリプト")
plot(close)

4行目の「//@Version=数字」の下に以下のPineソースコードを貼り付けます。

PineスクリプトVer5用ソースコード↓(以前のVer4用ソースコードは記事の一番下に移動しました)

indicator('My_MA_BB_VP', overlay=true, precision=4, linktoseries=true, max_bars_back=1000, max_lines_count=500)
 //移動平均線
 day5 = input(5, title='MA短期:算出期間')
 day25 = input(25, title='MA中期:算出期間')
 day50 = input(50, title='MA中長期:算出期間')
 day75 = input(75, title='MA長期:算出期間')
 day200 = input(200, title='MA超長期:算出期間')
 ma5 = ta.sma(close, day5)
 ma25 = ta.sma(close, day25)
 ma50 = ta.sma(close, day50)
 ma75 = ta.sma(close, day75)
 ma200 = ta.sma(close, day200)
 plot(ma5, title='短期移動平均線', color=color.new(color.blue, 0), linewidth=1)
 plot(ma25, title='中期移動平均線', color=color.new(color.yellow, 0), linewidth=1)
 plot(ma50, title='中長期移動平均線', color=color.new(color.blue, 0), linewidth=1)
 plot(ma75, title='長期移動平均線', color=color.new(color.orange, 0), linewidth=1)
 plot(ma200, title='超長期移動平均線', color=color.new(color.purple, 0), linewidth=1)
 //ボリンジャーバンド
 length = input(20, title='BB:算出する期間')
 price = input(close, title='BB:計算の対象')
 sma = ta.sma(price, length)  //移動平均線
 dev = ta.stdev(price, length)  //標準偏差
 bb2h = sma + dev * 2
 bb1h = sma + dev
 bb1l = sma - dev
 bb2l = sma - dev * 2
 p2h = plot(bb2h, title='BB2σ+', color=color.new(color.gray, 39), linewidth=1)
 plot(bb1h, title='BB1σ+', color=color.new(color.gray, 77), linewidth=1)
 plot(sma, title='BBMA20', color=color.new(color.gray, 90), linewidth=1)
 plot(bb1l, title='BB1σ-', color=color.new(color.gray, 77), linewidth=1)
 p2l = plot(bb2l, title='BB2σ-', color=color.new(color.gray, 39), linewidth=1)
 fill(p2h, p2l, title='BB2背景', color=color.new(color.gray, 96), transp=90)
 //出来高プロファイル
 //////////////////////////////////////////////////////
 //// INPUTS
 //////////////////////////////////////////////////////
 vp_lookback = input.int(defval=260, title='VP:対象期間(日数) [10-1000]', minval=10, maxval=1000)
 vp_max_bars = input.int(defval=90, title='VP:横棒グラフの数 [10-500]', minval=10, maxval=500)
 vp_bar_mult = input.int(defval=13, title='VP:横棒グラフの長さ [10-100]', minval=10, maxval=100)
 vp_bar_offset = input.int(defval=13, title='VP:横棒グラフのオフセット [0-100]', minval=0, maxval=100)
 vp_bar_width = input.int(defval=2, title='VP:横棒グラフの太さ [1-20]', minval=1, maxval=20)
 // As suggested by @NXT2017
 vp_delta_type = input.string(defval='Both', title='VP:Delta Type', options=['Both', 'Bullish', 'Bearish'])
 vp_poc_show = input(defval=true, title='VP:POC(最高値ライン)を表示')
 vp_bar_color = input(defval=color.new(color.yellow, 0), title='VP:グラフの色')
 vp_poc_color = input(defval=color.new(color.orange, 0), title='VP:POCの色')
 //////////////////////////////////////////////////////
 //// VARIABLES
 //////////////////////////////////////////////////////
 float vp_Vmax = 0.0
 int vp_VmaxId = 0
 int vp_N_BARS = vp_max_bars
 var int vp_first = time
 vp_a_P = array.new_float(vp_N_BARS + 1, 0.0)
 vp_a_V = array.new_float(vp_N_BARS, 0.0)
 vp_a_D = array.new_float(vp_N_BARS, 0.0)
 vp_a_W = array.new_int(vp_N_BARS, 0)
 //////////////////////////////////////////////////////
 //// CALCULATIONS
 //////////////////////////////////////////////////////
 float vp_HH = ta.highest(high, vp_lookback)
 float vp_LL = ta.lowest(low, vp_lookback)
 if barstate.islast
     float vp_HL = (vp_HH - vp_LL) / vp_N_BARS
     for j = 1 to vp_N_BARS + 1 by 1
         array.set(vp_a_P, j - 1, vp_LL + vp_HL * j)
     for i = 0 to vp_lookback - 1 by 1
         int Dc = 0
         array.fill(vp_a_D, 0.0)
         for j = 0 to vp_N_BARS - 1 by 1
             float Pj = array.get(vp_a_P, j)
             if low[i] < Pj and high[i] > Pj and (vp_delta_type == 'Bullish' ? close[i] >= open[i] : vp_delta_type == 'Bearish' ? close[i] <= open[i] : true)                 float Dj = array.get(vp_a_D, j)                 float dDj = Dj + nz(volume[i])                 array.set(vp_a_D, j, dDj)                 Dc := Dc + 1                 Dc         for j = 0 to vp_N_BARS - 1 by 1             float Vj = array.get(vp_a_V, j)             float Dj = array.get(vp_a_D, j)             float dVj = Vj + (Dc > 0 ? Dj / Dc : 0.0)
             array.set(vp_a_V, j, dVj)
     vp_Vmax := array.max(vp_a_V)
     vp_VmaxId := array.indexof(vp_a_V, vp_Vmax)
     for j = 0 to vp_N_BARS - 1 by 1
         float Vj = array.get(vp_a_V, j)
         int Aj = math.round(vp_bar_mult * Vj / vp_Vmax)
         array.set(vp_a_W, j, Aj)
 //////////////////////////////////////////////////////
 //// PLOTING
 //////////////////////////////////////////////////////
 if barstate.isfirst
     vp_first := time
     vp_first
 vp_change = ta.change(time)
 vp_x_loc = timenow + math.round(vp_change * vp_bar_offset)
 f_setup_bar(n) =>
     x1 = vp_VmaxId == n and vp_poc_show ? math.max(time[vp_lookback], vp_first) : timenow + math.round(vp_change * (vp_bar_offset - array.get(vp_a_W, n)))
     ys = array.get(vp_a_P, n)
     line.new(x1=x1, y1=ys, x2=vp_x_loc, y2=ys, xloc=xloc.bar_time, extend=extend.none, color=vp_VmaxId == n ? vp_poc_color : vp_bar_color, style=line.style_solid, width=vp_bar_width)
 if barstate.islast
     for i = 0 to vp_N_BARS - 1 by 1
         f_setup_bar(i)
 //////////////////////////////////////////////////////
 //// END
 //////////////////////////////////////////////////////

貼り付け終わったら「保存」します。

スクリプト名を聞かれるので、適当な名前を付けて「保存」を押します。

「チャートに追加」をクリックすると、チャートに移動平均線、ボリンジャーバンド、出来高プロファイル(固定期間)が表示されます。

最後にエディターの右上にある「ー」を押してエディタを閉じます。

MACD、RSI、出来高インジケーターを表示する

あとは通常通り、内臓のインジケーターから「MACD」「RSI(相対力指数)」「Volume(出来高)」を追加します。

MACD

RSI

出来高

完成!

以上で移動平均線、ボリンジャーバンド、出来高プロファイル、MACD、RSI、出来高を無料でも同時に表示できるようになります。

今回Pineエディタからら追加した「移動平均線」「ボリンジャーバンド」「出来高プロファイル」は、内臓のインジケーターと同じように設定ボタンから期間や色を変更できます。お好みに合わせて色々いじってみて下さい。

最後までお読みいただきありがとうございました。


以前公開していたPineスクリプトVer4用ソースコード↓

study("My_MA_BB_VP",
      overlay=true,
      precision       = 4,
      linktoseries    = true, 
      max_bars_back   = 1000, 
      max_lines_count = 500)

//移動平均線
day5 = input( 5 ,title="MA短期:算出期間" )
day25 = input( 25 ,title="MA中期:算出期間" )
day75 = input( 75 ,title="MA長期:算出期間" )
day200 = input( 200 ,title="MA超長期:算出期間" )
ma5 = sma(close, day5)
ma25 = sma(close, day25)
ma75 = sma(close, day75)
ma200 = sma(close, day200)
plot(ma5, title='短期移動平均線', color=color.blue, linewidth=1)
plot(ma25, title='中期移動平均線', color=color.yellow, linewidth=1)
plot(ma75, title='長期移動平均線', color=color.orange, linewidth=1)
plot(ma200, title='超長期移動平均線', color=color.purple, linewidth=1)

//ボリンジャーバンド
length = input( 20 ,title="BB:算出する期間" )
price = input( close ,title="BB:計算の対象" )
sma = sma ( price ,length ) //移動平均線
dev = stdev( price ,length ) //標準偏差
bb2h = sma + dev * 2
bb1h = sma + dev
bb1l = sma - dev
bb2l = sma - dev * 2
p2h = plot( bb2h, title='BB2σ+', color=color.new(color.gray, 39), linewidth=1)
plot( bb1h, title='BB1σ+', color=color.new(color.gray, 77), linewidth=1)
plot( sma, title='BBMA20', color=color.new(color.gray, 90), linewidth=1 )
plot( bb1l, title='BB1σ-', color=color.new(color.gray, 77), linewidth=1)
p2l = plot( bb2l, title='BB2σ-', color=color.new(color.gray, 39), linewidth=1)
fill(p2h, p2l, title='BB2背景', color=color.new(color.gray, 96))

//出来高プロファイル
//////////////////////////////////////////////////////
//// INPUTS
//////////////////////////////////////////////////////
vp_lookback   = input(defval = 260, 
                     title   = "VP:対象期間(日数) [10-1000]", 
                      type    = input.integer, 
                      minval  = 10, 
                      maxval  = 1000)
vp_max_bars   = input(defval = 90, 
                      title   = "VP:横棒グラフの数 [10-500]",
                      type    = input.integer, 
                      minval  = 10, 
                      maxval  = 500)
vp_bar_mult   = input(defval = 13, 
                      title   = "VP:横棒グラフの長さ [10-100]",
                      type    = input.integer, 
                      minval  = 10, 
                      maxval  = 100)
vp_bar_offset = input(defval = 13, 
                      title   = "VP:横棒グラフのオフセット [0-100]", 
                      type    = input.integer, 
                      minval  = 0, 
                      maxval  = 100)
vp_bar_width  = input(defval = 2, 
                      title   = "VP:横棒グラフの太さ [1-20]", 
                      type    = input.integer, 
                      minval  = 1, 
                      maxval  = 20)
// As suggested by @NXT2017
vp_delta_type = input(defval = "Both",
                      title   = "VP:Delta Type",
                      type    = input.string,
                      options = ['Both', 'Bullish', 'Bearish'])
vp_poc_show   = input(defval = true, 
                      title   = "VP:POC(最高値ライン)を表示", 
                      type    = input.bool)
vp_bar_color  = input(defval = color.new(color.yellow, 0) , 
                      title   = "VP:グラフの色", 
                      type    = input.color)
vp_poc_color  = input(defval = color.new(color.orange, 0), 
                      title   = "VP:POCの色", 
                      type    = input.color)
//////////////////////////////////////////////////////
//// VARIABLES
//////////////////////////////////////////////////////
float vp_Vmax = 0.0
int vp_VmaxId = 0
int vp_N_BARS = vp_max_bars
var int vp_first = time
vp_a_P = array.new_float((vp_N_BARS + 1), 0.0)
vp_a_V = array.new_float(vp_N_BARS, 0.0)
vp_a_D = array.new_float(vp_N_BARS, 0.0)
vp_a_W = array.new_int(vp_N_BARS, 0)
//////////////////////////////////////////////////////
//// CALCULATIONS
//////////////////////////////////////////////////////
float vp_HH = highest(high, vp_lookback)
float vp_LL = lowest(low, vp_lookback)
if barstate.islast
    float vp_HL = (vp_HH - vp_LL) / vp_N_BARS
    for j = 1 to (vp_N_BARS + 1)
        array.set(vp_a_P, (j-1), (vp_LL + vp_HL * j))
    for i = 0 to (vp_lookback - 1)
        int Dc = 0
        array.fill(vp_a_D, 0.0)
        for j = 0 to (vp_N_BARS - 1)
            float Pj = array.get(vp_a_P, j)
            if low[i] < Pj and high[i] > Pj and (vp_delta_type == "Bullish" ? 
             close[i] >= open[i] : (vp_delta_type == "Bearish" ? close[i] <= open[i] : true))
                float Dj = array.get(vp_a_D, j)
                float dDj = Dj + nz(volume[i])
                array.set(vp_a_D, j, dDj)
                Dc := Dc + 1
        for j = 0 to (vp_N_BARS - 1)
            float Vj = array.get(vp_a_V, j)
            float Dj = array.get(vp_a_D, j)
            float dVj = Vj + ((Dc > 0) ? (Dj / Dc) : 0.0)
            array.set(vp_a_V, j, dVj)
    vp_Vmax := array.max(vp_a_V)
    vp_VmaxId := array.indexof(vp_a_V, vp_Vmax)
    for j = 0 to (vp_N_BARS - 1)
        float Vj = array.get(vp_a_V, j)
        int Aj = round(vp_bar_mult * Vj / vp_Vmax)
        array.set(vp_a_W, j, Aj)
//////////////////////////////////////////////////////
//// PLOTING
//////////////////////////////////////////////////////
if barstate.isfirst
    vp_first := time
vp_change = change(time)
vp_x_loc = timenow + round(vp_change * vp_bar_offset)
f_setup_bar(n) =>
    x1 = ((vp_VmaxId == n) and vp_poc_show) ? max(time[vp_lookback], vp_first) : 
         (timenow + round(vp_change * (vp_bar_offset - array.get(vp_a_W, n))))
    ys = array.get(vp_a_P, n)
    line.new(x1     = x1, 
             y1     = ys, 
             x2     = vp_x_loc, 
             y2     = ys, 
             xloc   = xloc.bar_time, 
             extend = extend.none, 
             color  = (vp_VmaxId == n ? vp_poc_color : vp_bar_color), 
             style  = line.style_solid, 
             width  = vp_bar_width)
if barstate.islast
    for i = 0 to (vp_N_BARS - 1) by 1
        f_setup_bar(i)
//////////////////////////////////////////////////////
//// END
//////////////////////////////////////////////////////

コメント

  1. せばすちゃ より:

    張り付けてみましたが、一番最初の行のstudyをよみこんでもらえません。
    どのようになおせばよいでしょうか
    line5:could not find function or function reference study

    • 風塵 ふーじん風塵 ふーじん より:

      質問ありがとうございます。
      >line5:could not find function or function reference study
      色々試してみましたが↑のエラーが再現できないです。。
      どういう感じで貼り付けられたか教えて頂けますか?

  2. ゆた より:

    コメント失礼します。
    TradingViewのスクリプトがPine5にバージョンアップされてたようです。

    現在公開されているソースがバージョン4の様なので、study関数自体がコンパイル通らないようです。その他の標準関数なども同様の影響が受けています。
    (stdev → math.stdev など)

    当方、Pineに関してはほぼ無知なので、参考にさせていただきたいです。
    お手数ですが、最新のバージョンのソースをアップ頂けると非常に助かります・・・><。

    • 風塵 ふーじん風塵 ふーじん より:

      ゆたさん

      コメントありがとうございます^^
      Pineスクリプトバージョン5に対応したソースコードをアップしましたのでお試しください。

タイトルとURLをコピーしました