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 -0.724 Tracking Error 0.259 Treynor Ratio 0 Total Fees $0.00 |
# QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals. # Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from clr import AddReference AddReference("System") AddReference("QuantConnect.Algorithm") AddReference("QuantConnect.Common") from System import * from QuantConnect import * from QuantConnect.Algorithm import * from QuantConnect.Indicators import * from QuantConnect.Data.Market import TradeBar import numpy as np import math ### <summary> ### Basic template algorithm simply initializes the date range and cash. This is a skeleton ### framework you can use for designing an algorithm. ### </summary> ### <meta name="tag" content="using data" /> ### <meta name="tag" content="using quantconnect" /> ### <meta name="tag" content="trading and orders" /> class TosAlgorithm(QCAlgorithm): '''Basic template algorithm simply initializes the date range and cash''' def Initialize(self): '''Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.''' self.SetStartDate(2019, 3, 31) # Set Start Date self.SetEndDate(2020, 8, 30) # Set Start Date self.SetCash(100000) # Set Strategy Cash self.AddEquity("IBM", Resolution.Daily) ## Subscribe to hourly TradeBars self.ibm = RollingWindow[TradeBar](2) # spy trade bar window self.ST_Period = 5 self.ST_Coeff = 1 self.SetWarmUp(self.ST_Period) self.superTrend = SuperTrend('custom', self.ST_Period,self.ST_Coeff) # suepr trend self.lastSuperTrendTrend = 0 # the last self.superTrend.Trend #self.PlotIndicator("ST",self.superTrend) def OnData(self, data): self.ibm.Add(data["IBM"]) if not self.ibm.IsReady: # not self.superTrend.IsReady return self.superTrend.Update(data["IBM"], self.ibm[1]) self.Debug(" time:" + str(self.Time) + " open:" + str(self.superTrend.o) + " high:" + str(self.superTrend.h) + " low:" + str(self.superTrend.l) + " close:" + str(self.superTrend.c) + " ha_close:" + str(round(self.superTrend.ha_close,2)) + " ha_open:" + str(round(self.superTrend.ha_open,2)) + " ha_high:" + str(round(self.superTrend.ha_high,2)) + " ha_low:" + str(round(self.superTrend.ha_low,2)) + " hahl2:" + str(round(self.superTrend.hahl2_1,2)) + " tmpUp1:" + str(round(self.superTrend.tmpUp1,2)) + " tmpDn1:" + str(round(self.superTrend.tmpDn1,2)) + " finalUp1:" + str(round(self.superTrend.finalUp1,2)) + " finalDn1:" + str(round(self.superTrend.finalDn1,2)) + " atr:" + str(self.superTrend.atr) + " super trend:" + str(self.superTrend.trendDir1) ) if self.lastSuperTrendTrend == -1 and self.superTrend.trendDir1 == 1: if self.Portfolio.Invested: self.Liquidate() self.SetHoldings("IBM", 1) self.Debug("Long") if self.lastSuperTrendTrend == 1 and self.superTrend.trendDir1 == -1: if self.Portfolio.Invested: self.Liquidate() self.SetHoldings("IBM", -1) self.Debug("Short") self.lastSuperTrendTrend = self.superTrend.trendDir1 class SuperTrend: def __init__(self, name, period,coeff): self.Name = name self.IsReady = False self.o = 0 self.h = 0 self.l = 0 self.c = 0 self.ha_close = 0 self.ha_open = 0 self.ha_high = 0 self.ha_low = 0 self.hahl2_1 = 0 self.trendDir1 = 0 self.tmpUp1 = 0 self.tmpDn1 = 0 self.atr = AverageTrueRange(period, MovingAverageType.Wilders) self.test= 0 self.finalUp1 = 0 self.finalDn1 = 0 self.coeff = coeff self.qca = QCAlgorithm() self.result = 0 def Update(self, input, lastBar): self.atr.Update(input) if self.atr.IsReady: self.test = 0 self.finalUp1 = self.tmpUp1 self.finalDn1 = self.tmpDn1 self.o = input.Open ## Open price self.h = input.High ## High price self.l = input.Low ## Low price self.c = input.Close ## Close price self.ha_close = (self.o + self.h + self.l + self.c) / 4.0 self.ha_open = (lastBar.Open + self.ha_close) / 2.0 self.ha_high = Math.Max(self.o, Math.Max(self.ha_open, self.ha_close)) self.ha_low = Math.Min(self.l, Math.Min(self.ha_open, self.ha_close)) self.hahl2_1 = (self.ha_high + self.ha_low) / 2 #hl2 = ((input.High - input.Low) / 2 ) + input.Low self.tmpUp1 = self.hahl2_1 + (self.atr.Current.Value * self.coeff) self.tmpDn1 = self.hahl2_1 - (self.atr.Current.Value * self.coeff) if lastBar.Close > self.finalUp1: self.finalUp1 = max(self.tmpUp1, self.finalUp1) else: self.finalUp1 = self.tmpUp1 if lastBar.Close < self.finalDn1: self.finalDn1 = min(self.tmpDn1, self.finalDn1) else: self.finalDn1 = self.tmpDn1 # calculate trendDir1 if input.Close > self.finalDn1: self.trendDir1 = 1 elif input.Close < self.finalUp1: self.trendDir1 = -1 if not math.isnan(self.trendDir1): self.trendDir = self.trendDir1 else: self.trendDir1 = 1 #if self.finalUp1 != 0 and input.Close > self.finalUp1: # self.trendDir1 = 1 #if self.finalDn1 != 0 and input.Close < self.finalDn1: # self.trendDir1 = -1 self.IsReady = self.trendDir1 != 0