package main import ( "git.beejay.kim/Gshopper/sentio" "github.com/samber/lo" "time" ) var Strategy = _ibkr{ clock: sentio.ClockUTC{}, } type _ibkr struct { clock sentio.Clock } func (s _ibkr) Name() string { return "BTC: BITO/BITI" } func (s _ibkr) Model() string { return "btc306" } func (s _ibkr) MarketId() string { return "ibkr" } func (s _ibkr) PositionSymbols() map[sentio.Side]string { return map[sentio.Side]string{ sentio.LONG: "521525019", // BITO sentio.SHORT: "569311092", // BITI } } func (s _ibkr) IsOpen() bool { utc := s.clock.Now() h := utc.Hour() m := utc.Minute() return (h == 13 && m >= 30 || h > 13) && h < 19 && utc.Weekday() != time.Saturday && utc.Weekday() != time.Sunday } func (s _ibkr) ShouldClosePositions(portfolio sentio.Portfolio, proba float64) []string { if !s.IsOpen() { p := lo.Map(portfolio.Positions(), func(item sentio.Position, _ int) string { return item.GetSymbol() }) symbols := lo.Values(s.PositionSymbols()) p = lo.Filter(p, func(item string, _ int) bool { return lo.Contains(symbols, item) }) return p } var ( utc = s.clock.Now() symbols []string ) if portfolio == nil { return nil } for side, symbol := range s.PositionSymbols() { position, ok := portfolio.Get(symbol) if !ok { continue } if position.GetSize() <= 0 { continue } if utc.Hour() >= 19 { symbols = append(symbols, symbol) continue } if sentio.LONG == side && proba < 1 { symbols = append(symbols, symbol) continue } if sentio.SHORT == side && proba > 1 { symbols = append(symbols, symbol) continue } } return symbols } func (s _ibkr) ShouldOpenPosition(portfolio sentio.Portfolio, proba float64) (*string, float64) { if !s.IsOpen() { return nil, 0 } if proba < 0 { return nil, 0 } for side, symbol := range s.PositionSymbols() { position, ok := portfolio.Get(symbol) if sentio.LONG == side && proba > 1.002 { if !ok || position.GetSize() <= 0 { return &symbol, .6 } else { return &symbol, .3 } } if sentio.SHORT == side && proba < 0.998 { if !ok || position.GetSize() <= 0 { return &symbol, .8 } else { return &symbol, .3 } } } return nil, 0 }