見出し画像

【Pine】トレーディングビューのインジケータ使用数節約で一つにまとめる オシレータ系も含めて スクリプト付

TradingViewを無料で使う場合にインジケータ使用数を節約するために、以下のインジを一つにまとめました


  1. 移動平均線8本

  2. ボリンジャーバンド3本

  3. パラボリック

  4. MACD

  5. RSI

  6. ストキャスティクス


全表示


設定画面の一部


スクリプト例

//@version=6

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 移動平均線8本、ボリンジャーバンド3本、パラボ、MACD、RSI、STOCH
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


indicator("8MA,3BB,Para,ICHIMOKU,GMMA,Pivo,VWAP,MACD,RSI,STOCH", shorttitle = "まとめ", overlay = false, max_lines_count = 500, max_labels_count = 500)

//表示・非表示
string grp_show = "表示/非表示"
show_MA = input(true, "MA    " , group = grp_show, inline = "1")
show_BB = input(true, "BB    ", group = grp_show, inline = "1")
show_para = input(true, "SAR" , group = grp_show, inline = "1")
show_rsi = input(true, "RSI     ", group = grp_show, inline = "2")
show_stoch = input(true, "Stoch   ", group = grp_show, inline = "2")
show_macd = input(true, "MACD", group = grp_show, inline = "2")

string grp_macd_lab = "MACDラベル"
showDClab = input.bool(true, "DCラベル", inline = "3", group = grp_macd_lab)
showGClab = input.bool(true, "GCラベル", inline = "3", group = grp_macd_lab)

//RSIとストキャの縦方向表示位置が重ならない様にする為に、Yposi値分だけずらす
var int rsi_Yposi = 50
var int stoch_Yposi = na
if not show_rsi
    stoch_Yposi := 50 //RSIが非表示の時は、ストキャを+50ずらす
else 
    stoch_Yposi := 150 //RSIを表示する時は、ストキャを+150ずらす

lookbackPeriod = input.int(2000, "最大値検索範囲", minval = 10, maxval = 5000, step = 100, group = "MACD縮尺用設定", display = display.none,
 tooltip = "10~5000。RSIかストキャスティクスが表示されている時は、プロットの重なりを防ぐためにMACDを±50に収まるように縮尺表示するようにしています。その為に最大高さ(深さ)を検索する為の値を適当に設定して下さい。MACDの値が±50に貼り付いていたら、それは適切ではないので検索範囲を広くして下さい。なお、RSIとストキャスティクスの両方が非表示の時は、MACDは縮尺せずに表示するようになっています")

string grp_osilab = "オシレータラベル"
disp_offset = input.int(defval = 10, title = "横方向表示位置調整", group = grp_osilab, display = display.none)
osilab_size = input.string(size.normal, "文字サイズ", [size.huge, size.large, size.normal, size.small, size.tiny], group = grp_osilab, display = display.none)


// 移動平均線
string grp_ma = "----------[移動平均線]----------"
ma_len1 = input.int(title = "期間1", defval = 5, minval=1, group = grp_ma, inline = "ma1")
ma_len2 = input.int(title = "期間2", defval = 25, minval=1, group = grp_ma, inline = "ma2")
ma_len3 = input.int(title = "期間3", defval = 50, minval=1, group = grp_ma, inline = "ma3")
ma_len4 = input.int(title = "期間4", defval = 75, minval=1, group = grp_ma, inline = "ma4")
ma_len5 = input.int(title = "期間5", defval = 100, minval=1, group = grp_ma, inline = "ma1")
ma_len6 = input.int(title = "期間6", defval = 200, minval=1, group = grp_ma, inline = "ma2")
ma_len7 = input.int(title = "期間7", defval = 300, minval=1, group = grp_ma, inline = "ma3")
ma_len8 = input.int(title = "期間8", defval = 60, minval=1, group = grp_ma, inline = "ma4")

ma1 = ta.sma(close, ma_len1)
ma2 = ta.sma(close, ma_len2)
ma3 = ta.sma(close, ma_len3)
ma4 = ta.sma(close, ma_len4)
ma5 = ta.sma(close, ma_len5)
ma6 = ta.sma(close, ma_len6)
ma7 = ta.sma(close, ma_len7)
ma8 = ta.sma(close, ma_len8)

