| 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 -13.54 Tracking Error 0.076 Treynor Ratio 0 Total Fees $0.00 |
'''
Chande Momentum Oscillator for 5 minute time buckets
'''
#import a bunch of stuff
from clr import AddReference
AddReference("QuantConnect.Common")
AddReference("QuantConnect.Algorithm")
AddReference("QuantConnect.Algorithm.Framework")
AddReference("QuantConnect.Indicators")
from QuantConnect import *
from QuantConnect.Indicators import *
from QuantConnect.Algorithm import *
from QuantConnect.Algorithm.Framework import *
from QuantConnect.Algorithm.Framework.Alphas import *
from QuantConnect.Algorithm.Framework.Portfolio import *
from QuantConnect.Algorithm.Framework.Risk import *
from QuantConnect.Algorithm.Framework.Selection import *
from QuantConnect.Data.Consolidators import *
from datetime import timedelta
import numpy as np
from System.Drawing import Color
class ChandeAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 8, 1) # Set Start Date
self.SetEndDate(2020, 8, 27) # Set End Date
self.SetCash(10000) # Set Strategy Cash
self.tradebar_period = 5
# SET THE INSTRUMENTS WE ARE GOING TO USE IN OUR UNIVERSE
self.long_symbol = self.AddEquity("SPXL", Resolution.Minute,Market.USA, True, 1, True).Symbol
self.short_symbol = self.AddEquity("SPXS", Resolution.Minute).Symbol
#set up Chande Momentum Oscillator
self.Chande_OverBought = 50
self.Chande_OverSold = -50
self.Chande_buy_signal = False
self.Chande_sell_signal = False
self.Chande = self.CMO(self.long_symbol, 9, Resolution.Minute)
self.RegisterIndicator(self.long_symbol, self.Chande, timedelta(minutes = self.tradebar_period))
#set up the Paraboic Stop and Reverse indicator
self.ParabolicSAR = self.PSAR(self.long_symbol, 0.02, 0.02, 0.2, Resolution.Minute)
self.RegisterIndicator(self.long_symbol, self.ParabolicSAR, timedelta(minutes = self.tradebar_period))
# set up Ichimoku Cloud
TenkanPeriod = 9
KijunPeriod = 26
SenkouAPeriod = 26
SenkouBPeriod = 52
SenkouADelay = 26
SenkouBDelay = 26
self.Ichi = IchimokuKinkoHyo(self.long_symbol, TenkanPeriod, KijunPeriod, SenkouAPeriod, SenkouBPeriod, SenkouADelay, SenkouBDelay)
self.RegisterIndicator(self.long_symbol, self.Ichi, timedelta(minutes = self.tradebar_period))
# going to use three values for Sentiment: Bullish, Bearish and Neutral
# setting default values but these will get re-set during pre-market so not a big deal
self.CloudTop = 0
self.CloudBottom = 0
self.Price_AboveCloud = False
self.Price_InsideCloud = False
self.Price_BelowCloud = False
self.TK_AboveCloud = False
self.TK_BelowCloud = False
self.ToverK = False
self.TunderK = False
# Warmup those indicators
self.SetWarmup(SenkouBPeriod * self.tradebar_period)
# Consolidate time and call the handler
Consolidator = TradeBarConsolidator(timedelta(minutes = self.tradebar_period))
Consolidator.DataConsolidated += self.TradebarHandler
self.SubscriptionManager.AddConsolidator(self.long_symbol, Consolidator)
self.marketisopen = False
self.Schedule.On(self.DateRules.EveryDay(self.long_symbol), self.TimeRules.AfterMarketOpen(self.long_symbol), self.OnMarketOpen)
self.Schedule.On(self.DateRules.EveryDay(self.long_symbol), self.TimeRules.BeforeMarketClose(self.long_symbol), self.OnMarketClose)
def OnData(self, data):
if self.IsWarmingUp:
return
# checks to make sure we have data to trade with
if (not data.ContainsKey(self.long_symbol) or data[self.long_symbol] is None) or (not data.ContainsKey(self.short_symbol) or data[self.short_symbol] is None):
return
def TradebarHandler(self, sender, bar):
if self.IsWarmingUp:
return
#we have data feeding the indicators in the pre-market, but don't need to see it in our logs
if not self.marketisopen:
return
self.Debug("Price: " + str(round(self.Securities[self.long_symbol].Price,2)))
#self.Debug("long symbol TradeBar Open " + str(round(bar.Open,2)))
#self.Debug("long symbol TradeBar Close " + str(round(bar.Close,2)))
#self.Debug("long symbol TradeBar High " + str(round(bar.High,2)))
#self.Debug("long symbol TradeBar Low " + str(round(bar.Low,2)))
#self.Debug("long symbol TradeBar Volume " + str(round(bar.Volume,2)))
#self.Debug("long symbol TradeBar EndTime " + str(bar.EndTime))
#self.Debug("long symbol TradeBar Period " + str(bar.Period))
self.Chande_Analysis()
self.PSAR_Analysis()
self.Ichimoku_Analysis()
self.Debug("----------")
def Chande_Analysis(self):
# make sure the algos are ready
if self.IsWarmingUp:
return
self.Debug("Chande value: " +str(round(self.Chande.Current.Value,2)))
if (self.Chande.Current.Value >= 0):
self.Debug("Chande is positive")
elif (self.Chande.Current.Value < 0):
self.Debug("Chande is negative")
def PSAR_Analysis(self):
# make sure the algos are ready
if self.IsWarmingUp:
return
PSAR = round(self.ParabolicSAR.Current.Value,2)
self.Debug("PSAR " + str(PSAR))
if (self.ParabolicSAR.Current.Value < self.Securities[self.long_symbol].Price):
self.Debug("PSAR below price")
elif (self.ParabolicSAR.Current.Value > self.Securities[self.long_symbol].Price):
self.Debug("PSAR above price")
def Ichimoku_Analysis(self):
# make sure the algos are ready
if self.IsWarmingUp:
return
self.CloudTop = max(self.Ichi.SenkouA.Current.Value, self.Ichi.SenkouB.Current.Value)
self.CloudBottom = min(self.Ichi.SenkouA.Current.Value, self.Ichi.SenkouB.Current.Value)
self.Debug("Cloud Top " + str(round(self.CloudTop,2)))
self.Debug("Cloud Bottom " + str(round(self.CloudBottom,2)))
if (self.Securities[self.long_symbol].Price > self.CloudTop):
self.Debug("Price above cloud")
elif (self.Securities[self.long_symbol].Price < self.CloudBottom):
self.Debug("Price below cloud")
else:
self.Debug("Price inside cloud")
if (min(self.Ichi.Tenkan.Current.Value, self.Ichi.Kijun.Current.Value) > self.CloudTop):
self.Debug("Tenkan/Kijun above cloud")
if (max(self.Ichi.Tenkan.Current.Value, self.Ichi.Kijun.Current.Value) < self.CloudBottom):
self.Debug("Tenkan/Kijun below cloud")
if (self.Ichi.Tenkan.Current.Value > self.Ichi.Kijun.Current.Value):
self.Debug("Tenkan over Kijun")
elif (self.Ichi.Tenkan.Current.Value < self.Ichi.Kijun.Current.Value):
self.Debug("Kijun over Tenkan")
else: #Tenkan and Kijun are overlaying each other, stay with whichever over/under it was before
return
def OnMarketOpen(self):
self.marketisopen = True
def OnMarketClose(self):
self.marketisopen = False