//@version=5 strategy("ARC Method Trading Strategy", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10, process_orders_on_close=true) // --- Inputs --- boxLookback = input.int(1, "Previous Days for Box High/Low", minval=1) swingLookback = input.int(20, "Swing High/Low Lookback (Days)", minval=5) minMovePct = input.float(20.0, "Min Unabated Move (% of Box Range)", minval=5.0, maxval=100.0) / 100.0 tpBoxPct = input.float(100.0, "Take Profit Target (% of Box Range)", minval=10.0, maxval=200.0) / 100.0 wickPct = input.float(40.0, "Min Reversal Wick Size (% of Candle Range)", minval=20.0, maxval=80.0) / 100.0 // --- Level Calculations --- pdh = request.security(syminfo.tickerid, "D", high[1], lookahead=barmerge.lookahead_on) pdl = request.security(syminfo.tickerid, "D", low[1], lookahead=barmerge.lookahead_on) boxHigh = pdh boxLow = pdl boxRange = math.max(boxHigh - boxLow, syminfo.mintick) swingHighRaw = request.security(syminfo.tickerid, "D", ta.highest(high, swingLookback)[1], lookahead=barmerge.lookahead_on) swingLowRaw = request.security(syminfo.tickerid, "D", ta.lowest(low, swingLookback)[1], lookahead=barmerge.lookahead_on) swingHigh = swingHighRaw > boxHigh ? swingHighRaw : boxHigh + boxRange * 0.5 swingLow = swingLowRaw < boxLow ? swingLowRaw : boxLow - boxRange * 0.5 // --- Zone Boundaries --- zoneTolerance = boxRange * 0.15 nearSupport = (low <= boxLow + zoneTolerance) or (low <= swingLow + zoneTolerance) nearResistance = (high >= boxHigh - zoneTolerance) or (high >= swingHigh - zoneTolerance) // --- Reversal Candle Patterns (John Wicks) --- candleRange = high - low candleRangeValid = candleRange > 0 lowerWick = math.min(open, close) - low upperWick = high - math.max(open, close) bullishWick = candleRangeValid and (lowerWick / candleRange >= wickPct) bearishWick = candleRangeValid and (upperWick / candleRange >= wickPct) // --- Unabated Move Check --- recentMoveDown = (high[3] - low) >= (boxRange * minMovePct) recentMoveUp = (high - low[3]) >= (boxRange * minMovePct) // --- Setup Triggers --- var float buyTriggerHigh = na var float buyStopLow = na var float sellTriggerLow = na var float sellStopHigh = na var bool setupBuy = false var bool setupSell = false if nearSupport and bullishWick and recentMoveDown setupBuy := true buyTriggerHigh := high buyStopLow := low - (boxRange * 0.02) if nearResistance and bearishWick and recentMoveUp setupSell := true sellTriggerLow := low sellStopHigh := high + (boxRange * 0.02) // --- Executions --- if setupBuy and not na(buyTriggerHigh) and strategy.position_size == 0 if ta.crossover(close, buyTriggerHigh) strategy.entry("ARC_Long", strategy.long) strategy.exit("Exit_Long", "ARC_Long", stop=buyStopLow, limit=close + (boxRange * tpBoxPct)) setupBuy := false if setupSell and not na(sellTriggerLow) and strategy.position_size == 0 if ta.crossunder(close, sellTriggerLow) strategy.entry("ARC_Short", strategy.short) strategy.exit("Exit_Short", "ARC_Short", stop=sellStopHigh, limit=close - (boxRange * tpBoxPct)) setupSell := false // Invalidate setups if price breaks beyond stop or stretches too far if setupBuy and (close < buyStopLow or close > buyTriggerHigh + boxRange * 0.5) setupBuy := false if setupSell and (close > sellStopHigh or close < sellTriggerLow - boxRange * 0.5) setupSell := false // --- Visual Plots --- plot(boxHigh, "Box High", color=color.red, linewidth=2) plot(boxLow, "Box Low", color=color.green, linewidth=2) plot(swingHigh, "Swing High", color=color.maroon, style=plot.style_circles) plot(swingLow, "Swing Low", color=color.teal, style=plot.style_circles)