Overall Statistics |
Total Trades 875 Average Win 0.01% Average Loss -0.01% Compounding Annual Return -98.686% Drawdown 5.000% Expectancy -0.753 Net Profit -4.966% Sharpe Ratio -13.836 Loss Rate 85% Win Rate 15% Profit-Loss Ratio 0.60 Alpha -1.625 Beta 0.609 Annual Standard Deviation 0.184 Annual Variance 0.034 Information Ratio -6.719 Tracking Error 0.155 Treynor Ratio -4.168 Total Fees $0.00 |
# this is incomplete attempt to conver c# file to python. coarse funciton incomplete. from clr import AddReference AddReference("System") AddReference("QuantConnect.Algorithm") AddReference("QuantConnect.Common") AddReference("QuantConnect.Indicators") from System import * from QuantConnect import * from System.Linq import * from QuantConnect.Indicators import * from QuantConnect.Data.Market import * from System.Collections.Concurrent import * from QuantConnect.Data.UniverseSelection import * from QuantConnect.Indicators.CandlestickPatterns import * from datetime import timedelta, datetime import numpy import sys import decimal import talib class TestCandlestickAlgorithm ( QCAlgorithm): def Initialize(self): self.VERBOSEMODE = True self.VERBOSEMODE2 = True self.SetCash(100000) self.SetStartDate(2019,8,4) self.SetEndDate(2019,8,6) self.SetBrokerageModel(BrokerageName.OandaBrokerage) self.security= self.AddForex("EURUSD", Resolution.Minute, Market.Oanda) #self.security = self.AddEquity("SPY", Resolution.Minute) self.symbol = self.security.Symbol self.symbolStr = self.symbol.Value periods = decimal.Decimal(10) self.pattern = Doji(self.symbol) self.SetWarmUp(timedelta(days=10)) #self.cdl = CandleHelper(self) self.tryOnce = True self.doji = CandleDoji(self,'doji', 1) res = Resolution.Minute self.sellAfterBars = 5 # how many bars to wait before exiting self.barCounter = 0 plotter =Chart("Plotter"); plotter.AddSeries(Series("EURUSD", SeriesType.Line,0)) self.AddChart(plotter) def OnData(self,slice): self.Log("Time: {}" . format(slice.Time) ) if (self.IsWarmingUp): self.barCounter = 0 return self.barCounter += 1 if self.Securities[self.symbolStr].Invested and self.barCounter > self.sellAfterBars : self.SetHoldings(self.symbolStr,0) self.Log("Closing out after {} bars".format( self.sellAfterBars ) ) self.barCounter = 0 return if slice is None: self.Log("no slice " ) self.barCounter -= 1 return try: #self.Log("self.symbol {} of type {} self.symbolStr {} of type {}" . format(self.symbol,type(self.symbol), self.symbolStr, type(self.symbolStr) ) ) #self.Log("self pattern is {} " . format(self.pattern)) fxQuoteBars = slice.QuoteBars qb = fxQuoteBars['EURUSD'] ## EURUSD QuoteBar #self.Log(" qb {} of type {} open {} high {} low {} close {} time {} " . format(qb, type(qb),qb.Open,qb.High, qb.Low, qb.Close, qb.Time )) ''' op = numpy.array([12.33]) hi = numpy.array([13.33]) lo = numpy.array([11.33]) cl = numpy.array([12.33]) self.Log("set up test array vars ok e.g. cl {}" .format(cl)) test = talib.CDLDOJI(op,hi,lo,cl ) self.Log("got here ok to test {} ". format(test)) ''' self.doji.Update(qb) self.Log("self.doji is {} at time {}" . format(self.doji.Value,self.doji.Time)) if self.doji.Value: self.Log("Time: {} doji found with value {} going long symbol {}" . format( slice.Time, self.doji.Value, self.symbol) ) self.SetHoldings(self.symbol, 1) else: self.Log("no doji recognized skipping") except: self.Log('An unknown error occurred trying OnData' + str(sys.exc_info()[0]) ) class CandleDoji: #we are createing a doji indicator made up of o/h/l/c of bar # self.doji = CandleDoji('doji', 1) # self.RegisterIndicator("SPY", self.doji, Resolution.Minute) def __init__(self,algo,name,period): self.Name = name self.Time = datetime.min self.Value = False self.IsReady = False self.Open = None self.High = None self.Low = None self.Close = None self.symbol = algo.symbol self.algo = algo self.algo.Log('CandleDoji initiated for symbol {}' .format(self.symbol)) self.adjustFactor = float(0.20) # percentage of overall candle height by which you want body of candle to be inferior to self.minCandleHeight = float(0.00) # if you want to eliminate candles smaller than a given size set this value to number of basis points def __repr__(self): return "{0} -> IsReady: {1}. Time: {2}. Value: {3}".format(self.Name, self.IsReady, self.Time, self.Value) def Update(self,input): #Doji is a candlestick pattern which is a candle of specific shape: its Open price is equal (or almost equal) to the Close price. The candle #is considered Doji if the difference between its Open and Close prices does not exceed average body height multiplied by the specified factor. try: self.Open= numpy.array([input.Open]) self.Close= numpy.array([input.Close]) self.High= numpy.array([input.High]) self.Low= numpy.array([input.Low]) self.Time = numpy.array([input.EndTime ]) candleBars = talib.CDLDOJI(self.Open,self.High,self.Low,self.Close) #self.algo.Log("got here past CDLDOJI ok") if self.algo.VERBOSEMODE: self.algo.Log('CandleDoji testing for Open {} Hi {} Low {} Close {} Time {}'. format(self.Open,self.High,self.Low,self.Close, self.Time)) body = abs(self.Open - self.Close) self.algo.Log("body of candle measures {} " . format(body)) cdlHeight = abs(self.High-self.Low) self.algo.Log("height of candle measures {} " . format(cdlHeight)) maxBody = float(cdlHeight) * self.adjustFactor bodyAsPct = float(body )/ float(cdlHeight) isDoji = (body < maxBody ) and (cdlHeight > self.minCandleHeight) self.algo.Log(" doji? {} if body {} < maxBody {} current body is {} as percent of candle and candle height {} > {}" . format(isDoji ,body, maxBody,bodyAsPct,cdlHeight,self.minCandleHeight)) self.Value = isDoji self.IsReady = True self.algo.Log("CandleDoji is ready with value {}" .format(self.Value) ) ''' #if self.algo.VERBOSEMODE: self.algo.Log('CandleDoji candleBars of type () count {} items {}'. format(type(candleBars), len(candleBars),candleBars) ) self.algo.Log("my doji definition ? " . format(self.isDoji(input))) candleBarSum = sum(candleBars) #candleBarSum is of type numpy.int64 which as a scalar must be converted with item to be converted to decimal type self.Value = decimal.Decimal(candleBarSum.item()) ''' except: self.Value = False self.IsReady = False self.algo.Log('An unknown error occurred trying CandleDoji' + str(sys.exc_info()[0]) )