positionupdater: update base position

This commit is contained in:
Andy Cheng 2022-07-29 11:52:20 +08:00
parent ae6c6c90a7
commit 8c53c7e575
4 changed files with 151 additions and 2 deletions

View File

@ -27,12 +27,19 @@ type closePositionContext struct {
percentage fixedpoint.Value percentage fixedpoint.Value
} }
type updatePositionContext struct {
signature string
updater StrategyPositionUpdater
value fixedpoint.Value
}
type CoreInteraction struct { type CoreInteraction struct {
environment *Environment environment *Environment
trader *Trader trader *Trader
exchangeStrategies map[string]SingleExchangeStrategy exchangeStrategies map[string]SingleExchangeStrategy
closePositionContext closePositionContext closePositionContext closePositionContext
updatePositionContext updatePositionContext
} }
func NewCoreInteraction(environment *Environment, trader *Trader) *CoreInteraction { func NewCoreInteraction(environment *Environment, trader *Trader) *CoreInteraction {
@ -387,6 +394,56 @@ func (it *CoreInteraction) Commands(i *interact.Interact) {
reply.Message(fmt.Sprintf("Strategy %s stopped and the position closed.", signature)) reply.Message(fmt.Sprintf("Strategy %s stopped and the position closed.", signature))
return nil return nil
}) })
// Position updater
i.PrivateCommand("/updatepositionbase", "Update Strategy Position: Base", func(reply interact.Reply) error {
// it.trader.exchangeStrategies
// send symbol options
if strategies, found := filterStrategyByInterface((*StrategyPositionUpdater)(nil), it.exchangeStrategies); found {
reply.AddMultipleButtons(generateStrategyButtonsForm(strategies))
reply.Message("Please choose one strategy")
} else {
reply.Message("No strategy supports StrategyPositionUpdater")
}
return nil
}).Next(func(signature string, reply interact.Reply) error {
strategy, ok := it.exchangeStrategies[signature]
if !ok {
reply.Message("Strategy not found")
return fmt.Errorf("strategy %s not found", signature)
}
updater, implemented := strategy.(StrategyPositionUpdater)
if !implemented {
reply.Message(fmt.Sprintf("Strategy %s does not support StrategyPositionUpdater", signature))
return fmt.Errorf("strategy %s does not implement StrategyPositionUpdater", signature)
}
it.updatePositionContext.updater = updater
it.updatePositionContext.signature = signature
reply.Message("Enter the amount to change")
return nil
}).Next(func(valueStr string, reply interact.Reply) error {
value, err := strconv.ParseFloat(valueStr, 64)
if err != nil {
reply.Message(fmt.Sprintf("%q is not a valid value string", valueStr))
return err
}
if kc, ok := reply.(interact.KeyboardController); ok {
kc.RemoveKeyboard()
}
if err := it.updatePositionContext.updater.UpdateBase(value); err != nil {
reply.Message(fmt.Sprintf("Failed to update base position of the strategy, %s", err.Error()))
return err
}
reply.Message(fmt.Sprintf("Base position of strategy %s updated.", it.updatePositionContext.signature))
return nil
})
} }
func (it *CoreInteraction) Initialize() error { func (it *CoreInteraction) Initialize() error {

View File

@ -0,0 +1,46 @@
package bbgo
import (
"github.com/c9s/bbgo/pkg/fixedpoint"
"github.com/c9s/bbgo/pkg/types"
)
//go:generate callbackgen -type PositionUpdater -interface
type PositionUpdater struct {
Position *types.Position
// Callbacks
updateBaseCallbacks []func()
updateQuoteCallbacks []func()
updateAverageCostCallbacks []func()
}
func (s *PositionUpdater) UpdateBase(qty float64) error {
s.Position.Base = fixedpoint.NewFromFloat(qty)
s.EmitUpdateBase()
return nil
}
func (s *PositionUpdater) UpdateQuote(qty float64) error {
s.Position.Quote = fixedpoint.NewFromFloat(qty)
s.EmitUpdateQuote()
return nil
}
func (s *PositionUpdater) UpdateAverageCost(price float64) error {
s.Position.AverageCost = fixedpoint.NewFromFloat(price)
s.EmitUpdateAverageCost()
return nil
}
type StrategyPositionUpdater interface {
UpdateBase(qty float64) error
UpdateQuote(qty float64) error
UpdateAverageCost(price float64) error
}

View File

@ -0,0 +1,43 @@
// Code generated by "callbackgen -type PositionUpdater -interface"; DO NOT EDIT.
package bbgo
import ()
func (s *PositionUpdater) OnUpdateBase(cb func()) {
s.updateBaseCallbacks = append(s.updateBaseCallbacks, cb)
}
func (s *PositionUpdater) EmitUpdateBase() {
for _, cb := range s.updateBaseCallbacks {
cb()
}
}
func (s *PositionUpdater) OnUpdateQuote(cb func()) {
s.updateQuoteCallbacks = append(s.updateQuoteCallbacks, cb)
}
func (s *PositionUpdater) EmitUpdateQuote() {
for _, cb := range s.updateQuoteCallbacks {
cb()
}
}
func (s *PositionUpdater) OnUpdateAverageCost(cb func()) {
s.updateAverageCostCallbacks = append(s.updateAverageCostCallbacks, cb)
}
func (s *PositionUpdater) EmitUpdateAverageCost() {
for _, cb := range s.updateAverageCostCallbacks {
cb()
}
}
type PositionUpdaterEventHub interface {
OnUpdateBase(cb func())
OnUpdateQuote(cb func())
OnUpdateAverageCost(cb func())
}

View File

@ -84,6 +84,9 @@ type Strategy struct {
// StrategyController // StrategyController
bbgo.StrategyController bbgo.StrategyController
// PositionUpdater
bbgo.PositionUpdater
} }
func (s *Strategy) ID() string { func (s *Strategy) ID() string {