plot(show_MA ? ma1 : na, color = color.green, linewidth = 1, title = "MA1", force_overlay = true)
plot(show_MA ? ma2 : na, color = color.yellow, linewidth = 1, title = "MA2", force_overlay = true)
plot(show_MA ? ma3 : na, color = color.blue, linewidth = 1, title = "MA3", force_overlay = true)
plot(show_MA ? ma4 : na, color = color.orange, linewidth = 1, title = "MA4", force_overlay = true)
plot(show_MA ? ma5 : na, color = color.purple, linewidth = 1, title = "MA5", force_overlay = true)
plot(show_MA ? ma6 : na, color = color.maroon, linewidth = 2, title = "MA6", force_overlay = true)
plot(show_MA ? ma7 : na, color = color.rgb(28, 137, 226, 53), linewidth = 2, title = "MA7", force_overlay = true)
plot(show_MA ? ma8 : na, color = color.rgb(226, 163, 28, 53), linewidth = 1, title = "MA8", force_overlay = true)


// ボリンジャーバンド
string grp_bb = "----------[ボリンジャーバンド]----------"
sigma1 = input.float(title = "σ1", defval = 2.0, group = grp_bb)
sigma2 = input.float(title = "σ2", defval = 3.0, group = grp_bb)
sigma3 = input.float(title = "σ3", defval = 4.0, group = grp_bb)
length = input.int(title = "期間", defval = 20, group = grp_bb)

base = ta.sma(close, length)
dev1 = sigma1 * ta.stdev(close, length)
dev2 = sigma2 * ta.stdev(close, length)
dev3 = sigma3 * ta.stdev(close, length)

BB1UL = base + dev1
BB1LL = base - dev1
BB2UL = base + dev2
BB2LL = base - dev2
BB3UL = base + dev3
BB3LL = base - dev3

plot(show_MA ? base : na, color = color.red, linewidth = 2, title = "BB基準線", force_overlay = true)
plot(show_BB ? BB1UL : na, color = color.rgb(179, 182, 179, 50), linewidth = 4, title = "BB1上", force_overlay = true)
plot(show_BB ? BB1LL : na, color = color.rgb(179, 182, 179, 50), linewidth = 4, title = "BB1下", force_overlay = true)
plot(show_BB ? BB2UL : na, color = color.rgb(136, 240, 9, 77), linewidth = 4, title = "BB2上", force_overlay = true)
plot(show_BB ? BB2LL : na, color = color.rgb(136, 240, 9, 77), linewidth = 4, title = "BB2下", force_overlay = true)
plot(show_BB ? BB3UL : na, color = color.rgb(252, 182, 245, 80), linewidth = 4, title = "BB3上", force_overlay = true)
plot(show_BB ? BB3LL : na, color = color.rgb(252, 182, 245, 80), linewidth = 4, title = "BB3下", force_overlay = true)


// パラボリック
string grp_sar = "----------[パラボリック]----------"
start = input(0.02, "開始", group = grp_sar)
inc = input(0.02, "増分", group = grp_sar)
max = input(0.2, "最大値", group = grp_sar)

psar = ta.sar(start, inc, max)

plot(show_para ? psar : na, color = color.rgb(155, 39, 176, 22), linewidth = 2, title = "パラボリック", style = plot.style_circles, force_overlay = true)


// ストキャスティクス
string grp_stoch = "----------[Stochastics]----------"
k_len = input.int(14, title="%K 期間", minval=1, group = grp_stoch)
k_ma_len = input.int(1, title="%K 移動平均期間", minval=1, group = grp_stoch)
d_ma_len = input.int(3, title="%D 移動平均期間", minval=1, group = grp_stoch)
k = ta.sma(ta.stoch(close, high, low, k_len), k_ma_len)
d = ta.sma(k, d_ma_len)

plot(show_stoch ? k + stoch_Yposi : na, "%K", color.blue, display = display.pane)//重ならない様に調整した物はチャートのみの表示とする
plot(show_stoch ? d + stoch_Yposi : na, "%D", color.red, display = display.pane)//重ならない様に調整した物はチャートのみの表示とする

