ๅบๆฌ็ไบคๆ็ณป็ป็ปๆ๏ผไพๅญฆไน ๏ผ
ๆฎๅๅผๆไธป่ฆ่ด่ดฃๅ ฌๅนณ็ๆฎๅไนฐๅ่ฎขๅใๅฎ็ฐๅ ฌๅนณไบคๆๆฎๅใ
ไนฐๅ็ฐฟ๏ผBids๏ผ๏ผ ๆๆไนฐๅฎถๆฟๆไปฅไธๅไปทๆ ผไนฐๅ ฅ็ๅงๆๅ๏ผไปทๆ ผไป้ซๅฐไฝ๏ผๅคงๆ นๅ ๏ผ
ๅๅ็ฐฟ๏ผAsks๏ผ๏ผ ๆๆไนฐๅฎถๆฟๆไปฅไธๅไปทๆ ผไนฐๅ ฅ็ๅงๆๅ๏ผไปทๆ ผไปไฝๅฐ้ซ๏ผๅฐๆ นๅ ๏ผ
ไปทๅทฎ๏ผSpread๏ผ๏ผ ๅชๆไนฐๅไปท โฅ ๅๅไปทๆถ๏ผๆไผๅ็ๆฎๅ
**ไปทๆ ผ-ๆถ้ดไผๅ ๅๅ๏ผ**ๆฎๅๆถ๏ผๅน้ ไปทๆ ผๆไผ็่ฎขๅ๏ผๅฆไนฐๅไผๅ ๅน้ ๆไฝๅไปท๏ผๅๅไผๅ ๅน้ ๆ้ซไนฐไปท๏ผ๏ผๅฆๆๆๅคไธช่ฎขๅไปทๆ ผ็ธๅ๏ผๅไผๅ ๅน้ ๆๆฉๆไบค็่ฎขๅ๏ผๅณโๅ ๅฐๅ ๅพโ๏ผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ่ฎขๅ็ฐฟ Order Book๏ผ่กจๆ ผๅฏนๆฏ๏ผ โ
โโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโค
โ ไปทๆ ผไผๅ
โ ๆถ้ดไผๅ
โ ๆนๅ โ ไปทๆ ผ โ ๆฐ้(ๆ) โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโผโโโโโโโโโโโโโโผโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโค
โ โ โ ASK โ 30.50 โ 200 โ
โ โ โ ASK โ 30.40 โ 500 โ
โ โ โ ASK โ 30.30 โ 300 โ
โ ๆไฝๅไปท โ ๆๆฉๆๅ โ ASK โ 30.20 โ 400 โๅไธโ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโผโโโโโโโโโโโโโโผโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโค
โ ๆ้ซไนฐไปท โ ๆๆฉๆๅ โ BID โ 30.10 โ 300 โไนฐไธโ
โ โ โ BID โ 30.00 โ 600 โ
โ โ โ BID โ 29.90 โ 200 โ
โ โ โ BID โ 29.80 โ 100 โ
โโโโโโโโโโโโโโโดโโโโโโโโโโโโโโดโโโโโโโโโโโโโโดโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโ
ไปทๅทฎ Spread = 30.10 - 30.20 = -0.10๏ผไธไผๆไบค๏ผ็ญๅพ
ๆฐ็ๅๅญ่ฟๆฅๅธไปทๅ๏ผLimit Order๏ผ๏ผ
- ๆๅฎไปทๆ ผ๏ผๅช่ฝๅจๆๅฎไปทๆ ผๆๆดไผ็ไปทๆ ผๆไบค
- ๅฏ่ฝ้จๅๆไบค๏ผๅฏนๆ็ไธๅค
- ้่ฆ็ญๅพ ๏ผไผ็ๅจ่ฎขๅ็ฐฟ้
้ไปทๅ๏ผMarket Order๏ผ๏ผ
- ็ซๅณๆไบค๏ผไปฅๅฝๅๅธๅบๆไผไปทๆ ผ็ซๅณๆไบค
- ๅ จ้จๆไบคๆๆ็ป
- ไธ็ญๅพ ๏ผไธไผ็ๅจ่ฎขๅ็ฐฟ้
- ่ฎขๅ็ฐฟ็ฎก็ๆจกๅ๏ผ ็ปดๆคๆๆๆชๆไบค็่ฎขๅ
- ๆฎๅ็ฎๆณๆจกๅ๏ผ ๅฎ็ฐไปทๆ ผ-ๆถ้ดไผๅ ๆฎๅๅๅ
ๆดไฝๆกๆถ่ฎพ่ฎก๏ผ
- ่ฎขๅ้้๏ผOrder Chan๏ผ๏ผ็จๆท่ฎขๅๅ ฅๅฃ
- ไบคๆ้้๏ผTrade Chan๏ผ๏ผๆฎๅๆๅ่ฎขๅๅบๅฃ
- ๅพช็ฏๆฎๅๅค็๏ผProcess Loop๏ผ๏ผๆฎๅ็ฌฆๅ่งๅ็่ฎขๅ
- ่ฎขๅ็ฐฟ๏ผOrder Books Map๏ผ๏ผ็ฎก็ๆชๆไบค็ๅๅธๅฏน็ไบคๆ็ฐฟ
ๅไธช่ฎขๅ็ฐฟ่ฎพ่ฎก๏ผ
ๅฆไธๅพๆ่ง๏ผๅไธช่ฎขๅ็ฐฟๅไธบไนฐๅ็ฐฟ๏ผBuyOrders๏ผใๅๅ็ฐฟ๏ผSellOrders๏ผใ
OrderBook (BTC/USDT)
โโโ BuyOrders (ๆๅคงๅ )
โ โโโโโโโโโโโโโโโโโโโ
โ โ Price: $110,100 โ โ ๅ ้กถ (ๆ้ซไปท)
โ โ Amount: 0.5 BTC โ
โ โ Time: 10:01:00 โ
โ โโโโโโโโโโโโโโโโโโโค
โ โ Price: $110,099 โ
โ โ Amount: 1.0 BTC โ
โ โ Time: 10:00:30 โ
โ โโโโโโโโโโโโโโโโโโโค
โ โ Price: $110,098 โ
โ โ Amount: 0.8 BTC โ
โ โ Time: 10:01:00 โ
โ โโโโโโโโโโโโโโโโโโโ
โ
โโโ SellOrders (ๆๅฐๅ )
โโโโโโโโโโโโโโโโโโโ
โ Price: $110,101 โ โ ๅ ้กถ (ๆไฝไปท)
โ Amount: 0.3 BTC โ
โ Time: 10:00:45 โ
โโโโโโโโโโโโโโโโโโโค
โ Price: $110,102 โ
โ Amount: 0.7 BTC โ
โ Time: 10:01:15 โ
โโโโโโโโโโโโโโโโโโโค
โ Price: $110,105 โ
โ Amount: 1.2 BTC โ
โ Time: 10:00:45 โ
โโโโโโโโโโโโโโโโโโโๆฎๅๆกๆถๅค็ๆต็จ๏ผ
- ๆฐ่ฎขๅ่ฏทๆฑ่ขซๆจ้ๅฐ
orderChan - ่ฐ็จ
ProcessOrderๅผๅงๅ้ ่ฎขๅๅค็้ป่พ๏ผไปฅๅ็ปๆๅๅบ้ป่พ๏ผๅผๆญฅๅค็่ฎขๅ+ๅๆญฅ็ญๅพ ็ปๆ๏ผ - ่ฐ็จ
matchOrderๅค็่ฎขๅๆฎๅ - ่ฟๅไบคๆ็ปๆ่ณ
ResultChan๏ผๅๆถๅฐ็ธๅ ณ้ป่พๅ้็ปtradeChan๏ผไพๅ ถไปๆจกๅ็่ฐ็จ๏ผ
graph TD
A[ๆฐ่ฎขๅ่ฏทๆฑ] -->B[ๅ้ๅฐorderChan]
B-->C[processOrder ๅ็จๅค็]
C --> D[่ฐ็จ matchOrder]
D -->E[่ทๅ/ๅๅปบ่ฎขๅ็ฐฟ]
E -->F[ๆง่กๅ้ป่พ]
F-->G[่ฟๅไบคๆ็ปๆ]
G --> H[้่ฟ ResultChan ่ฟๅ]
H -->I[่ฐ็จๆน่ทๅพ็ปๆ]
J[tradeChan]-.->k[ไบคๆ่ฎฐๅฝๅค็]
F-.->J
่ฏฆ็ปๆฎๅๆต็จ๏ผ
- ่ทๅ็ธๅ ณๅธๅฏน่ฎขๅ็ฐฟๅๅ ้
- ๆ นๆฎๅฝๅ่ฎขๅๆนๅ๏ผbuy/sell๏ผ่ทๅ็ธๅฏน็ๅฏนๆ็้ๅ
- ๅฆๆๅฏนๆ็้ๅไธบ็ฉบ๏ผๆฏ๏ผ๏ผ็ดๆฅๅ ๅ ฅ่ฎขๅ็ฐฟ๏ผ็ถๅ่ฟ่ก่ฎขๅ็ฑปๅๅคๆญ
- ๅฆๆๅฏนๆ็้ๅไธๅฏน็ฉบ๏ผๅฆ๏ผ๏ผๅๅผๅงๅคๆญๅฝๅ่ฎขๅๆฏๅฆๅฎๅ
จไบคๆ
- ๅฆๆๆๅฉไฝ๏ผๆฏ๏ผ๏ผๅ็ปง็ปญๅคๆญๅฏนๆ็้กถ้จ่ฎขๅๆฏๅฆๅน้
- ๅฆๆๅฏนๆๅๅน้
ไธไบ๏ผๆฏ๏ผ๏ผๅ่ฟ่กๅๅปบไบคๆใๆดๆฐ่ฎขๅ็ถๆใๆดๆฐไปทๆ ผ๏ผๅๅคๆญๅฏนๆๅๆฏๅฆๅฎๅ
จไบคๆ
- ๅฆๆๅฏนๆๅๅฎๅ จไบคๆ๏ผๆฏ๏ผ๏ผๅๅฐๅฏนๆๅ็งปๅบ้ๅ
- ๅฆๆๅฏนๆๅๆฒกๆๅฎๅ จไบคๆ๏ผๅฆ๏ผ๏ผๅ่ฟๅๅฝๅ่ฎขๅๆฏๅฆๅฎๅ จไบคๆ็ๅคๆญๅๆฏ
- ๅฆๆๅฏนๆๅๆฒกๆๅน้
ไธ๏ผๅฆ๏ผ๏ผๅ ๅ
ฅ่ฎขๅ็ฐฟ๏ผๅๅคๆญ่ฎขๅ็ฑปๅ๏ผlimit/market๏ผ
- ้ไปทๅ limit๏ผๆฏ๏ผ๏ผๅ ๅ ฅๅฏนๅบๅฏนๆ็้ๅ๏ผ่ฟๅไบคๆ็ปๆ
- ๅธไปทๅ market๏ผๅฆ๏ผ๏ผ่ฟๅไบคๆ็ปๆ
- ๅฆๆๅฏนๆๅๅน้
ไธไบ๏ผๆฏ๏ผ๏ผๅ่ฟ่กๅๅปบไบคๆใๆดๆฐ่ฎขๅ็ถๆใๆดๆฐไปทๆ ผ๏ผๅๅคๆญๅฏนๆๅๆฏๅฆๅฎๅ
จไบคๆ
- ๅฆๆๆฒกๆๅฉไฝ๏ผๅฆ๏ผ๏ผ่ฟๅไบคๆ็ปๆ
- ๅฆๆๆๅฉไฝ๏ผๆฏ๏ผ๏ผๅ็ปง็ปญๅคๆญๅฏนๆ็้กถ้จ่ฎขๅๆฏๅฆๅน้
flowchart TD
Start([ๆฐ่ฎขๅ่ฟๅ
ฅ]) --> GetBook[่ทๅ่ฎขๅ็ฐฟ]
GetBook --> Lock[ๅ ้่ฎขๅ็ฐฟ]
Lock --> GetCounter{่ทๅๅฏนๆ็้ๅ}
GetCounter -->|ไนฐๅ| SellQueue[่ทๅๅๅ้ๅ]
GetCounter -->|ๅๅ| BuyQueue[่ทๅไนฐๅ้ๅ]
SellQueue --> CheckEmpty
BuyQueue --> CheckEmpty
CheckEmpty{ๅฏนๆ็ๆฏๅฆไธบ็ฉบ?}
CheckEmpty -->|ๆฏ| AddToBook[ๅ ๅ
ฅ่ฎขๅ็ฐฟ]
CheckEmpty -->|ๅฆ| CheckRemaining{ๅฝๅ่ฎขๅๆฏๅฆ่ฟๆๅฉไฝ?}
CheckRemaining -->|ๅฆ| Unlock[่งฃ้]
CheckRemaining -->|ๆฏ| PeekCounter[ๆฅ็ๅฏนๆ็้กถ้จ่ฎขๅ]
PeekCounter --> CanMatch{ไปทๆ ผๆฏๅฆๅน้
?}
CanMatch -->|ๅฆ| AddToBook
CanMatch -->|ๆฏ| CalcTrade[่ฎก็ฎๆไบค้ๅไปทๆ ผ]
CalcTrade --> CreateTrade[ๅๅปบไบคๆ่ฎฐๅฝ]
CreateTrade --> UpdateOrders[ๆดๆฐ่ฎขๅ็ถๆ]
UpdateOrders --> UpdatePrice[ๆดๆฐๆๆฐไปทๆ ผ]
UpdatePrice --> CheckCounterFilled{ๅฏนๆๅๆฏๅฆๅฎๅ
จๆไบค?}
CheckCounterFilled -->|ๆฏ| RemoveCounter[ไป้ๅ็งป้คๅฏนๆๅ]
CheckCounterFilled -->|ๅฆ| CheckRemaining
RemoveCounter --> CheckRemaining
AddToBook --> CheckLimit{ๆฏๅฆไธบ้ไปทๅ?}
CheckLimit -->|ๆฏ| AddLimit[ๅ ๅ
ฅๅฏนๅบ้ๅ]
CheckLimit -->|ๅฆ| Unlock
AddLimit --> Unlock
Unlock --> End([่ฟๅไบคๆ็ปๆ])
style Start fill:#e1f5fe
style End fill:#e8f5e8
style CreateTrade fill:#fff3e0
style CanMatch fill:#fce4ec
ไปทๆ ผ-ๆถ้ดไผๅ ๅๅ๏ผ
flowchart TD
Compare[ๆฏ่พไธคไธช่ฎขๅ] --> SamePrice{ไปทๆ ผ็ธๅ?}
SamePrice -->|ๆฏ| TimeFirst[ๆถ้ดไผๅ
]
SamePrice -->|ๅฆ| CheckSide{ไนฐๅ่ฟๆฏๅๅ?}
CheckSide -->|ไนฐๅ| HigherPrice[ไปทๆ ผ้ซ็ไผๅ
]
CheckSide -->|ๅๅ| LowerPrice[ไปทๆ ผไฝ็ไผๅ
]
TimeFirst --> Earlier[ๆถ้ดๆฉ็ไผๅ
]
HigherPrice --> BuyResult[ไนฐๅ้ๅๆๅบ็ปๆ]
LowerPrice --> SellResult[ๅๅ้ๅๆๅบ็ปๆ]
Earlier --> TimeResult[ๆถ้ดๆๅบ็ปๆ]
style Compare fill:#e3f2fd
style TimeFirst fill:#f3e5f5
style HigherPrice fill:#e8f5e8
style LowerPrice fill:#ffebee
่ฎขๅๅนถๅๅค็ๆกๆถ๏ผ
่ฟ้็ดๆฅ็จ go ไปฃ็ ่ฏดๆ๏ผ
้็จ็ๆฏ ๅผๆญฅ+ๅๆญฅ ๆนๅผ่ฟ่กใ
func (e *matchingEngine) ProcessOrder(ctx context.Context, order *model.Order) ([]*model.Trade, error) {
resultChan := make(chan *MatchResult, 1)
// ๅผๆญฅๅค็่ฎขๅ๏ผๅ ๅ
ฅ่ฎขๅๅค็้้
select {
case e.orderChan <- &OrderRequest{Order: order, ResultChan: resultChan}:
case <-ctx.Done():
return nil, ctx.Err()
}
// ๅๆญฅ็ญๅพ
ๅค็็ปๆ
select {
case result := <-resultChan:
return result.Trades, result.Error
case <-ctx.Done():
return nil, ctx.Err()
}
}sequenceDiagram
participant Client as ๅฎขๆท็ซฏ
participant Engine as ๆฎๅๅผๆ
participant OrderChan as ่ฎขๅ้้
participant Processor as ๅค็ๅ็จ
participant OrderBook as ่ฎขๅ็ฐฟ
participant TradeChan as ไบคๆ้้
Client->>Engine: ProcessOrder(order)
Engine->>OrderChan: ๅ้ OrderRequest
Note over Engine: ้้ปๅก่ฟๅ
Processor->>OrderChan: ๆฅๆถ่ฎขๅ่ฏทๆฑ
Processor->>OrderBook: ๆง่กๆฎๅ
OrderBook-->>Processor: ่ฟๅไบคๆ็ปๆ
alt ๆๆไบค
Processor->>TradeChan: ๅ้ไบคๆ่ฎฐๅฝ
end
Processor->>Engine: ้่ฟ ResultChan ่ฟๅ
Engine-->>Client: ่ฟๅไบคๆ็ปๆ

