package main import ( "git.beejay.kim/Gshopper/sentio" ) var Strategy = _ib_qqq{ clock: sentio.ClockUTC{}, } type _ib_qqq struct { clock sentio.Clock } func (strategy _ib_qqq) Name() string { return "IBKR: QQQ" } func (strategy _ib_qqq) Model() string { return "qqq400" } func (strategy _ib_qqq) MarketId() string { return "ibkr" } func (strategy _ib_qqq) PositionSymbols() map[sentio.Side]string { return map[sentio.Side]string{ sentio.LONG: "320227571", // QQQ@NASDAQ } } func (strategy _ib_qqq) Handle(market sentio.Market, proba float64) ([]sentio.StrategyOrder, error) { if !market.IsMarketOpened() { return nil, sentio.ErrMarketClosed } var ( utc = strategy.clock.Now() portfolio sentio.Portfolio err error ) if portfolio, err = market.Portfolio(); err != nil { return nil, err } for _, symbol := range strategy.PositionSymbols() { var ( position sentio.Position ok bool ) if portfolio != nil { position, ok = portfolio.Get(symbol) ok = ok && position.GetSize() != 0 } // Close positions before market close if ok && utc.Hour() >= 19 && utc.Minute() >= 30 { return []sentio.StrategyOrder{ { Symbol: position.GetSymbol(), Action: func() sentio.OrderAction { if position.GetSize() > 0 { return sentio.OrderSell } else { return sentio.OrderBuy } }(), Ratio: 1, }, }, nil } if proba < 0 { continue } // Close LONG position if ok && position.GetSize() > 0 && proba < 1 { return []sentio.StrategyOrder{ { Symbol: position.GetSymbol(), Action: sentio.OrderSell, Ratio: 1, }, }, nil } // Close SHORT position if ok && position.GetSize() < 0 && proba > 1 { return []sentio.StrategyOrder{ { Symbol: position.GetSymbol(), Action: sentio.OrderBuy, Ratio: 1, }, }, nil } if utc.Hour() == 19 && utc.Minute() >= 30 { continue } if proba > 1.002 { return []sentio.StrategyOrder{ { Symbol: symbol, Action: sentio.OrderBuy, Ratio: func() float64 { if ok { return .3 } else { return .6 } }(), }, }, nil } if proba < .998 { return []sentio.StrategyOrder{ { Symbol: symbol, Action: sentio.OrderSell, Ratio: func() float64 { if ok { return .3 } else { return .6 } }(), }, }, nil } } return nil, nil }