【失敗】BB4本(BBを上下に抜けたローソク足の継続本数でパラメータ切り替え)

PineScript
// @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))
BACK