mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-10 09:11:55 +00:00
improve/linregmaker: add profit report
This commit is contained in:
parent
bc4eae5e39
commit
e5254e6446
|
@ -175,3 +175,12 @@ exchangeStrategies:
|
||||||
# roiStopLoss is the stop loss percentage of the position ROI (currently the price change)
|
# roiStopLoss is the stop loss percentage of the position ROI (currently the price change)
|
||||||
- roiStopLoss:
|
- roiStopLoss:
|
||||||
percentage: 30%
|
percentage: 30%
|
||||||
|
|
||||||
|
profitStatsTracker:
|
||||||
|
interval: 1d
|
||||||
|
window: 30
|
||||||
|
accumulatedProfitReport:
|
||||||
|
profitMAWindow: 60
|
||||||
|
shortTermProfitWindow: 14
|
||||||
|
tsvReportPath: res.tsv
|
||||||
|
trackParameters: false
|
||||||
|
|
|
@ -3,6 +3,8 @@ package linregmaker
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/c9s/bbgo/pkg/report"
|
||||||
|
"os"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/c9s/bbgo/pkg/risk/dynamicrisk"
|
"github.com/c9s/bbgo/pkg/risk/dynamicrisk"
|
||||||
|
@ -135,6 +137,10 @@ type Strategy struct {
|
||||||
ProfitStats *types.ProfitStats `persistence:"profit_stats"`
|
ProfitStats *types.ProfitStats `persistence:"profit_stats"`
|
||||||
TradeStats *types.TradeStats `persistence:"trade_stats"`
|
TradeStats *types.TradeStats `persistence:"trade_stats"`
|
||||||
|
|
||||||
|
// ProfitStatsTracker tracks profit related status and generates report
|
||||||
|
ProfitStatsTracker *report.ProfitStatsTracker `json:"profitStatsTracker"`
|
||||||
|
TrackParameters bool `json:"trackParameters"`
|
||||||
|
|
||||||
Environment *bbgo.Environment
|
Environment *bbgo.Environment
|
||||||
StandardIndicatorSet *bbgo.StandardIndicatorSet
|
StandardIndicatorSet *bbgo.StandardIndicatorSet
|
||||||
Market types.Market
|
Market types.Market
|
||||||
|
@ -242,6 +248,11 @@ func (s *Strategy) Subscribe(session *bbgo.ExchangeSession) {
|
||||||
if len(s.DynamicQuantityDecrease) > 0 {
|
if len(s.DynamicQuantityDecrease) > 0 {
|
||||||
s.DynamicQuantityDecrease.Initialize(s.Symbol, session)
|
s.DynamicQuantityDecrease.Initialize(s.Symbol, session)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Profit tracker
|
||||||
|
if s.ProfitStatsTracker != nil {
|
||||||
|
s.ProfitStatsTracker.Subscribe(session, s.Symbol)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Strategy) CurrentPosition() *types.Position {
|
func (s *Strategy) CurrentPosition() *types.Position {
|
||||||
|
@ -664,6 +675,27 @@ func (s *Strategy) Run(ctx context.Context, orderExecutor bbgo.OrderExecutor, se
|
||||||
})
|
})
|
||||||
s.ExitMethods.Bind(session, s.orderExecutor)
|
s.ExitMethods.Bind(session, s.orderExecutor)
|
||||||
|
|
||||||
|
// Setup profit tracker
|
||||||
|
if s.ProfitStatsTracker != nil {
|
||||||
|
if s.ProfitStatsTracker.CurrentProfitStats == nil {
|
||||||
|
s.ProfitStatsTracker.InitLegacy(s.Market, &s.ProfitStats, s.TradeStats)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add strategy parameters to report
|
||||||
|
if s.TrackParameters && s.ProfitStatsTracker.AccumulatedProfitReport != nil {
|
||||||
|
s.ProfitStatsTracker.AccumulatedProfitReport.AddStrategyParameter("ReverseEMAWindow", fmt.Sprintf("%d", s.ReverseEMA.Window))
|
||||||
|
s.ProfitStatsTracker.AccumulatedProfitReport.AddStrategyParameter("FastLinRegInterval", fmt.Sprintf("%s", s.FastLinReg.Interval))
|
||||||
|
s.ProfitStatsTracker.AccumulatedProfitReport.AddStrategyParameter("SlowLinRegWindow", fmt.Sprintf("%d", s.SlowLinReg.Window))
|
||||||
|
s.ProfitStatsTracker.AccumulatedProfitReport.AddStrategyParameter("SlowLinRegInterval", fmt.Sprintf("%s", s.SlowLinReg.Interval))
|
||||||
|
s.ProfitStatsTracker.AccumulatedProfitReport.AddStrategyParameter("FasterDecreaseRatio", fmt.Sprintf("%f", s.FasterDecreaseRatio))
|
||||||
|
s.ProfitStatsTracker.AccumulatedProfitReport.AddStrategyParameter("NeutralBollingerWindow", fmt.Sprintf("%d", s.NeutralBollinger.Window))
|
||||||
|
s.ProfitStatsTracker.AccumulatedProfitReport.AddStrategyParameter("NeutralBollingerBandWidth", fmt.Sprintf("%f", s.NeutralBollinger.BandWidth))
|
||||||
|
s.ProfitStatsTracker.AccumulatedProfitReport.AddStrategyParameter("Spread", fmt.Sprintf("%f", s.Spread))
|
||||||
|
}
|
||||||
|
|
||||||
|
s.ProfitStatsTracker.Bind(s.session, s.orderExecutor.TradeCollector())
|
||||||
|
}
|
||||||
|
|
||||||
// Indicators initialized by StandardIndicatorSet must be initialized in Run()
|
// Indicators initialized by StandardIndicatorSet must be initialized in Run()
|
||||||
// Initialize ReverseEMA
|
// Initialize ReverseEMA
|
||||||
s.ReverseEMA = s.StandardIndicatorSet.EWMA(s.ReverseEMA.IntervalWindow)
|
s.ReverseEMA = s.StandardIndicatorSet.EWMA(s.ReverseEMA.IntervalWindow)
|
||||||
|
@ -812,7 +844,15 @@ func (s *Strategy) Run(ctx context.Context, orderExecutor bbgo.OrderExecutor, se
|
||||||
bbgo.OnShutdown(ctx, func(ctx context.Context, wg *sync.WaitGroup) {
|
bbgo.OnShutdown(ctx, func(ctx context.Context, wg *sync.WaitGroup) {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
|
|
||||||
|
// Output profit report
|
||||||
|
if s.ProfitStatsTracker != nil {
|
||||||
|
if s.ProfitStatsTracker.AccumulatedProfitReport != nil {
|
||||||
|
s.ProfitStatsTracker.AccumulatedProfitReport.Output()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_ = s.orderExecutor.GracefulCancel(ctx)
|
_ = s.orderExecutor.GracefulCancel(ctx)
|
||||||
|
_, _ = fmt.Fprintln(os.Stderr, s.TradeStats.String())
|
||||||
})
|
})
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
Loading…
Reference in New Issue
Block a user