Overall Statistics |
Total Trades 28 Average Win 7.37% Average Loss -3.83% Compounding Annual Return 5.303% Drawdown 30.400% Expectancy 0.463 Net Profit 22.943% Sharpe Ratio 0.329 Loss Rate 50% Win Rate 50% Profit-Loss Ratio 1.93 Alpha 0.122 Beta -3.916 Annual Standard Deviation 0.176 Annual Variance 0.031 Information Ratio 0.236 Tracking Error 0.176 Treynor Ratio -0.015 Total Fees $32.37 |
from collections import deque ### <summary> ### This project presents a python alternative to the C# RollingWindow method ### It takes advantage of the python collections.deque method to maintain the ### history of an indicator ### </summary> class BasicTemplateAlgorithm(QCAlgorithm): '''Simple algo to demonstrate the deque() method to store the history of an indicator''' class MacdState: ''' This class is used to save the state of the MACD values with each bar''' def __init__(self, macd): if not macd.IsReady: self.Macd = 0.0 self.Fast = 0.0 self.Slow = 0.0 self.Signal = 0.0 else: self.Macd = macd.Current.Value self.Fast = macd.Fast.Current.Value self.Slow = macd.Slow.Current.Value self.Signal = macd.Signal.Current.Value def Initialize(self): self.SetStartDate(2014,01,01) #Set Start Date self.SetEndDate(2018,01,01) #Set End Date self.SetCash(20000) #Set Strategy Cash self.security = "FB" # specify the desired security self.Hist = 10 # set the amount of history to retain for the indicator self.AddEquity(self.security, Resolution.Daily) # Specify the parameters for the macd indicator and the corresponding event handler self.macd = self.MACD(self.security, 12, 26, 9, MovingAverageType.Exponential, Resolution.Daily) self.macd.Updated += self.macdUpdated # Intitialize the collections.deque (https://docs.python.org/3/library/collections.html#collections.deque) # - the deque will maintain a list containing objects of the MacdState class # - a new object will be prepended to the list each time the macd is updated # If desired, also specify the length of the list self.macdHist = deque([self.MacdState(self.macd)], self.Hist) # Plot the indicator self.PlotIndicator("MACD", True, self.macd, self.macd.Signal) def macdUpdated(self, sender, updated): # Save the current state of the macd values by instantiating a new MacdState # object and adding it to the deque self.macdHist.appendleft(self.MacdState(self.macd)) def OnData(self, data): ''' Arguments: data: Slice object keyed by symbol containing the stock data ''' if not (self.macd.IsReady): return if not self.Portfolio.Invested: # enter a long position if macd crosses above zero. # In the code below, an index of 0 refers to the most recent value # of the macd properties in the deque. An index of 1 retrieves the # macd values of the previous bar if self.macdHist[1].Macd < 0 and self.macdHist[0].Macd > 0: self.SetHoldings(self.security, 1) else: # exit the position if the macd drops back below zero if self.macdHist[0].Macd < 0: self.Liquidate(self.security)