Overall Statistics
Total Trades
0
Average Win
0%
Average Loss
0%
Compounding Annual Return
0%
Drawdown
0%
Expectancy
0
Net Profit
0%
Sharpe Ratio
0
Probabilistic Sharpe Ratio
0%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0
Beta
0
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
-2.268
Tracking Error
0.113
Treynor Ratio
0
Total Fees
$0.00
from collections import deque
from datetime import datetime, timedelta
from numpy import sum
import numpy as np
from scipy import stats


class CustomIndicatorAlgorithm(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2019,1,1)
        self.SetEndDate(2019,12,31)
        
        
        symbol="SPY"
        self.AddEquity(symbol, Resolution.Daily)
        
        self.slopy = custom_slope('custom', 100)
        history = self.History(symbol, 100, Resolution.Daily)
        
        #self.slopy[symbol].Warmup(history)
        
        self.RegisterIndicator(symbol, self.slopy, Resolution.Daily)  
        

    def OnData(self, data):

        self.Plot("slopy", "slopy",  self.slopy.Value)


#class custom_slope(PythonIndicator):
class custom_slope():
    def __init__(self,symbol, periods):
        self.symbol=symbol
        self.queue = deque(maxlen=periods)
        self.Value = 0
        self.Time=None
        self.IsReady=False
        
    def __repr__(self):
        return "{0} -> IsReady: {1}. Time: {2}. Value: {3}".format(self.Name, self.IsReady, self.Time, self.Value)    

    def Update(self,input):
        self.queue.appendleft(input.Close)
        count = len(self.queue)
      
        if count == self.queue.maxlen:    
            y = np.log(self.queue)
            x = [range(len(y))]
            slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
            self.Value=slope * 10000 # value is very small an will display 0 if not multiplyed
            self.IsReady=True
        
    def Warmup(self,history): 
        if self.symbol not in history:
            return
        for index, row in history.loc[self.symbol].iterrows():
            self.queue.Add(row["close"])