plot(k, "%K", color.blue, editable = false, display = show_stoch ? display.data_window + display.status_line : display.none)//本来の値をデータウィンドウとステータスラインに表示する為のplot。チャート以外の表示とする
plot(d, "%D", color.red, editable = false, display = show_stoch ? display.data_window + display.status_line : display.none)//本来の値をデータウィンドウとステータスラインに表示する為のplot。チャート以外の表示とする

plot(show_stoch ? 80 + stoch_Yposi : na, "ストキャ上", color = color.new(color.gray, 50), style = plot.style_line, display = display.pane)
plot(show_stoch ? 50 + stoch_Yposi : na, "ストキャ中", color = color.new(color.gray, 50), style = plot.style_line, display = display.pane)
plot(show_stoch ? 20 + stoch_Yposi : na, "ストキャ下", color = color.new(color.gray, 50), style = plot.style_line, display = display.pane)

k_val_text = "%K: " + str.tostring(k, "#.#") + "\n%D: " + str.tostring(d, "#.#") 
klb = label.new(show_stoch ? bar_index + disp_offset : na, 50 + stoch_Yposi, text = k_val_text, textcolor = color.white, style = label.style_label_center, size = osilab_size, textalign = text.align_left)
label.delete(klb[1])


// RSI
string grp_rsi = "----------[RSI]----------"
rsi_len = input.int(title = "期間",  minval = 1, defval = 14, group = grp_rsi)
rsi = ta.rsi(close, rsi_len)
plot(show_rsi ? rsi + rsi_Yposi : na, "RSI", color.purple, display = display.pane)//重ならない様に調整した物はチャートのみの表示とする

plot(rsi, "RSI", color.purple, editable = false, display = show_rsi ? display.data_window + display.status_line : display.none)//本来の値をデータウィンドウとステータスラインに表示する為のplot。チャート以外の表示とする

plot(show_rsi ? 70 + rsi_Yposi : na, "RSI上", color.new(color.gray, 50), style = plot.style_line, display = display.pane)
plot(show_rsi ? 50 + rsi_Yposi : na, "RSI中", color.new(color.gray, 50), style = plot.style_line, display = display.pane)
plot(show_rsi ? 30 + rsi_Yposi : na, "RSI下", color.new(color.gray, 50), style = plot.style_line, display = display.pane)

rsi_val_text = "RSI: " + str.tostring(rsi, "#.#")  
rsilb = label.new(show_rsi ? bar_index + disp_offset : na, 50 + rsi_Yposi, text = rsi_val_text, textcolor = color.white, style = label.style_label_center, size = osilab_size, textalign = text.align_left)
label.delete(rsilb[1])


// MACD
string grp_macd = "----------[MACD]----------"
fast_len = input(title = "ファスト期間", defval = 12, group = grp_macd)
slow_len = input(title = "スロー期間", defval = 26, group = grp_macd)
signal_len = input.int(title = "シグナル期間",  minval = 1, maxval = 50, defval = 9, group = grp_macd)

fast_ma = ta.ema(close, fast_len)
slow_ma = ta.ema(close, slow_len)
macd = fast_ma - slow_ma
signal = ta.ema(macd, signal_len)
hist = macd - signal

// 過去バーの範囲のMACD最大値と最小値を取得し、MACDの形状を維持したまま表示縮小する
macdMax = ta.highest(macd, lookbackPeriod)
macdMin = ta.lowest(macd, lookbackPeriod)
scaleFactor = show_rsi or show_stoch ? math.max(math.abs(macdMax), math.abs(macdMin)) / 50 : 1// 最大値と最小値の絶対値の大きい方を基準値(50)になるようにスケール係数を計算。 -50~50の範囲に表示する。//オシレータのうちMACDのみが表示される場合は、縮尺ぜずに本当のMACDのスケールで表示する
macdScaled = macd / scaleFactor
signalScaled = signal / scaleFactor
histScaled = hist / scaleFactor 

