ソースコード
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Portfolio Sample - RSI + Bollinger Bands Zone
//@version=6
indicator("RSI + BB Zone [売買ゾーン色分け]", overlay=false)
// ===== 入力パラメータ =====
rsi_len = input.int(14, "RSI期間", minval=1)
bb_len = input.int(20, "BB期間", minval=1)
bb_mult = input.float(2.0,"BB偏差", minval=0.1, step=0.1)
ob_level = input.int(70, "買われすぎ", minval=50, maxval=100)
os_level = input.int(30, "売られすぎ", minval=0, maxval=50)
// ===== RSI計算 =====
rsi = ta.rsi(close, rsi_len)
// ===== RSIにボリンジャーバンドを適用 =====
bb_basis = ta.sma(rsi, bb_len)
bb_dev = bb_mult * ta.stdev(rsi, bb_len)
bb_upper = bb_basis + bb_dev
bb_lower = bb_basis - bb_dev
// ===== 描画 =====
// RSIライン
plot(rsi, "RSI", color.new(#2962FF, 0), 2)
// ボリンジャーバンド
p_upper = plot(bb_upper, "BB上限", color.new(#787B86, 50), 1)
p_basis = plot(bb_basis, "BB中央", color.new(#787B86, 70), 1, style=plot.style_circles)
p_lower = plot(bb_lower, "BB下限", color.new(#787B86, 50), 1)
// BB帯の塗りつぶし
fill(p_upper, p_lower, color=color.new(#787B86, 92))
// ===== 水平ライン =====
hline(ob_level, "買われすぎ", color.new(#E91E63, 60), hline.style_dashed)
hline(os_level, "売られすぎ", color.new(#2962FF, 60), hline.style_dashed)
hline(50, "中央", color.new(#787B86, 80), hline.style_dotted)
// ===== ゾーン色分け =====
// RSIがBB上限を超え & 買われすぎ → 売りゾーン(赤)
// RSIがBB下限を割り & 売られすぎ → 買いゾーン(青)
sell_zone = rsi > bb_upper and rsi > ob_level
buy_zone = rsi < bb_lower and rsi < os_level
bgcolor(sell_zone ? color.new(#E91E63, 85) : buy_zone ? color.new(#2962FF, 85) : na)
// ===== 反転サイン =====
// BB上限からの反転(売りサイン)
sell_signal = ta.crossunder(rsi, bb_upper) and rsi[1] > ob_level
// BB下限からの反転(買いサイン)
buy_signal = ta.crossover(rsi, bb_lower) and rsi[1] < os_level
plotshape(buy_signal, "買いサイン", shape.circle, location.bottom, color.new(#2962FF, 0), size=size.tiny)
plotshape(sell_signal, "売りサイン", shape.circle, location.top, color.new(#E91E63, 0), size=size.tiny)
// ===== アラート =====
alertcondition(buy_signal, "買いシグナル", "RSI買いゾーン反転: RSIがBB下限から上昇 & 売られすぎ圏")
alertcondition(sell_signal, "売りシグナル", "RSI売りゾーン反転: RSIがBB上限から下降 & 買われすぎ圏")
// ===== 情報テーブル =====
var table info = table.new(position.bottom_right, 2, 3, bgcolor=color.new(#1E293B, 10), border_width=1, border_color=color.new(#475569, 50))
if barstate.islast
zone_text = sell_zone ? "売りゾーン" : buy_zone ? "買いゾーン" : "— ニュートラル"
zone_color = sell_zone ? color.new(#E91E63, 0) : buy_zone ? color.new(#2962FF, 0) : color.gray
table.cell(info, 0, 0, "RSI + BB Zone", text_color=color.white, text_size=size.small, bgcolor=color.new(#2962FF, 0))
table.cell(info, 1, 0, "", bgcolor=color.new(#2962FF, 0))
table.cell(info, 0, 1, "RSI", text_color=color.white, text_size=size.tiny)
table.cell(info, 1, 1, str.tostring(rsi, "#.1"), text_color=color.new(#2962FF, 0), text_size=size.tiny)
table.cell(info, 0, 2, "状態", text_color=color.white, text_size=size.tiny)
table.cell(info, 1, 2, zone_text, text_color=zone_color, text_size=size.tiny)