How about this one?
with cte as
(
select *, Row_Number() OVER(PARTITION BY ID ORDER BY ID) as RowNum
from #TempStk
)
select a.rownum, a.id, a.status, a.date, a.quantity,
CASE WHEN a.Status <> 'Receipt' THEN SUM(case when b.Status = 'Receipt' Then b.quantity Else -b.quantity END) - a.quantity
ELSE ISNULL(SUM(case when b.Status = 'Receipt' Then b.quantity Else -b.quantity END),0) + a.quantity
END as Bal
from cte a
LEFT outer join cte b
on a.id = b.id and a.RowNum > B.RowNum
group by a.rownum, a.id, a.status, a.date, a.quantity
order by a.id, a.rownum