// @version=6
strategy("4本BBで3段階MACD切り替え", overlay=true, initial_capital=1000000)
// 通常時のMACDパラメータ
macdSlow = input.int(73, "MACD長期(通常)", minval=1)
macdFast = input.int(65, "MACD短期(通常)", minval=1)
macdSignal = input.int(2, "MACDシグナル(通常)", minval=1)
// 早いMACDパラメータ
macdSlow2 = input.int(6, "MACD長期(早い)", minval=1)
macdFast2 = input.int(5, "MACD短期(早い)", minval=1)
macdSignal2 = input.int(5, "MACDシグナル(早い)", minval=1)
// 激早MACDパラメータ
macdSlow3 = input.int(4, "MACD長期(激早)", minval=1)
macdFast3 = input.int(5, "MACD短期(激早)", minval=1)
macdSignal3 = input.int(5, "MACDシグナル(激早)", minval=1)
// 内側のボリンジャーバンド
bbLength1 = input.int(25, "内側BB期間", minval=1)
bbMultUpper1 = input.float(2.1, "内側BB上側倍率", minval=0.1, step=0.1)
bbMultLower1 = input.float(1.8, "内側BB下側倍率", minval=0.1, step=0.1)
// 外側のボリンジャーバンド
bbLength2 = input.int(25, "外側BB期間", minval=1)
bbMultUpper2 = input.float(3.1, "外側BB上側倍率", minval=0.1, step=0.1)
bbMultLower2 = input.float(1.9, "外側BB下側倍率", minval=0.1, step=0.1)
// === 継続条件(何本継続でゾーン切り替えするか) ===
barsToSwitchFast = input.int(1, "早いゾーン切替継続本数", minval=1)
barsToSwitchUltra = input.int(1, "激早ゾーン切替継続本数", minval=1)
// ボリンジャーバンド
basis1 = ta.sma(close, bbLength1)
dev1 = ta.stdev(close, bbLength1)
upper1 = basis1 + bbMultUpper1 * dev1
lower1 = basis1 - bbMultLower1 * dev1
basis2 = ta.sma(close, bbLength2)
dev2 = ta.stdev(close, bbLength2)
upper2 = basis2 + bbMultUpper2 * dev2
lower2 = basis2 - bbMultLower2 * dev2
// === BB外に出ている本数をカウント ===
var int fastCount = 0
var int ultraCount = 0
if close > upper1 or close < lower1
fastCount += 1
else
fastCount := 0
if close > upper2 or close < lower2
ultraCount += 1
else
ultraCount := 0
// === ゾーン判定 ===
// デフォルト通常
zone = 0
if ultraCount >= barsToSwitchUltra
zone := 2
else if fastCount >= barsToSwitchFast
zone := 1
else
zone := 0
// MACD値の計算
[macdLine1, signalLine1, _] = ta.macd(close, macdFast, macdSlow, macdSignal)
[macdLine2, signalLine2, _] = ta.macd(close, macdFast2, macdSlow2, macdSignal2)
[macdLine3, signalLine3, _] = ta.macd(close, macdFast3, macdSlow3, macdSignal3)
// ゾーンに応じてMACDを選択
macdLine = zone == 2 ? macdLine3 : zone == 1 ? macdLine2 : macdLine1
signalLine = zone == 2 ? signalLine3 : zone == 1 ? signalLine2 : signalLine1
// MACDクロス判定
macdDead = ta.crossover(macdLine, signalLine)
macdGolden = ta.crossunder(macdLine, signalLine)
// 購入金額
buyAmount = input.float(100000, "購入金額", minval=0)
// 売買戦略
//if macdGolden
if macdGolden and strategy.position_size == 0
strategy.entry("Long", strategy.long, qty=buyAmount / close)
//if macdDead
if macdDead and strategy.position_size > 0
strategy.close("Long", comment="Sell")
// --- BBプロット ---
plot(basis1, "内側BB Basis", color=color.new(color.green, 0))
plot(upper1, "内側BB Upper", color=color.new(color.purple, 0))
plot(lower1, "内側BB Lower", color=color.new(color.purple, 0))
plot(basis2, "外側BB Basis", color=color.new(color.teal, 0))
plot(upper2, "外側BB Upper", color=color.new(color.orange, 0))
plot(lower2, "外側BB Lower", color=color.new(color.orange, 0))