mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-26 08:45:16 +00:00
pivotshort: refactor pivot low collector
This commit is contained in:
parent
b746f801f7
commit
ac496e8488
|
@ -42,16 +42,15 @@ type BreakLow struct {
|
||||||
|
|
||||||
TrendEMA *TrendEMA `json:"trendEMA"`
|
TrendEMA *TrendEMA `json:"trendEMA"`
|
||||||
|
|
||||||
|
|
||||||
lastLow fixedpoint.Value
|
lastLow fixedpoint.Value
|
||||||
pivot *indicator.PivotLow
|
pivotLow *indicator.PivotLow
|
||||||
|
pivotLowPrices []fixedpoint.Value
|
||||||
|
|
||||||
stopEWMA *indicator.EWMA
|
stopEWMA *indicator.EWMA
|
||||||
|
|
||||||
trendEWMA *indicator.EWMA
|
trendEWMA *indicator.EWMA
|
||||||
trendEWMALast, trendEWMACurrent float64
|
trendEWMALast, trendEWMACurrent float64
|
||||||
|
|
||||||
pivotLowPrices []fixedpoint.Value
|
|
||||||
|
|
||||||
orderExecutor *bbgo.GeneralOrderExecutor
|
orderExecutor *bbgo.GeneralOrderExecutor
|
||||||
session *bbgo.ExchangeSession
|
session *bbgo.ExchangeSession
|
||||||
}
|
}
|
||||||
|
@ -79,7 +78,7 @@ func (s *BreakLow) Bind(session *bbgo.ExchangeSession, orderExecutor *bbgo.Gener
|
||||||
|
|
||||||
s.lastLow = fixedpoint.Zero
|
s.lastLow = fixedpoint.Zero
|
||||||
|
|
||||||
s.pivot = standardIndicator.PivotLow(s.IntervalWindow)
|
s.pivotLow = standardIndicator.PivotLow(s.IntervalWindow)
|
||||||
|
|
||||||
if s.StopEMA != nil {
|
if s.StopEMA != nil {
|
||||||
s.stopEWMA = standardIndicator.EWMA(s.StopEMA.IntervalWindow)
|
s.stopEWMA = standardIndicator.EWMA(s.StopEMA.IntervalWindow)
|
||||||
|
@ -96,55 +95,22 @@ func (s *BreakLow) Bind(session *bbgo.ExchangeSession, orderExecutor *bbgo.Gener
|
||||||
|
|
||||||
// update pivot low data
|
// update pivot low data
|
||||||
session.MarketDataStream.OnStart(func() {
|
session.MarketDataStream.OnStart(func() {
|
||||||
lastLow := fixedpoint.NewFromFloat(s.pivot.Last())
|
if s.updatePivotLow() {
|
||||||
if lastLow.IsZero() {
|
bbgo.Notify("%s new pivot low: %f", s.Symbol, s.pivotLow.Last())
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if lastLow.Compare(s.lastLow) != 0 {
|
s.pilotQuantityCalculation()
|
||||||
bbgo.Notify("%s found new pivot low: %f", s.Symbol, s.pivot.Last())
|
|
||||||
}
|
|
||||||
|
|
||||||
s.lastLow = lastLow
|
|
||||||
s.pivotLowPrices = append(s.pivotLowPrices, s.lastLow)
|
|
||||||
|
|
||||||
log.Infof("pilot calculation for max position: last low = %f, quantity = %f, leverage = %f",
|
|
||||||
s.lastLow.Float64(),
|
|
||||||
s.Quantity.Float64(),
|
|
||||||
s.Leverage.Float64())
|
|
||||||
|
|
||||||
quantity, err := risk.CalculateBaseQuantity(s.session, s.Market, s.lastLow, s.Quantity, s.Leverage)
|
|
||||||
if err != nil {
|
|
||||||
log.WithError(err).Errorf("quantity calculation error")
|
|
||||||
}
|
|
||||||
|
|
||||||
if quantity.IsZero() {
|
|
||||||
log.WithError(err).Errorf("quantity is zero, can not submit order")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
bbgo.Notify("%s %f quantity will be used for shorting", s.Symbol, quantity.Float64())
|
|
||||||
})
|
})
|
||||||
|
|
||||||
session.MarketDataStream.OnKLineClosed(types.KLineWith(symbol, s.Interval, func(kline types.KLine) {
|
session.MarketDataStream.OnKLineClosed(types.KLineWith(symbol, s.Interval, func(kline types.KLine) {
|
||||||
lastLow := fixedpoint.NewFromFloat(s.pivot.Last())
|
if s.updatePivotLow() {
|
||||||
if lastLow.IsZero() {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if lastLow.Compare(s.lastLow) == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
s.lastLow = lastLow
|
|
||||||
s.pivotLowPrices = append(s.pivotLowPrices, s.lastLow)
|
|
||||||
|
|
||||||
// when position is opened, do not send pivot low notify
|
// when position is opened, do not send pivot low notify
|
||||||
if position.IsOpened(kline.Close) {
|
if position.IsOpened(kline.Close) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
bbgo.Notify("%s new pivot low: %f", s.Symbol, s.pivot.Last())
|
bbgo.Notify("%s new pivot low: %f", s.Symbol, s.pivotLow.Last())
|
||||||
|
}
|
||||||
}))
|
}))
|
||||||
|
|
||||||
session.MarketDataStream.OnKLineClosed(types.KLineWith(symbol, types.Interval1m, func(kline types.KLine) {
|
session.MarketDataStream.OnKLineClosed(types.KLineWith(symbol, types.Interval1m, func(kline types.KLine) {
|
||||||
|
@ -251,3 +217,33 @@ func (s *BreakLow) Bind(session *bbgo.ExchangeSession, orderExecutor *bbgo.Gener
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *BreakLow) pilotQuantityCalculation() {
|
||||||
|
log.Infof("pilot calculation for max position: last low = %f, quantity = %f, leverage = %f",
|
||||||
|
s.lastLow.Float64(),
|
||||||
|
s.Quantity.Float64(),
|
||||||
|
s.Leverage.Float64())
|
||||||
|
|
||||||
|
quantity, err := risk.CalculateBaseQuantity(s.session, s.Market, s.lastLow, s.Quantity, s.Leverage)
|
||||||
|
if err != nil {
|
||||||
|
log.WithError(err).Errorf("quantity calculation error")
|
||||||
|
}
|
||||||
|
|
||||||
|
if quantity.IsZero() {
|
||||||
|
log.WithError(err).Errorf("quantity is zero, can not submit order")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
bbgo.Notify("%s %f quantity will be used for shorting", s.Symbol, quantity.Float64())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *BreakLow) updatePivotLow() bool {
|
||||||
|
lastLow := fixedpoint.NewFromFloat(s.pivotLow.Last())
|
||||||
|
if lastLow.IsZero() || lastLow.Compare(s.lastLow) == 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
s.lastLow = lastLow
|
||||||
|
s.pivotLowPrices = append(s.pivotLowPrices, lastLow)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user