| Overall Statistics |
|
Total Trades 36 Average Win 0.14% Average Loss -0.10% Compounding Annual Return -8.672% Drawdown 1.200% Expectancy -0.480 Net Profit -0.890% Sharpe Ratio -3.545 Probabilistic Sharpe Ratio 1.817% Loss Rate 78% Win Rate 22% Profit-Loss Ratio 1.34 Alpha -0.06 Beta -0.04 Annual Standard Deviation 0.02 Annual Variance 0 Information Ratio -4.24 Tracking Error 0.078 Treynor Ratio 1.754 Total Fees $0.00 Estimated Strategy Capacity $6500000.00 Lowest Capacity Asset EURNZD 8G |
class HyperActiveApricotFalcon(QCAlgorithm):
def Initialize(self):
#General Information
self.SetStartDate(2021, 7, 27)
self.SetEndDate(2021, 8, 31)
self.SetCash(100000)
self.pair = 'EURNZD'
self.forex = self.AddForex(self.pair, Resolution.Minute, Market.Oanda).Symbol
self.quantity = 100000
# Set Take Profit and Stop Loss Here
self.tp = 0.002
self.sl = 0.0015
# Long / Short - True = Live
self.Long = True
self.Short = False
# Set number of open positions allowed at a time
self.numtrades = 10
''' Takeprofit and stoploss not working '''
self.takeprofit = []
self.stoploss = []
self.numshares = []
self.takeprofitpos = {}
self.stoplosspos = {}
# Indicators
self.rsi = RelativeStrengthIndex(14, MovingAverageType.Wilders)
self.macdfiveminute = MovingAverageConvergenceDivergence(12, 26, 9, MovingAverageType.Exponential)
self.macdonehour = self.MACD(self.forex, 12, 26, 9, MovingAverageType.Exponential, Resolution.Hour)
self.atr = AverageTrueRange(14, MovingAverageType.Wilders)
self.emafast = ExponentialMovingAverage(9)
self.emaslow = ExponentialMovingAverage(50)
# One Hour Consolidator and Indicator Registrations
oneHourConsolidator = QuoteBarConsolidator(timedelta(minutes=60))
oneHourConsolidator.DataConsolidated += self.OneHourBarHandler
self.SubscriptionManager.AddConsolidator(self.pair, oneHourConsolidator)
# self.RegisterIndicator(self.pair, self.macdonehour, oneHourConsolidator)
# Five Minute Consolidator and Indicator Registrations
fiveMinuteConsolidator = QuoteBarConsolidator(timedelta(minutes=5))
fiveMinuteConsolidator.DataConsolidated += self.FiveMinuteBarHandler
self.SubscriptionManager.AddConsolidator(self.pair, fiveMinuteConsolidator)
self.RegisterIndicator(self.pair, self.rsi, fiveMinuteConsolidator)
self.RegisterIndicator(self.pair, self.atr, fiveMinuteConsolidator)
self.RegisterIndicator(self.pair, self.macdfiveminute, fiveMinuteConsolidator)
self.RegisterIndicator(self.pair, self.emafast, fiveMinuteConsolidator)
self.RegisterIndicator(self.pair, self.emaslow, fiveMinuteConsolidator)
self.macdLastHourWindow = RollingWindow[float](2)
self.macdHourSignal = RollingWindow[float](2)
self.Schedule.On(self.DateRules.Every(DayOfWeek.Friday), self.TimeRules.BeforeMarketClose(self.pair), self.WeekendLiquidation)
self.fiveminbaropen = 0
self.SetWarmUp(50)
self.lastfiveminutemacdvalues = []
self.lastonehourmacdvalues = []
self.removekeys = []
self.counter = 0
self.tpsl = {}
self.macdLastFiveBar = None
self.SLTicket = None
self.TPTicket = None
self.entryTicket = None
def OneHourBarHandler(self, sender, consolidated):
self.macdLastHourWindow.Add(self.macdonehour.Current.Value)
self.macdHourSignal.Add(self.macdonehour.Signal.Current.Value)
def FiveMinuteBarHandler(self, sender, consolidated):
if not self.macdonehour.IsReady:
return
if self.macdLastFiveBar == None or self.macdLastHourWindow.Count <= 1:
self.macdLastFiveBar = self.macdfiveminute.Current.Value
return
Close = (consolidated.Bid.Close+consolidated.Ask.Close)/2
Open = (consolidated.Bid.Open+consolidated.Ask.Open)/2
Low = (consolidated.Bid.Low+consolidated.Ask.Low)/2
High = (consolidated.Bid.High+consolidated.Ask.High)/2
Price = consolidated.Price
# Limit number of open trades
if len(self.tpsl) >= self.numtrades:
return
emaFast = self.emafast.Current.Value
emaSlow = self.emaslow.Current.Value
rsiValue = self.rsi.Current.Value
macdFive = self.macdfiveminute.Current.Value
# Entry Long
if self.Long and Close > emaFast and Open > emaFast and Close < Open and emaSlow < emaFast and rsiValue < 63 and rsiValue > 55:
self.GoLong(Close)
# Entry Short
elif self.Short and Close < emaFast and Open < emaFast and Close > Open and emaSlow > emaFast and rsiValue > 38 and rsiValue < 45:
self.GoShort(Close)
# Record MACD values to compare at next datapoint
self.macdLastFiveBar = self.macdfiveminute.Current.Value
def GoLong(self, Close):
FiveMACDdifference = self.macdfiveminute.Current.Value - self.macdfiveminute.Signal.Current.Value
HourMACDdifference = self.macdLastHourWindow[0] - self.macdHourSignal[0]
if self.entryTicket == None and self.macdfiveminute.Current.Value > .00005 and self.macdfiveminute.Current.Value > self.macdLastFiveBar and self.macdLastHourWindow[0] > self.macdLastHourWindow[self.macdLastHourWindow.Count-1] and self.atr.Current.Value > .00025 and self.macdfiveminute.Current.Value - self.macdfiveminute.Signal.Current.Value > 0 and self.macdLastHourWindow[0] - self.macdHourSignal[0] > -.0001:
self.MadeEntry()
self.BuyPrice = Close
self.SLPrice = self.BuyPrice - .0015
self.TPPrice = self.BuyPrice + .002
self.entryTicket = self.LimitOrder(self.pair, self.quantity, self.BuyPrice, str(self.macdfiveminute.Current.Value) + " " + str(self.macdLastFiveBar))
self.Debug(f"1 Hour MACD Difference : {HourMACDdifference}" + " " + str(self.Time))
self.Debug(f"1 Hour MACD Value : {self.macdonehour.Current.Value}")
self.Debug(f"1 Hour MACD Signal : {self.macdonehour.Signal.Current.Value}")
self.Debug(f"1 Hour MACD Previous : {self.macdLastHourWindow[self.macdLastHourWindow.Count-1]}")
# Enter stop loss order
self.SLTicket = self.StopMarketOrder( self.pair, -self.quantity, self.SLPrice, "SLTicket")
# Enter limit order
self.TPTicket = self.LimitOrder( self.pair, -self.quantity, self.TPPrice, "TPTicket")
else:
self.NoEntry()
def GoShort(self, Close):
FiveMACDdifference = self.macdfiveminute.Current.Value - self.macdfiveminute.Signal.Current.Value
HourMACDdifference = self.macdonehour.Current.Value - self.macdonehour.Signal.Current.Value
if self.macdfiveminute.Current.Value < -.00005:
# MACD Current > MACD 1 Bar Ago ( 5 minute and 1 hour )
if self.macdfiveminute.Current.Value < self.macdLastFiveBar and self.macdonehour.Current.Value < self.macdLastHourWindow[self.macdLastHourWindow.Count-1]:
# ATR > .00025
if self.atr.Current.Value > .00025:
# MACD Difference < 0 ( 5 minute and 1 hour )
if self.macdfiveminute.Current.Value - self.macdfiveminute.Signal.Current.Value < 0 and self.macdonehour.Current.Value - self.macdonehour.Signal.Current.Value < 0:
self.BuyPrice = Close
self.SLPrice = self.BuyPrice + .0015
self.TPPrice = self.BuyPrice - .002
self.entryTicket = self.LimitOrder(self.pair, -self.quantity, self.BuyPrice, str(self.macdfiveminute.Current.Value) + " " + str(self.macdLastFiveBar))
self.Debug(f"1 Hour MACD Difference : {HourMACDdifference}")
self.Debug(f"1 Hour MACD Value : {self.macdonehour.Current.Value}")
self.Debug(f"1 Hour MACD Signal : {self.macdonehour.Signal.Current.Value}")
self.Debug(f"1 Hour MACD Previous : {self.macdLastHourWindow[self.macdLastHourWindow.Count-1]}")
# Enter stop loss order
self.SLTicket = self.StopMarketOrder( self.pair, self.quantity, self.SLPrice)
# Enter limit order
self.TPTicket = self.LimitOrder( self.pair, self.quantity, self.TPPrice)
def WeekendLiquidation(self):
self.Liquidate()
self.tpsl = {}
def MadeEntry(self):
self.Debug("ENTRY APPROVED ON " + str(self.Time))
FiveMACDdifference = self.macdfiveminute.Current.Value - self.macdfiveminute.Signal.Current.Value
self.Debug(f"5 Min MACD Difference : {FiveMACDdifference}")
self.Debug(f"5 Min MACD Value : {self.macdfiveminute.Current.Value}")
self.Debug(f"5 Min MACD Signal : {self.macdfiveminute.Signal.Current.Value}")
def NoEntry(self):
self.Debug("NO ENTRY ON " + str(self.Time) + ". ENTRY TICKET " + str(self.entryTicket))
FiveMACDdifference = self.macdfiveminute.Current.Value - self.macdfiveminute.Signal.Current.Value
self.Debug(f"5 Min MACD Difference : {FiveMACDdifference}")
self.Debug(f"5 Min MACD Value : {self.macdfiveminute.Current.Value}")
self.Debug(f"5 Min MACD Signal : {self.macdfiveminute.Signal.Current.Value}")
HourMACDdifference = self.macdonehour.Current.Value - self.macdonehour.Signal.Current.Value
self.Debug(f"1 Hour MACD Difference : {HourMACDdifference}")
self.Debug(f"1 Hour MACD Value : {self.macdonehour.Current.Value}")
self.Debug(f"1 Hour MACD Signal : {self.macdonehour.Signal.Current.Value}")
self.Debug(f"1 Hour MACD Previous : {self.macdLastHourWindow[self.macdLastHourWindow.Count-1]}")
def OnOrderEvent(self, orderEvent):
if orderEvent.Status != OrderStatus.Filled:
return
order = self.Transactions.GetOrderById(orderEvent.OrderId)
self.asd = self.SLTicket
if self.SLTicket == None:
return
a = self.SLTicket
b = orderEvent.OrderId
c = self.SLTicket.OrderId
d = self.Portfolio[orderEvent.Symbol].Invested
if self.SLTicket != None and orderEvent.OrderId == self.SLTicket.OrderId:
self.SLTicket.Cancel()
self.TPTicket.Cancel()
self.SLTicket = None
self.TPTicket = None
self.entryTicket = None
elif self.TPTicket != None and orderEvent.OrderId == self.TPTicket.OrderId:
self.SLTicket.Cancel()
self.TPTicket.Cancel()
self.SLTicket = None
self.TPTicket = None
self.entryTicket = None
def Cancel(self, id):
'''cancel one order if the other was filled'''
if self.TPTicket is not None and id == self.TPTicket.OrderId:
self.stopLoss.Cancel()
elif self.SLTicket is not None and id == self.SLTicket.OrderId:
self.takeProfit.Cancel()
else:
return
self.TPTicket = None
self.SLTicket = None
self.entryTicket = None