package main import ( "git.beejay.kim/Gshopper/sentio" ) var Strategy = alpacaQQQ{} type alpacaQQQ struct{} func (s alpacaQQQ) Name() string { return "Alpaca: QQQ [TQQQ : SQQQ]" } func (s alpacaQQQ) Model() string { return "qqq08f" } func (s alpacaQQQ) MarketId() string { return "alpaca" } func (s alpacaQQQ) PositionSymbols() map[sentio.Side]string { return map[sentio.Side]string{ sentio.BASE: "QQQ", sentio.LONG: "TQQQ", 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() { if sentio.BASE == side { continue } 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.00009 { orders = append(orders, sentio.StrategyOrder{ Symbol: symbol, Action: sentio.OrderSell, Ratio: 1, }) } if ok && sentio.SHORT == side && proba > .9999 { orders = append(orders, sentio.StrategyOrder{ Symbol: symbol, Action: sentio.OrderSell, Ratio: 1, }) } if t.Hour() == 19 && t.Minute() > 29 { continue } if sentio.LONG == side && proba > 1.0009 { if ok && position != nil && position.GetCurrentPrice() > position.GetAvgPrice() { continue } orders = append(orders, sentio.StrategyOrder{ Symbol: symbol, Action: sentio.OrderBuy, Ratio: func() float64 { if t.Hour() >= 18 { return .3 } if ok { return .4 } else { return .6 } }(), }) continue } if sentio.SHORT == side && proba < .99955 { // prevent extra orders if our position is cheaper if ok && position != nil && position.GetCurrentPrice() > position.GetAvgPrice() { continue } orders = append(orders, sentio.StrategyOrder{ Symbol: symbol, Action: sentio.OrderBuy, Ratio: func() float64 { if t.Hour() >= 18 { return .3 } if ok { return .4 } else { return .6 } }(), }) continue } } return orders, nil }