//GC、DCした点の値を傾きが緩いシグナルの二点平均で近似値として求める。
var float DCP = na
if macd[1] > signal[1] and signal > macd
    DCP := (signal[1] + signal) / 2

var float GCP = na
if macd[1] < signal[1] and signal < macd
    GCP := (signal[1] + signal) / 2

plot(show_macd ? macdScaled : na, "MACD", #2962FF, display = display.pane)
plot(show_macd ? histScaled : na, "Histogram", style = plot.style_columns, color = (hist >= 0 ? (hist[1] < hist ? #26A69A : #B2DFDB) : (hist[1] < hist ? #FFCDD2 : #FF5252)), display = display.pane)
plot(show_macd ? signalScaled : na, "Signal", #FF6D00, display = display.pane)

plot(macd, "MACD", #2962FF, editable = false, display = show_macd ? display.data_window + display.status_line : display.none)//本来の値をデータウィンドウとステータスラインに表示する為のplot。チャート以外の表示とする )
plot(signal, "Signal", #FF6D00, editable = false, display = show_macd ? display.data_window + display.status_line : display.none)//本来の値をデータウィンドウとステータスラインに表示する為のplot。チャート以外の表示とする )
plot(hist, "Histogram", color = (hist >= 0 ? (hist[1] < hist ? #26A69A : #B2DFDB) : (hist[1] < hist ? #FFCDD2 : #FF5252)), editable = false, display = show_macd ? display.data_window + display.status_line : display.none)//本来の値をデータウィンドウとステータスラインに表示する為のplot。チャート以外の表示とする )

macd_val_text = "MACD: " + str.tostring(macd, "#.##") + "\n signal: " + str.tostring(signal, "#.##") + "\n hist :"  + str.tostring(hist, "#.##")
macdlb = label.new(show_macd ? bar_index + disp_offset : na, 0, text = macd_val_text, textcolor = color.white, style = label.style_label_center, size = osilab_size, textalign = text.align_left)
label.delete(macdlb[1])

// MACD GC,DCのラベルを表示する
DCLabel = label.new(x = show_macd and showDClab and macd[1] > signal[1] and signal > macd ? bar_index-1 : na, y = DCP / scaleFactor)
label.set_text(DCLabel, str.tostring(DCP, "#.###"))
label.set_style(DCLabel, label.style_label_down)
label.set_textcolor(DCLabel, color.white)
label.set_color(DCLabel, color.blue)
label.set_size(DCLabel, osilab_size)

GCLabel = label.new(x = show_macd and showGClab and macd[1] < signal[1] and signal < macd ? bar_index-1 : na, y = GCP / scaleFactor)
label.set_text(GCLabel, str.tostring(GCP, "#.###"))
label.set_style(GCLabel, label.style_label_up)
label.set_textcolor(GCLabel, color.white)
label.set_color(GCLabel, color.red)
label.set_size(GCLabel, osilab_size)


//各オシレータの区切りのライン
hline(show_rsi or show_stoch ? 50 : na, "区切りライン", color.gray, linestyle = hline.style_solid, linewidth = 3, editable = false)
hline(show_rsi or show_stoch ? 150 : na, "区切りライン", color.gray, linestyle = hline.style_solid, linewidth = 3, editable = false)


スクリプトのコピー、貼付け方法は下記記事を参照して下さい


オシレータ系が重ならないように工夫しています

無理してまとめている部分もあります
特にMACDの部分

インジケータ数に余裕があるなら、
MACD、RSI、ストキャは
まとめインジよりも個別のインジを使った方がいいと思います

無理した内容は別記事に書いてあるので、そちらを見て下さい

引用記事ではvwap、ピボット、GMMA、一目均衡表もまとめていましたが、
ごちゃごちゃするので、今回は省きました

2025.01.25追記
●設定値をステータスウィンドウに表示する意味が無い以下の項目について、displayをnoneに変更して、表示させない様にした
・MACD縮尺用設定の最大値検索範囲
・オシレータラベルの横方向表示位置調整と文字サイズ

●MACD、RSI、ストキャスティクスについて
 ステータスラインなどに表示される値が重ならない様に調整した値となっていたので、調整前の本来の値が表示されるようにした。
 


いいなと思ったら応援しよう!