mirror of
https://github.com/c9s/bbgo.git
synced 2024-09-20 00:01:09 +00:00
audacity: finalize strategy
This commit is contained in:
parent
713ead669e
commit
8b97e4c4e8
|
@ -16,6 +16,6 @@ exchangeStrategies:
|
|||
- on: binance
|
||||
audacitymaker:
|
||||
symbol: ETHBUSD
|
||||
perTrade:
|
||||
orderFlow:
|
||||
interval: 1m
|
||||
quantity: 0.01
|
|
@ -2,8 +2,6 @@ package audacitymaker
|
|||
|
||||
import (
|
||||
"context"
|
||||
"math"
|
||||
|
||||
"github.com/c9s/bbgo/pkg/bbgo"
|
||||
"github.com/c9s/bbgo/pkg/datatype/floats"
|
||||
"github.com/c9s/bbgo/pkg/fixedpoint"
|
||||
|
@ -54,12 +52,14 @@ func (s *PerTrade) Bind(session *bbgo.ExchangeSession, orderExecutor *bbgo.Gener
|
|||
var orderFlowSize floats.Slice
|
||||
var orderFlowNumber floats.Slice
|
||||
|
||||
var orderFlowSizeMinMaxArcCos floats.Slice
|
||||
var orderFlowNumberMinMaxArcCos floats.Slice
|
||||
var orderFlowSizeMinMax floats.Slice
|
||||
var orderFlowNumberMinMax floats.Slice
|
||||
|
||||
threshold := 3.
|
||||
|
||||
session.MarketDataStream.OnMarketTrade(func(trade types.Trade) {
|
||||
|
||||
log.Infof("%s trade @ %f", trade.Side, trade.Price.Float64())
|
||||
//log.Infof("%s trade @ %f", trade.Side, trade.Price.Float64())
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
|
@ -80,43 +80,47 @@ func (s *PerTrade) Bind(session *bbgo.ExchangeSession, orderExecutor *bbgo.Gener
|
|||
sellTradesNumber.Update(1)
|
||||
}
|
||||
|
||||
canceled := s.orderExecutor.GracefulCancel(ctx)
|
||||
if canceled != nil {
|
||||
_ = s.orderExecutor.GracefulCancel(ctx)
|
||||
}
|
||||
//canceled := s.orderExecutor.GracefulCancel(ctx)
|
||||
//if canceled != nil {
|
||||
// _ = s.orderExecutor.GracefulCancel(ctx)
|
||||
//}
|
||||
|
||||
sizeFraction := buyTradeSize.Sum() / sellTradeSize.Sum()
|
||||
numberFraction := buyTradesNumber.Sum() / sellTradesNumber.Sum()
|
||||
orderFlowSize.Push(sizeFraction)
|
||||
if orderFlowSize.Length() > 100 {
|
||||
// min-max scaling
|
||||
oaMax := orderFlowSize.Tail(100).Max()
|
||||
oaMin := orderFlowSize.Tail(100).Min()
|
||||
oaMinMax := (orderFlowSize.Last() - oaMin) / (oaMax - oaMin)
|
||||
ofsMax := orderFlowSize.Tail(100).Max()
|
||||
ofsMin := orderFlowSize.Tail(100).Min()
|
||||
ofsMinMax := (orderFlowSize.Last() - ofsMin) / (ofsMax - ofsMin)
|
||||
// preserves temporal dependency via polar encoded angles
|
||||
orderFlowSizeMinMaxArcCos.Push(math.Cosh(oaMinMax))
|
||||
orderFlowSizeMinMax.Push(ofsMinMax)
|
||||
}
|
||||
|
||||
orderFlowNumber.Push(numberFraction)
|
||||
if orderFlowNumber.Length() > 100 {
|
||||
// min-max scaling
|
||||
ofMax := orderFlowNumber.Tail(100).Max()
|
||||
ofMin := orderFlowNumber.Tail(100).Min()
|
||||
ofMinMax := (orderFlowNumber.Last() - ofMin) / (ofMax - ofMin)
|
||||
ofnMax := orderFlowNumber.Tail(100).Max()
|
||||
ofnMin := orderFlowNumber.Tail(100).Min()
|
||||
ofnMinMax := (orderFlowNumber.Last() - ofnMin) / (ofnMax - ofnMin)
|
||||
// preserves temporal dependency via polar encoded angles
|
||||
orderFlowNumberMinMaxArcCos.Push(math.Cosh(ofMinMax))
|
||||
orderFlowNumberMinMax.Push(ofnMinMax)
|
||||
}
|
||||
|
||||
if orderFlowSizeMinMaxArcCos.Length() > 100 && orderFlowNumberMinMaxArcCos.Length() > 100 {
|
||||
if orderFlowSizeMinMax.Length() > 100 && orderFlowNumberMinMax.Length() > 100 {
|
||||
bid, ask, _ := s.StreamBook.BestBidAndAsk()
|
||||
if outlier(orderFlowSizeMinMaxArcCos.Tail(100), 2) > 0 && outlier(orderFlowNumberMinMaxArcCos.Tail(100), 2) > 0 {
|
||||
if outlier(orderFlowSizeMinMax.Tail(100), threshold) > 0 && outlier(orderFlowNumberMinMax.Tail(100), threshold) > 0 {
|
||||
_ = s.orderExecutor.GracefulCancel(ctx)
|
||||
log.Infof("long!!")
|
||||
//_ = s.placeTrade(ctx, types.SideTypeBuy, s.Quantity, symbol)
|
||||
_ = s.placeOrder(ctx, types.SideTypeBuy, s.Quantity, bid.Price, symbol)
|
||||
_ = s.placeOrder(ctx, types.SideTypeSell, s.Quantity, trade.Price.Mul(fixedpoint.NewFromFloat(1.0005)), symbol)
|
||||
} else if outlier(orderFlowSizeMinMaxArcCos.Tail(100), 2) < 0 && outlier(orderFlowNumberMinMaxArcCos.Tail(100), 2) < 0 {
|
||||
//_ = s.placeOrder(ctx, types.SideTypeSell, s.Quantity, ask.Price.Mul(fixedpoint.NewFromFloat(1.0005)), symbol)
|
||||
} else if outlier(orderFlowSizeMinMax.Tail(100), threshold) < 0 && outlier(orderFlowNumberMinMax.Tail(100), threshold) < 0 {
|
||||
_ = s.orderExecutor.GracefulCancel(ctx)
|
||||
log.Infof("short!!")
|
||||
//_ = s.placeTrade(ctx, types.SideTypeSell, s.Quantity, symbol)
|
||||
_ = s.placeOrder(ctx, types.SideTypeSell, s.Quantity, ask.Price, symbol)
|
||||
_ = s.placeOrder(ctx, types.SideTypeBuy, s.Quantity, trade.Price.Mul(fixedpoint.NewFromFloat(0.9995)), symbol)
|
||||
//_ = s.placeOrder(ctx, types.SideTypeBuy, s.Quantity, bid.Price.Mul(fixedpoint.NewFromFloat(0.9995)), symbol)
|
||||
}
|
||||
}
|
||||
|
|
@ -41,7 +41,7 @@ type Strategy struct {
|
|||
|
||||
activeOrders *bbgo.ActiveOrderBook
|
||||
|
||||
PerTrade *PerTrade `json:"perTrade"`
|
||||
OrderFlow *PerTrade `json:"orderFlow"`
|
||||
|
||||
ExitMethods bbgo.ExitMethodSet `json:"exits"`
|
||||
|
||||
|
@ -55,7 +55,7 @@ type Strategy struct {
|
|||
func (s *Strategy) Subscribe(session *bbgo.ExchangeSession) {
|
||||
session.Subscribe(types.BookChannel, s.Symbol, types.SubscribeOptions{})
|
||||
session.Subscribe(types.MarketTradeChannel, s.Symbol, types.SubscribeOptions{})
|
||||
session.Subscribe(types.KLineChannel, s.Symbol, types.SubscribeOptions{Interval: s.PerTrade.Interval})
|
||||
session.Subscribe(types.KLineChannel, s.Symbol, types.SubscribeOptions{Interval: s.OrderFlow.Interval})
|
||||
|
||||
if !bbgo.IsBackTesting {
|
||||
session.Subscribe(types.MarketTradeChannel, s.Symbol, types.SubscribeOptions{})
|
||||
|
@ -119,8 +119,8 @@ func (s *Strategy) Run(ctx context.Context, orderExecutor bbgo.OrderExecutor, se
|
|||
method.Bind(session, s.orderExecutor)
|
||||
}
|
||||
|
||||
if s.PerTrade != nil {
|
||||
s.PerTrade.Bind(session, s.orderExecutor)
|
||||
if s.OrderFlow != nil {
|
||||
s.OrderFlow.Bind(session, s.orderExecutor)
|
||||
}
|
||||
|
||||
bbgo.OnShutdown(func(ctx context.Context, wg *sync.WaitGroup) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user