Browse Source

Alpaca: QQQ

- SHORT separate symbol: SQQQ
Alexey Kim 5 months ago
parent
commit
3c6aa59477
1 changed files with 55 additions and 69 deletions
  1. 55 69
      strategy/alpaca/qqq/strategy.go

+ 55 - 69
strategy/alpaca/qqq/strategy.go

@@ -1,7 +1,6 @@
 package main
 
 import (
-	"errors"
 	"git.beejay.kim/Gshopper/sentio"
 )
 
@@ -23,7 +22,8 @@ func (s alpacaQQQ) MarketId() string {
 
 func (s alpacaQQQ) PositionSymbols() map[sentio.Side]string {
 	return map[sentio.Side]string{
-		sentio.LONG: "QQQ",
+		sentio.LONG:  "QQQ",
+		sentio.SHORT: "SQQQ",
 	}
 }
 
@@ -33,8 +33,8 @@ func (s alpacaQQQ) Handle(market sentio.Market, proba float64) ([]sentio.Strateg
 	}
 
 	var (
-		symbol    string
 		portfolio sentio.Portfolio
+		orders    []sentio.StrategyOrder
 		ok        bool
 		err       error
 	)
@@ -43,72 +43,58 @@ func (s alpacaQQQ) Handle(market sentio.Market, proba float64) ([]sentio.Strateg
 		return nil, err
 	}
 
-	if symbol, ok = s.PositionSymbols()[sentio.LONG]; !ok {
-		return nil, errors.New("incorrect strategy")
-	}
-
-	var (
-		position sentio.Position
-		act      sentio.OrderAction
-		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 {
-		act = sentio.OrderSell
-		if position.GetSize() < 0 {
-			act = sentio.OrderBuy
+	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
 		}
 
-		return []sentio.StrategyOrder{
-			{
-				Symbol: position.GetSymbol(),
-				Action: act,
+		// 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,
-			},
-		}, nil
-	}
+			})
+			continue
+		}
 
-	if proba < 0 {
-		return nil, nil
-	}
+		if proba < 0 {
+			continue
+		}
 
-	// Close LONG position
-	if ok && position.GetSize() > 0 && proba < 1 {
-		return []sentio.StrategyOrder{
-			{
-				Symbol: position.GetSymbol(),
+		// Close LONG position
+		if ok && sentio.LONG == side && proba < 1 {
+			orders = append(orders, sentio.StrategyOrder{
+				Symbol: symbol,
 				Action: sentio.OrderSell,
 				Ratio:  1,
-			},
-		}, nil
-	}
+			})
+			continue
+		}
 
-	// Close SHORT position
-	if ok && position.GetSize() < 0 && proba > 1 {
-		return []sentio.StrategyOrder{
-			{
-				Symbol: position.GetSymbol(),
-				Action: sentio.OrderBuy,
+		if ok && sentio.SHORT == side && proba > 1 {
+			orders = append(orders, sentio.StrategyOrder{
+				Symbol: symbol,
+				Action: sentio.OrderSell,
 				Ratio:  1,
-			},
-		}, nil
-	}
+			})
+			continue
+		}
 
-	if t.Hour() == 19 && t.Minute() >= 30 {
-		return nil, nil
-	}
+		if t.Hour() == 19 && t.Minute() >= 30 {
+			continue
+		}
 
-	if proba > 1.001 {
-		return []sentio.StrategyOrder{
-			{
+		if sentio.LONG == side && proba > 1.001 {
+			orders = append(orders, sentio.StrategyOrder{
 				Symbol: symbol,
 				Action: sentio.OrderBuy,
 				Ratio: func() float64 {
@@ -118,25 +104,25 @@ func (s alpacaQQQ) Handle(market sentio.Market, proba float64) ([]sentio.Strateg
 						return .6
 					}
 				}(),
-			},
-		}, nil
-	}
+			})
+			continue
+		}
 
-	if proba < .9998 {
-		return []sentio.StrategyOrder{
-			{
+		if sentio.SHORT == side && proba < .9998 {
+			orders = append(orders, sentio.StrategyOrder{
 				Symbol: symbol,
-				Action: sentio.OrderSell,
+				Action: sentio.OrderBuy,
 				Ratio: func() float64 {
 					if ok {
 						return .3
 					} else {
-						return .6
+						return .8
 					}
 				}(),
-			},
-		}, nil
+			})
+			continue
+		}
 	}
 
-	return nil, nil
+	return orders, nil
 }