package main import ( "git.beejay.kim/Gshopper/sentio" ) var Strategy = alpacaQQQ{} type alpacaQQQ struct{} func (s alpacaQQQ) Name() string { return "Alpaca: QQQ / SQQQ" } func (s alpacaQQQ) Model() string { return "qqq001" } func (s alpacaQQQ) MarketId() string { return "alpaca" } func (s alpacaQQQ) PositionSymbols() map[sentio.Side]string { return map[sentio.Side]string{ sentio.LONG: "QQQ", sentio.SHORT: "SQQQ", } } func (s alpacaQQQ) Handle(market sentio.Market, proba float64) ([]sentio.StrategyOrder, error) { if !market.IsMarketOpened() { return nil, sentio.ErrMarketClosed } var ( portfolio sentio.Portfolio orders []sentio.StrategyOrder ok bool err error ) if portfolio, err = market.Portfolio(); err != nil { return nil, err } for side, symbol := range s.PositionSymbols() { var ( position sentio.Position t = market.Time().Now() ) if portfolio != nil { position, ok = portfolio.Get(symbol) ok = ok && position.GetSize() != 0 } else { ok = false } // Close positions before market closed if ok && t.Hour() >= 19 && t.Minute() >= 30 { orders = append(orders, sentio.StrategyOrder{ Symbol: symbol, Action: sentio.OrderSell, Ratio: 1, }) continue } if proba < 0 { continue } // Close LONG position if ok && sentio.LONG == side && proba < 1 { orders = append(orders, sentio.StrategyOrder{ Symbol: symbol, Action: sentio.OrderSell, Ratio: 1, }) continue } if ok && sentio.SHORT == side && proba > 1 { orders = append(orders, sentio.StrategyOrder{ Symbol: symbol, Action: sentio.OrderSell, Ratio: 1, }) continue } if t.Hour() == 19 && t.Minute() >= 30 { continue } if sentio.LONG == side && proba > 1.001 { if ok && position != nil && position.GetCurrentPrice() > position.GetAvgPrice() { continue } orders = append(orders, sentio.StrategyOrder{ Symbol: symbol, Action: sentio.OrderBuy, Ratio: func() float64 { if ok { return .3 } else { return .6 } }(), }) continue } if sentio.SHORT == side && proba < .9998 { if ok && position != nil && position.GetCurrentPrice() > position.GetAvgPrice() { continue } orders = append(orders, sentio.StrategyOrder{ Symbol: symbol, Action: sentio.OrderBuy, Ratio: func() float64 { if ok { return .3 } else { return .8 } }(), }) continue } } return orders, nil }