| 
					
				 | 
			
			
				@@ -8,9 +8,12 @@ import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	ATR_MULTIPLIER = 1.5 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	ATR_PERIOD     = 14 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	ATR_HHV        = 8 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	ATR_MULTIPLIER         = 1.5 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	ATR_PERIOD             = 14 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	ATR_HHV                = 10 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	ATR_STOPLOSS_THRESHOLD = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	EXTRA_POSITION_THRESHOLD = 1.002 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 var Strategy = alpacaQQQ{} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -64,11 +67,12 @@ func (s alpacaQQQ) Handle(market sentio.Market, ts time.Time, proba float64) ([] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for side, symbol := range s.PositionSymbols() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		var ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			position sentio.Position 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			quote    *sentio.Quote 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			bars     []sentio.Bar 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			sl       float64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			ok       bool 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			position   sentio.Position 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			quote      *sentio.Quote 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			bars       []sentio.Bar 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			stoploss   float64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			uptrending bool 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			ok         bool 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// no need to trade BASE quote 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -92,8 +96,10 @@ func (s alpacaQQQ) Handle(market sentio.Market, ts time.Time, proba float64) ([] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			trailing := indicator.AtrTrailingStopLoss(h, l, c, ATR_PERIOD, ATR_MULTIPLIER, ATR_HHV) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			sl = trailing[len(trailing)-1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			fmt.Printf("ATR Trailing StopLoss: [%f]\n", sl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			stoploss = trailing[len(trailing)-1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			uptrending = trailing[len(trailing)-1] > trailing[len(trailing)-2] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			fmt.Printf("ATR Trailing StopLoss: [%s: %f; uptrading: %v]\n", symbol, stoploss, uptrending) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if portfolio != nil { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -113,7 +119,7 @@ func (s alpacaQQQ) Handle(market sentio.Market, ts time.Time, proba float64) ([] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// Close position if BidPrice less than StopLoss 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if ok && quote.BidPrice < sl { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if ok && !uptrending && quote.BidPrice/stoploss < ATR_STOPLOSS_THRESHOLD { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return []sentio.StrategyOrder{{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				Symbol: symbol, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				Action: sentio.OrderSell, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -144,7 +150,7 @@ func (s alpacaQQQ) Handle(market sentio.Market, ts time.Time, proba float64) ([] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// Prevent BUYs for delayed probas 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if ts.Add(time.Minute * time.Duration(int64(s.Interval()/2))).Before(now) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if ts.Add(time.Minute * time.Duration(int64(s.Interval()/2))).Before(now.Round(time.Minute)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -153,20 +159,15 @@ func (s alpacaQQQ) Handle(market sentio.Market, ts time.Time, proba float64) ([] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		// Prevent BUYs if BID price less than StopLoss 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if quote.BidPrice < sl { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if sentio.LONG == side && proba > 1 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			size := float64(0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if ok && position.GetAvgPrice()/position.GetCurrentPrice() > 1.002 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if ok && position.GetAvgPrice()/position.GetCurrentPrice() > EXTRA_POSITION_THRESHOLD { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				// extra position with cheaper price 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				size = .4 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				size = .5 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} else if !ok && proba > 1.0008 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				// new trade position 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				size = .6 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				size = .7 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if size > 0 { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -183,12 +184,12 @@ func (s alpacaQQQ) Handle(market sentio.Market, ts time.Time, proba float64) ([] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if sentio.SHORT == side && proba < 1 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			size := float64(0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if ok && position.GetAvgPrice()/position.GetCurrentPrice() > 1.002 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if ok && position.GetAvgPrice()/position.GetCurrentPrice() > EXTRA_POSITION_THRESHOLD { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				// extra position with cheaper price 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				size = .4 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				size = .5 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} else if !ok && proba < .9990 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				// new trade position 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				size = .6 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				size = .7 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if size > 0 { 
			 |