| 
					
				 | 
			
			
				@@ -0,0 +1,157 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+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 "price_return_vqqq_15" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+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) Interval() uint8 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 5 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+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 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		err       error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if portfolio, err = market.Portfolio(); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return nil, err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for side, symbol := range s.PositionSymbols() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			position sentio.Position 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			ok       bool 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			t        = market.Time().Now() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// no need to trade BASE quote 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if sentio.BASE == side { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// skip too early trades 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if t.Hour() == 13 && t.Minute() < 40 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if portfolio != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			position, ok = portfolio.Get(symbol) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			ok = ok && position != nil && position.GetSize() != 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			ok = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// Close positions before market closed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if ok && t.Hour() == 19 && t.Minute() > 45 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			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.0001 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return []sentio.StrategyOrder{{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Symbol: symbol, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Action: sentio.OrderSell, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Ratio:  1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}}, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// Close SHORT position 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if ok && sentio.SHORT == side && proba > .9999 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return []sentio.StrategyOrder{{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Symbol: symbol, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Action: sentio.OrderSell, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Ratio:  1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}}, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if t.Hour() == 19 && t.Minute() > 35 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if sentio.LONG == side && proba > 1 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			size := float64(0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if ok && position.GetAvgPrice() > position.GetCurrentPrice() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// extra position with cheaper price 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				size = .4 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} else if !ok && proba > 1.00065 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// new trade position 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				size = .6 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if size > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				orders = append(orders, sentio.StrategyOrder{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					Symbol: symbol, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					Action: sentio.OrderBuy, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					Ratio:  size, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if sentio.SHORT == side && proba < 1 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			size := float64(0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if ok && position.GetAvgPrice() > position.GetCurrentPrice() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// extra position with cheaper price 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				size = .4 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} else if !ok && proba < .9992 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// new trade position 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				size = .6 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if size > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				orders = append(orders, sentio.StrategyOrder{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					Symbol: symbol, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					Action: sentio.OrderBuy, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					Ratio:  size, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return orders, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |