mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-10 17:13:51 +00:00
42 lines
902 B
Go
42 lines
902 B
Go
package bbgo
|
|
|
|
import (
|
|
"github.com/c9s/bbgo/pkg/fixedpoint"
|
|
"github.com/c9s/bbgo/pkg/types"
|
|
)
|
|
|
|
type Position struct {
|
|
Base fixedpoint.Value `json:"base"`
|
|
Quote fixedpoint.Value `json:"quote"`
|
|
AverageCost fixedpoint.Value `json:"averageCost"`
|
|
}
|
|
|
|
func (p *Position) AddTrade(t types.Trade) (fixedpoint.Value, bool) {
|
|
price := fixedpoint.NewFromFloat(t.Price)
|
|
quantity := fixedpoint.NewFromFloat(t.Quantity)
|
|
|
|
switch t.Side {
|
|
|
|
case types.SideTypeBuy:
|
|
|
|
if p.AverageCost == 0 {
|
|
p.AverageCost = price
|
|
} else {
|
|
p.AverageCost = (p.AverageCost.Mul(p.Base) + price.Mul(quantity)).Div(p.Base + quantity)
|
|
}
|
|
|
|
p.Base += quantity
|
|
p.Quote -= fixedpoint.NewFromFloat(t.QuoteQuantity)
|
|
|
|
return 0, false
|
|
|
|
case types.SideTypeSell:
|
|
p.Base -= quantity
|
|
p.Quote += fixedpoint.NewFromFloat(t.QuoteQuantity)
|
|
|
|
return (price - p.AverageCost).Mul(quantity), true
|
|
}
|
|
|
|
return 0, false
|
|
}
|