//@version=6 indicator("IMG 33 — Spot Risk Calculator", overlay=true) // Static planning inputs, not connected to a brokerage account. float entry = input.float(20, "Proposed entry", minval=0.000001) float stop = input.float(18.5, "Planned stop", minval=0) float cost = input.float(0.1, "Round-trip friction per unit", minval=0) float budget = input.float(40, "Planned loss budget", minval=0) float cash = input.float(1000, "Cash available after reserving entry fees", minval=0) float step = input.float(1, "Quantity increment", minval=0.00000001) float adverse = input.float(16, "Adverse exit scenario", minval=0) bool valid = entry > stop float unitRisk = entry - stop + cost float raw = valid ? math.min(budget / unitRisk, cash / entry) : 0 float qty = math.floor(raw / step) * step // Conservative final check against floating-point overshoot. if qty * unitRisk > budget or qty * entry > cash qty := math.max(0, qty - step) float planned = qty * unitRisk float stress = qty * (entry - adverse + cost) var table t = table.new(position.top_right, 2, 5, border_width=1) if barstate.islast table.cell(t,0,0,"Planning only") table.cell(t,1,0,valid ? "Valid long inputs" : "INVALID: stop >= entry") table.cell(t,0,1,"Quantity") table.cell(t,1,1,str.tostring(qty,"#.########")) table.cell(t,0,2,"Purchase value") table.cell(t,1,2,str.tostring(qty*entry,"#.##")) table.cell(t,0,3,"Planned loss") table.cell(t,1,3,str.tostring(planned,"#.##")) table.cell(t,0,4,"Adverse loss / (gain)") table.cell(t,1,4,str.tostring(stress,"#.##"))