無料で扱いやすい株式チャートが見れる「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 //////////////////////////////////////////////////////
コメント
張り付けてみましたが、一番最初の行のstudyをよみこんでもらえません。
どのようになおせばよいでしょうか
line5:could not find function or function reference study
質問ありがとうございます。
>line5:could not find function or function reference study
色々試してみましたが↑のエラーが再現できないです。。
どういう感じで貼り付けられたか教えて頂けますか?
コメント失礼します。
TradingViewのスクリプトがPine5にバージョンアップされてたようです。
現在公開されているソースがバージョン4の様なので、study関数自体がコンパイル通らないようです。その他の標準関数なども同様の影響が受けています。
(stdev → math.stdev など)
当方、Pineに関してはほぼ無知なので、参考にさせていただきたいです。
お手数ですが、最新のバージョンのソースをアップ頂けると非常に助かります・・・><。
ゆたさん
コメントありがとうございます^^
Pineスクリプトバージョン5に対応したソースコードをアップしましたのでお試しください。