【失敗】ボリンジャーバンドによる可変MACDのゴールデンクロス・デッドクロス売買

PineScript

バックテスト

勝率42%

ソースコード

// @version=6
strategy("可変MACDバックテスト", overlay=false, initial_capital=10000000)

// TSIのパラメータ
spanLong = input.int(12, "TSI長期", minval=1)
spanShort = input.int(6, "TSI短期", minval=1)
spanSignal = input.int(3, "TSIシグナル", minval=1)

// 通常時のMACDパラメータ
macdSlow = input.int(26, "MACD長期", minval=1)
macdFast = input.int(12, "MACD短期", minval=1)
macdSignal = input.int(9, "MACDシグナル", minval=1)

// 可変時のMACDパラメータ
macdSlow2 = input.int(13, "MACD長期", minval=1)
macdFast2 = input.int(6, "MACD短期", minval=1)
macdSignal2 = input.int(3, "MACDシグナル", minval=1)

// ボリンジャーバンドのパラメータ(上下15%付近でMACDを調整)
bbLength = input.int(20, "BB期間", minval=1)
bbMult = input.float(2.0, "BB倍率", minval=0.1, step=0.1)
bbUpperThresh = 0.85
bbLowerThresh = 0.15

// TSI値の計算
tsi = ta.tsi(close, spanLong, spanShort)
tsiSignal = ta.ema(tsi, spanSignal)

// ボリンジャーバンド(BB位置は0が下限、1が上限)
basis = ta.sma(close, bbLength)
dev = bbMult * ta.stdev(close, bbLength)
upper = basis + dev
lower = basis - dev
bbPosition = upper != lower ? (close - lower) / (upper - lower) : 0.5

// MACD値の計算
var float macdLine = 0.0
var float signalLine = 0.0
if bbPosition > bbUpperThresh or bbPosition < bbLowerThresh
    [macdLine_tmp, signalLine_tmp, _] = ta.macd(close, macdFast2, macdSlow2, macdSignal2)
    macdLine := macdLine_tmp
    signalLine := signalLine_tmp
else
    [macdLine_tmp, signalLine_tmp, _] = ta.macd(close, macdFast, macdSlow, macdSignal)
    macdLine := macdLine_tmp
    signalLine := signalLine_tmp

// MACDクロス判定
macdGolden = ta.crossover(macdLine, signalLine)
macdDead = ta.crossunder(macdLine, signalLine)

// TSIに応じた購入金額
var float buyAmount = 0.0
if tsi >= -10 and tsi < 0
    buyAmount := 100000.0
else if tsi >= -20 and tsi < -10
    buyAmount := 400000.0
else if tsi >= -30 and tsi < -20
    buyAmount := 900000.0
else if tsi < -30
    buyAmount := math.min(1600000.0, strategy.equity) // 初期資本を超えないように制限
else
    buyAmount := 0.0


var float totalInvested = 0.0
var float totalQty = 0.0

// 購入
if macdGolden and buyAmount > 0
    strategy.entry("Long", strategy.long, qty=buyAmount / close)
    totalInvested += buyAmount
    totalQty += (buyAmount / close)

// 売却
if macdDead and totalQty > 0
    strategy.close("Long", comment="S")
    totalInvested := 0.0
    totalQty := 0.0

// プロット
plot(tsi, "TSI", color=color.blue)
plot(tsiSignal, "TSIシグナル", color=color.orange)
plot(macdLine, "MACD Line", color=color.red)
plot(signalLine, "MACD Signal", color=color.yellow)
hline(0, "基準", color=color.gray)
plot(basis, "BB Basis", color=color.green)
plot(upper, "BB Upper", color=color.purple)
plot(lower, "BB Lower", color=color.purple)
BACK