ํผ๋๋ก ๋์๊ฐ๊ธฐ
Dev.toBackend
์๋ฌธ ์ฝ๊ธฐ
Rust์ Decimal ๊ธฐ๋ฐ ์ด์ ๋ฐ ์ค์๊ฐ PnL ์์ง ์ค๊ณ
Perpetual Engine Series Part 2: Real-Time PnL Calculation ๐
AI ์์ฝ
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. ์ค์๊ฐ ๋ฆฌ์คํฌ ์ฒดํฌ ๋ก์ง์ด ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ ํ์ดํ๋ผ์ธ์ ์ต์ข ๋จ๊ณ์ ๊ฒฐํฉ๋์ด ์๋์ง ํ์ธ