ํ”ผ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
Perpetual Engine Series Part 2: Real-Time PnL Calculation ๐Ÿ“ˆ
Dev.toDev.to
Backend

Rust์™€ Decimal ๊ธฐ๋ฐ˜ ์ดˆ์ •๋ฐ€ ์‹ค์‹œ๊ฐ„ PnL ์—”์ง„ ์„ค๊ณ„

Perpetual Engine Series Part 2: Real-Time PnL Calculation ๐Ÿ“ˆ

Sumana2026๋…„ 4์›” 10์ผ4๋ถ„intermediate

Context

Perpetual Exchange์˜ ์ฒญ์‚ฐ ๋กœ์ง ์ž‘๋™์„ ์œ„ํ•œ ์‹ค์‹œ๊ฐ„ PnL ๊ณ„์‚ฐ์˜ ์ •ํ™•์„ฑ๊ณผ ์†๋„ ํ™•๋ณด๊ฐ€ ํ•„์ˆ˜์ ์ธ ์ƒํ™ฉ. ๊ธฐ์กด Float ๊ธฐ๋ฐ˜ ์—ฐ์‚ฐ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋ถ€๋™ ์†Œ์ˆ˜์  ์˜ค์ฐจ๊ฐ€ ๊ณ ๋ ˆ๋ฒ„๋ฆฌ์ง€ ํ™˜๊ฒฝ์—์„œ ๋ง‰๋Œ€ํ•œ ๊ธˆ์ „์  ์†์‹ค๋กœ ์ด์–ด์ง€๋Š” ๊ตฌ์กฐ์  ํ•œ๊ณ„ ์กด์žฌ.

Technical Solution

  • f64 Float ๋Œ€์‹  rust_decimal ํฌ๋ ˆ์ดํŠธ๋ฅผ ์ฑ„ํƒํ•˜์—ฌ ๋ถ€๋™ ์†Œ์ˆ˜์  ๋ฐ˜์˜ฌ๋ฆผ ์˜ค์ฐจ๋ฅผ ์›์ฒœ ์ฐจ๋‹จํ•œ ๊ณ ์ • ์†Œ์ˆ˜์  ์—ฐ์‚ฐ ๊ตฌํ˜„
  • WebSocket ๊ฐ€๊ฒฉ ์—…๋ฐ์ดํŠธ ์‹œ ์ „์ฒด Position Book์˜ PnL์„ ์ฆ‰์‹œ ์žฌ๊ณ„์‚ฐํ•˜๋Š” ๋™๊ธฐ์  Update Loop ์„ค๊ณ„
  • PnL ์—…๋ฐ์ดํŠธ ์งํ›„ ์ฆ‰๊ฐ์ ์ธ Liquidation Check๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ์„ ํ†ตํ•œ ๋ฆฌ์Šคํฌ ๋…ธ์ถœ ์‹œ๊ฐ„ ์ตœ์†Œํ™”
  • Funding Fee๋ฅผ PnL์— ์ง์ ‘ ๋ฐ˜์˜ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ๊ฐ€๊ฒฉ ๋ณ€๋™ ์—†๋Š” ์ƒํƒœ์—์„œ์˜ ๋งˆ์ง„ ์ž ์‹์œผ๋กœ ์ธํ•œ 'Silent Liquidation' ๋Œ€์‘
  • Unrealized PnL(ํ‰๊ฐ€ ์†์ต)๊ณผ Realized PnL(์‹คํ˜„ ์†์ต)์˜ ์—„๊ฒฉํ•œ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•œ ๊ณ„์ขŒ ์ž”๊ณ  ๋ฌด๊ฒฐ์„ฑ ์œ ์ง€

1. ๊ธˆ์œต ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์‹œ f32/f64 ๋Œ€์‹  Decimal ํƒ€์ž… ์‚ฌ์šฉ ์—ฌ๋ถ€ ๊ฒ€ํ† 

2. ๊ฐ€๊ฒฉ ๋ณ€๋™ ์™ธ์— ๊ณ„์ขŒ ์ž”๊ณ ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์™ธ๋ถ€ ์š”์ธ(์ˆ˜์ˆ˜๋ฃŒ, ํŽ€๋”ฉ๋น„ ๋“ฑ)์˜ ๋ฐ˜์˜ ์‹œ์  ์„ค๊ณ„

3. ์‹ค์‹œ๊ฐ„ ๋ฆฌ์Šคํฌ ์ฒดํฌ ๋กœ์ง์ด ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ตœ์ข… ๋‹จ๊ณ„์— ๊ฒฐํ•ฉ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ

์›๋ฌธ ์ฝ๊ธฐ