| Overall Statistics |
|
Total Trades 41 Average Win 0.04% Average Loss -0.38% Compounding Annual Return -1.469% Drawdown 0.400% Expectancy -0.722 Net Profit -0.095% Sharpe Ratio -0.547 Probabilistic Sharpe Ratio 32.046% Loss Rate 75% Win Rate 25% Profit-Loss Ratio 0.11 Alpha -0.008 Beta 0.006 Annual Standard Deviation 0.019 Annual Variance 0 Information Ratio 0.607 Tracking Error 0.493 Treynor Ratio -1.648 Total Fees $1003.92 |
class MultidimensionalOptimizedRadiator(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2019, 1, 1) # Set Start Date
self.SetEndDate(2020,1,1) # Set End Date
self.SetCash(100000) # Set Strategy Cash default in USD
self.symbol = "BTCUSD"
self.lever = 5 # leverage
# Adding the symbol
self.AddCrypto(self.symbol, Resolution.Minute).SetDataNormalizationMode(DataNormalizationMode.Raw) #.SetLeverage(self.lever)
# SetBrokerageModel
self.SetBrokerageModel(BrokerageName.GDAX, AccountType.Cash)
# set benchmark
self.SetBenchmark(self.symbol)
# tradingview inputs
self.oRes = 120 #"Orange MA Timeframe"
self.oLen = 200 #"Orange MA Length")
self.oPos = 962/1000 #"Orange MA Position"
self.bLen = 180 #"Blue MA Length"
self.spread = 20/10000 #"Blue MA Spread"
self.tp = .9/100 #"Take Profit %"
self.tf = 5 # "Time frame"
#ap = strategy.position_avg_price
self.consolidator1 = TradeBarConsolidator(timedelta(minutes=self.tf)) # small timeframe consolidator
self.consolidator2 = TradeBarConsolidator(timedelta(minutes=self.oRes)) # large timeframe consolidator
# Generate Large timeframe HMA
self.oMa = HullMovingAverage(self.symbol,self.oLen) #oMa = hma(close[1], oLen)*oPos
self.RegisterIndicator(self.symbol,self.oMa,self.consolidator2)
self.oAll = IndicatorExtensions.Times(self.oMa,self.oPos ) #*self.oPos # HMA*orange ma position #oAll = security(syminfo.tickerid, oRes, oMa[1], barmerge.gaps_off, barmerge.lookahead_off)
self.SetWarmUp(50, Resolution.Daily)
# creating Small timeframe HMA
self.b_general = HullMovingAverage(self.symbol,self.bLen)
self.RegisterIndicator(self.symbol,self.b_general,self.consolidator1)
# Blue MA Positions
self.r1Pos = 980/1000 #"Open Position 1"
self.r2Pos = self.r1Pos-self.spread
self.r3Pos = self.r2Pos-self.spread
self.r4Pos = self.r3Pos-self.spread
self.r5Pos = self.r4Pos-self.spread
self.r6Pos = self.r5Pos-self.spread
self.r7Pos = self.r6Pos-self.spread
self.r8Pos = self.r7Pos-self.spread
self.r9Pos = self.r8Pos-self.spread
self.r10Pos = self.r9Pos-self.spread
# EMA Calcs for Blue MA's
self.b1 = IndicatorExtensions.Times(self.b_general,self.r1Pos )
self.b2 = IndicatorExtensions.Times(self.b_general,self.r2Pos )
self.b3 = IndicatorExtensions.Times(self.b_general,self.r3Pos )
self.b4 = IndicatorExtensions.Times(self.b_general,self.r4Pos )
self.b5 = IndicatorExtensions.Times(self.b_general,self.r5Pos )
self.b6 = IndicatorExtensions.Times(self.b_general,self.r6Pos )
self.b7 = IndicatorExtensions.Times(self.b_general,self.r7Pos )
self.b8 = IndicatorExtensions.Times(self.b_general,self.r8Pos )
self.b9 = IndicatorExtensions.Times(self.b_general,self.r9Pos )
self.b10 = IndicatorExtensions.Times(self.b_general,self.r10Pos )
self.SetWarmUp(50, Resolution.Daily)
def OnData(self, data):
'''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
Arguments:
data: Slice object keyed by symbol containing the stock data
'''
# Checking if the indicator is ready:
if not self.oAll.IsReady:
return
if not self.b1.IsReady:
return
if not self.b2.IsReady:
return
if not self.b3.IsReady:
return
if not self.b4.IsReady:
return
if not self.b5.IsReady:
return
if not self.b6.IsReady:
return
if not self.b7.IsReady:
return
if not self.b8.IsReady:
return
if not self.b9.IsReady:
return
if not self.b10.IsReady:
return
# setting current values to the variables
oAll_value = self.oAll.Current.Value
b1_value = self.b1.Current.Value
b2_value = self.b2.Current.Value
b3_value = self.b3.Current.Value
b4_value = self.b4.Current.Value
b5_value = self.b5.Current.Value
b6_value = self.b6.Current.Value
b7_value = self.b7.Current.Value
b8_value = self.b8.Current.Value
b9_value = self.b9.Current.Value
b10_value = self.b10.Current.Value
# Take Profit / Close Position / No Position Allowed
# tPro = ap+ap*tp
# cPos = close<oAll
# noPos = low<oAll or b10<=oAll
# calculate order quantity per order
quantity = self.CalculateOrderQuantity(self.symbol, 0.1)
# check if price(low) is greater than orange HMA and b10 is greater than orange HMA
if data[self.symbol].Ask.Low > oAll_value and b10_value > oAll_value :
# placing 10 limit orders with stoploss and saving order tickets
if (self.Portfolio.MarginRemaining/10) > b1_value:
ticket_b1 = self.LimitOrder(self.symbol, self.Portfolio.MarginRemaining/(10*b3_value)*.9, b1_value)
elif (self.Portfolio.MarginRemaining/9) > b2_value:
ticket_b2 = self.LimitOrder(self.symbol, self.Portfolio.MarginRemaining/(9*b2_value)*.9, b2_value)
elif (self.Portfolio.MarginRemaining/8) > b3_value:
ticket_b3 = self.LimitOrder(self.symbol, self.Portfolio.MarginRemaining/(8*b3_value)*.9, b3_value)
elif (self.Portfolio.MarginRemaining/7) > b4_value:
ticket_b4 = self.LimitOrder(self.symbol, self.Portfolio.MarginRemaining/(7*b4_value)*.9, b4_value)
elif (self.Portfolio.MarginRemaining/6) > b5_value:
ticket_b5 = self.LimitOrder(self.symbol, self.Portfolio.MarginRemaining/(6*b5_value)*.9, b5_value)
elif (self.Portfolio.MarginRemaining/5) > b6_value:
ticket_b6 = self.LimitOrder(self.symbol, self.Portfolio.MarginRemaining/(5*b6_value)*.9, b6_value)
elif (self.Portfolio.MarginRemaining/4) > b7_value:
ticket_b7 = self.LimitOrder(self.symbol, self.Portfolio.MarginRemaining/(4*b7_value)*.9, b7_value)
elif (self.Portfolio.MarginRemaining/3) > b8_value:
ticket_b8 = self.LimitOrder(self.symbol, self.Portfolio.MarginRemaining/(3*b8_value)*.9, b8_value)
elif (self.Portfolio.MarginRemaining/2) > b9_value:
ticket_b9 = self.LimitOrder(self.symbol, self.Portfolio.MarginRemaining/(2*b9_value)*.9, b9_value)
elif self.Portfolio.MarginRemaining > b10_value:
ticket_b10 = self.LimitOrder(self.symbol, self.Portfolio.MarginRemaining/b10_value*.9, b10_value)
else:
pass
# stop loss at orange HMA
if data[self.symbol].Bid.Open <= oAll_value:
self.Liquidate()
#take profit
if data[self.symbol].Bid.Open >= b1_value*(1+self.tp) and self.Portfolio.Invested:
self.Liquidate()