| Overall Statistics |
|
Total Trades 264 Average Win 3.98% Average Loss -1.38% Compounding Annual Return 35.455% Drawdown 20.600% Expectancy 0.885 Net Profit 356.260% Sharpe Ratio 1.952 Probabilistic Sharpe Ratio 93.000% Loss Rate 52% Win Rate 48% Profit-Loss Ratio 2.89 Alpha 0.296 Beta 0.555 Annual Standard Deviation 0.195 Annual Variance 0.038 Information Ratio 1.234 Tracking Error 0.185 Treynor Ratio 0.686 Total Fees $264.00 |
class RSIAlgorithm(QCAlgorithm):
def Initialize(self):
# Set our main strategy parameters
self.SetStartDate(2015,9, 20) # Set Start Date
self.SetEndDate(2020,9,20) # Set End Date
self.SetCash(3300) # Set Strategy Cash
self.Equities = ["AMZN", "AAPL", "TSLA", "GOOGL"]
self.TradeAmount = self.Portfolio.TotalPortfolioValue
self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Cash)
self.HK = dict() # Create dict to hold all our HK Indicators
self.PairSymbol = dict()
for Equity in self.Equities:
# self.AddForex(Equity, Resolution.Minute, Market.Oanda)
# self.AddEquity(Equity, Resolution.Hour)
self.PairSymbol[Equity] = SymbolData(self,self.AddEquity(Equity, Resolution.Minute).Symbol)
self.HK[Equity] = self.HeikinAshi(Equity, Resolution.Hour)
def OnData(self, data):
for Equity in self.Equities:
# Aliases
# -----------------------------------------------------------------
# Heikin
HK_O = self.HK[Equity].Open.Current.Value
HK_H = self.HK[Equity].High.Current.Value
HK_L = self.HK[Equity].Low.Current.Value
HK_C = self.HK[Equity].Close.Current.Value
HK_P = self.HK[Equity].Current.Price
# OHLC
# O = data[Equity].Open
# H = data[Equity].High
# L = data[Equity].Low
# C = data[Equity].Close
# P = data[Equity].Price
# Work out Heikin Sentiment
# ---------------------------------------
if HK_O < HK_C * 1.025:
HK_S = "Bull"
elif HK_O > HK_C:
HK_S = "Bear"
else:
HK_S = "Neut"
# Check if we are in the market
# if not self.Portfolio.Invested:
if not self.Portfolio[Equity].Quantity:
if HK_S == "Bull" \
and self.PairSymbol[Equity].macd.Current.Value > 0 \
and self.PairSymbol[Equity].macd.Current.Value > self.PairSymbol[Equity].macd.Signal.Current.Value \
and self.PairSymbol[Equity].bb.UpperBand.Current.Value > self.PairSymbol[Equity].bbUpperPrevious \
and self.PairSymbol[Equity].rsi.Current.Value > 0.7:
self.SetHoldings(Equity, 0.3)
else:
if HK_S == "Bear":
self.Liquidate(Equity)
def OnOrderEvent(self, orderEvent):
order = self.Transactions.GetOrderById(orderEvent.OrderId)
if order.Status == OrderStatus.Filled:
if order.Type == OrderType.Limit or order.Type == OrderType.Limit:
self.Transactions.CancelOpenOrders(order.Symbol)
if order.Status == OrderStatus.Canceled:
self.Log(str(orderEvent))
class SymbolData:
def __init__(self,qcContext, symbol):
self.qcContext = qcContext
self.symbol = symbol
self.macd = qcContext.MACD(self.symbol, 12, 26, 9, MovingAverageType.Exponential, Resolution.Minute)
self.qcContext.RegisterIndicator(self.symbol, self.macd, Resolution.Minute)
self.bb = qcContext.BB(self.symbol, 12, 2, Resolution.Minute)
self.qcContext.RegisterIndicator(self.symbol, self.bb, Resolution.Minute)
self.rsi = qcContext.RSI(self.symbol, 7, Resolution.Minute)
self.qcContext.RegisterIndicator(self.symbol, self.rsi, Resolution.Minute)
self.bbUpperPrevious = self.bb.UpperBand.Current.Value
self.atr = qcContext.ATR(self.symbol, 7, Resolution.Daily)
self.qcContext.RegisterIndicator(self.symbol, self.atr, Resolution.Daily)