//@version=6
// SPDX-License-Identifier: Apache-2.0
// Copyright 2026 PineForge
// PineForge Owned Strategy: Plumbline PVT VWMA
// Price-volume accumulation confirms movement above a volume-weighted center.
strategy("PineForge — Plumbline PVT VWMA", overlay=true,
initial_capital=100000,
default_qty_type=strategy.fixed, default_qty_value=2,
pyramiding=0, commission_type=strategy.commission.percent,
commission_value=0.05, slippage=1,
margin_long=100, margin_short=100,
process_orders_on_close=false, calc_on_order_fills=false)
vwmaLength = input.int(33, "VWMA Length", minval=3, group="Trend")
pvtSignalLength = input.int(41, "PVT Signal Length", minval=3, group="Volume Flow")
atrLength = input.int(21, "ATR Length", minval=2, group="Risk")
maximumAtrLoss = input.float(2.2, "Maximum ATR Loss", minval=0.5, step=0.1, group="Risk")
volumeWeightedCenter = ta.vwma(close, vwmaLength)
priceVolumeTrend = ta.pvt
pvtSignal = ta.ema(priceVolumeTrend, pvtSignalLength)
atrValue = ta.atr(atrLength)
confirmedTrend = close > volumeWeightedCenter and priceVolumeTrend > pvtSignal
enterLong = confirmedTrend and not confirmedTrend[1]
trendEnded = close < volumeWeightedCenter or priceVolumeTrend < pvtSignal
riskExceeded = strategy.position_size > 0 and close < strategy.position_avg_price - atrValue * maximumAtrLoss
if strategy.position_size == 0 and enterLong
strategy.entry("Plumbline Long", strategy.long)
else if strategy.position_size > 0 and (trendEnded or riskExceeded)
strategy.close("Plumbline Long", comment=riskExceeded ? "ATR risk" : "Weighted trend")
plot(volumeWeightedCenter, "Volume-Weighted Center", color=color.teal)
plot(priceVolumeTrend - pvtSignal, "PVT Distance", color=color.blue, display=display.data_window)