| Overall Statistics |
|
Total Trades 778 Average Win 0.06% Average Loss -0.07% Compounding Annual Return -58.670% Drawdown 8.600% Expectancy -0.286 Net Profit -7.229% Sharpe Ratio -3.893 Probabilistic Sharpe Ratio 0.048% Loss Rate 63% Win Rate 37% Profit-Loss Ratio 0.94 Alpha -0.47 Beta -0.11 Annual Standard Deviation 0.128 Annual Variance 0.016 Information Ratio -4.852 Tracking Error 0.159 Treynor Ratio 4.539 Total Fees $0.00 Estimated Strategy Capacity $770000.00 Lowest Capacity Asset AUDUSD 8G |
class HyperActiveApricotFalcon(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021, 6, 1)
self.SetEndDate(2021, 7, 1)
self.SetCash(10000)
self.pair = 'AUDUSD'
self.AddForex(self.pair, Resolution.Minute)
# Set Take Profit and Stop Loss Here
self.tp = 0.0008
self.sl = 0.0005
# Long / Short - Set one to True
self.Long = True
self.Short = False
# Set number of open positions allowed at a tome
self.numtrades = 5
self.takeprofit = []
self.stoploss = []
self.numshares = []
self.takeprofitpos = {}
self.stoplosspos = {}
self.quantity = 10000
self.rsi = RelativeStrengthIndex(14, MovingAverageType.Simple)
self.macdfiveminute = MovingAverageConvergenceDivergence(12, 26, 9, MovingAverageType.Simple)
self.macdonehour = MovingAverageConvergenceDivergence(12, 26, 9, MovingAverageType.Simple)
self.atr = AverageTrueRange(14, MovingAverageType.Simple)
self.emafast = ExponentialMovingAverage(9)
self.emaslow = ExponentialMovingAverage(50)
oneHourConsolidator = QuoteBarConsolidator(timedelta(hours=1))
fiveMinuteConsolidator = QuoteBarConsolidator(timedelta(minutes=5))
oneHourConsolidator.DataConsolidated += self.OneHourBarHandler
fiveMinuteConsolidator.DataConsolidated += self.FiveMinuteBarHandler
self.SubscriptionManager.AddConsolidator(self.pair, oneHourConsolidator)
self.SubscriptionManager.AddConsolidator(self.pair, fiveMinuteConsolidator)
self.RegisterIndicator(self.pair, self.rsi, oneHourConsolidator)
self.RegisterIndicator(self.pair, self.macdonehour, oneHourConsolidator)
self.RegisterIndicator(self.pair, self.atr, oneHourConsolidator)
self.RegisterIndicator(self.pair, self.macdfiveminute, fiveMinuteConsolidator)
self.RegisterIndicator(self.pair, self.emafast, fiveMinuteConsolidator)
self.RegisterIndicator(self.pair, self.emaslow, fiveMinuteConsolidator)
self.Schedule.On(self.DateRules.WeekEnd(self.pair), self.TimeRules.BeforeMarketClose(self.pair), self.WeekendLiquidation)
self.fiveminbaropen = 0
self.SetWarmUp(500)
self.lastfiveminutemacdvalues = []
self.lastonehourmacdvalues = []
self.removekeys = []
self.counter = 0
self.tpsl = {}
def OneHourBarHandler(self, sender, consolidated):
pass
def FiveMinuteBarHandler(self, sender, consolidated):
pass
def WeekendLiquidation(self):
self.Liquidate()
self.tpsl = {}
def OnData(self, data):
if not self.macdonehour.IsReady:
return
if len(self.lastfiveminutemacdvalues) < 2:
self.lastfiveminutemacdvalues.append(self.macdfiveminute.Histogram.Current.Value)
self.lastonehourmacdvalues.append(self.macdonehour.Histogram.Current.Value)
return
Close = (data[self.pair].Bid.Close+data[self.pair].Ask.Close)/2
Open = (data[self.pair].Bid.Open+data[self.pair].Ask.Open)/2
Low = (data[self.pair].Bid.Low+data[self.pair].Ask.Low)/2
High = (data[self.pair].Bid.High+data[self.pair].Ask.High)/2
Price = data[self.pair].Price
# Exit Trades
if self.Long:
if len(self.tpsl) > 0:
# Check Take Profit
for key, value in self.tpsl.items():
if High >= value[0]:
self.MarketOrder(self.pair, -self.quantity)
self.removekeys.append(key)
# Check Stop Loss
for key, value in self.tpsl.items():
if Low <= value[1]:
self.MarketOrder(self.pair, -self.quantity)
self.removekeys.append(key)
if self.Short:
if len(self.tpsl) > 0:
# Check Take Profit
for key, value in self.tpsl.items():
if Low <= value[0]:
self.MarketOrder(self.pair, self.quantity)
self.removekeys.append(key)
# Check Stop Loss
for key, value in self.tpsl.items():
if High >= value[1]:
self.MarketOrder(self.pair, self.quantity)
self.removekeys.append(key)
if len(self.removekeys) > 0:
for x in self.removekeys:
self.tpsl.pop(x)
self.removekeys.clear()
# Limit number of open trades
if len(self.tpsl) >= self.numtrades:
return
# Entry Long
if self.Long:
# Close > 9 EMA ( 5 minute )
if Close > self.emafast.Current.Value:
# Open > 9 EMA ( 5 minute)
if Open > self.emafast.Current.Value:
# Close < Open ( 5 minute )
if Close < Open:
# 9EMA > 50EMA ( 5 minute )
if self.emaslow.Current.Value < self.emafast.Current.Value:
# RSI < 65 ( 5 minute )
if self.rsi.Current.Value < 63:
# MACD > .0001 ( 5 minute )
if self.macdfiveminute.Current.Value > .00005:
# MACD Current > MACD 1 Bar Ago ( 5 minute and 1 hour )
if self.macdfiveminute.Current.Value > self.lastfiveminutemacdvalues[0] and self.macdonehour.Current.Value > self.lastonehourmacdvalues[0]:
# ATR > .00025
if self.atr.Current.Value > .00025:
# MACD Difference > 0 ( 5 minute and 1 hour )
if self.macdfiveminute.Current.Value - self.lastfiveminutemacdvalues[0] > 0 and self.macdonehour.Current.Value - self.lastonehourmacdvalues[0] > 0:
self.counter += 1
self.MarketOrder(self.pair, self.quantity)
tp = Close+self.tp
sl = Close-self.sl
self.tpsl[self.counter] = [tp, sl]
# Entry Short
if self.Short:
# Close < 9 EMA ( 5 minute )
if Close < self.emafast.Current.Value:
# Open < 9 EMA ( 5 minute)
if Open < self.emafast.Current.Value:
# Close > Open ( 5 minute )
if Close > Open:
# 9EMA < 50EMA ( 5 minute )
if self.emaslow.Current.Value > self.emafast.Current.Value:
# RSI > 35 ( 5 minute )
if self.rsi.Current.Value > 37:
# MACD < -.0001 ( 5 minute )
if self.macdfiveminute.Current.Value < -.00005:
# MACD Current > MACD 1 Bar Ago ( 5 minute and 1 hour )
if self.macdfiveminute.Current.Value < self.lastfiveminutemacdvalues[0] and self.macdonehour.Current.Value < self.lastonehourmacdvalues[0]:
# ATR > .00025
if self.atr.Current.Value > .00025:
# MACD Difference > 0 ( 5 minute and 1 hour )
if self.macdfiveminute.Current.Value - self.lastfiveminutemacdvalues[0] < 0 and self.macdonehour.Current.Value - self.lastonehourmacdvalues[0] < 0:
self.counter += 1
self.MarketOrder(self.pair, -self.quantity)
tp = Close-self.tp
sl = Close+self.sl
self.tpsl[self.counter] = [tp, sl]
# Record MACD values to compare at next datapoint
self.lastfiveminutemacdvalues.append(self.macdfiveminute.Histogram.Current.Value)
self.lastfiveminutemacdvalues.pop(0)
self.lastonehourmacdvalues.append(self.macdonehour.Histogram.Current.Value)
self.lastonehourmacdvalues.pop(0)
# Your New Python Fileclass HyperActiveApricotFalcon(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021, 6, 1)
self.SetEndDate(2021, 7, 1)
self.SetCash(10000)
self.pair = 'AUDUSD'
self.AddForex(self.pair, Resolution.Minute)
# Set Take Profit and Stop Loss Here
self.tp = 0.0008
self.sl = 0.0005
# Long / Short - Set one to True
self.Long = True
self.Short = False
# Set number of open positions allowed at a tome
self.numtrades = 15
self.takeprofit = []
self.stoploss = []
self.numshares = []
self.takeprofitpos = {}
self.stoplosspos = {}
self.quantity = 10000
self.rsi = RelativeStrengthIndex(14, MovingAverageType.Simple)
self.macdfiveminute = MovingAverageConvergenceDivergence(12, 26, 9, MovingAverageType.Simple)
self.macdonehour = MovingAverageConvergenceDivergence(12, 26, 9, MovingAverageType.Simple)
self.atr = AverageTrueRange(14, MovingAverageType.Simple)
self.emafast = ExponentialMovingAverage(9)
self.emaslow = ExponentialMovingAverage(50)
oneHourConsolidator = QuoteBarConsolidator(timedelta(hours=1))
fiveMinuteConsolidator = QuoteBarConsolidator(timedelta(minutes=5))
oneHourConsolidator.DataConsolidated += self.OneHourBarHandler
fiveMinuteConsolidator.DataConsolidated += self.FiveMinuteBarHandler
self.SubscriptionManager.AddConsolidator(self.pair, oneHourConsolidator)
self.SubscriptionManager.AddConsolidator(self.pair, fiveMinuteConsolidator)
self.RegisterIndicator(self.pair, self.rsi, oneHourConsolidator)
self.RegisterIndicator(self.pair, self.macdonehour, oneHourConsolidator)
self.RegisterIndicator(self.pair, self.atr, oneHourConsolidator)
self.RegisterIndicator(self.pair, self.macdfiveminute, fiveMinuteConsolidator)
self.RegisterIndicator(self.pair, self.emafast, fiveMinuteConsolidator)
self.RegisterIndicator(self.pair, self.emaslow, fiveMinuteConsolidator)
self.Schedule.On(self.DateRules.WeekEnd(self.pair), self.TimeRules.BeforeMarketClose(self.pair), self.WeekendLiquidation)
self.fiveminbaropen = 0
self.SetWarmUp(500)
self.lastfiveminutemacdvalues = []
self.lastonehourmacdvalues = []
self.removekeys = []
self.counter = 0
self.tpsl = {}
def OneHourBarHandler(self, sender, consolidated):
pass
def FiveMinuteBarHandler(self, sender, consolidated):
pass
def WeekendLiquidation(self):
self.Liquidate()
self.tpsl = {}
def OnData(self, data):
if not self.macdonehour.IsReady:
return
if len(self.lastfiveminutemacdvalues) < 2:
self.lastfiveminutemacdvalues.append(self.macdfiveminute.Histogram.Current.Value)
self.lastonehourmacdvalues.append(self.macdonehour.Histogram.Current.Value)
return
Close = (data[self.pair].Bid.Close+data[self.pair].Ask.Close)/2
Open = (data[self.pair].Bid.Open+data[self.pair].Ask.Open)/2
Low = (data[self.pair].Bid.Low+data[self.pair].Ask.Low)/2
High = (data[self.pair].Bid.High+data[self.pair].Ask.High)/2
Price = data[self.pair].Price
# Exit Trades
if self.Long:
if len(self.tpsl) > 0:
# Check Take Profit
for key, value in self.tpsl.items():
if High >= value[0]:
self.MarketOrder(self.pair, -self.quantity)
self.removekeys.append(key)
# Check Stop Loss
for key, value in self.tpsl.items():
if Low <= value[1]:
self.MarketOrder(self.pair, -self.quantity)
self.removekeys.append(key)
if self.Short:
if len(self.tpsl) > 0:
# Check Take Profit
for key, value in self.tpsl.items():
if Low <= value[0]:
self.MarketOrder(self.pair, self.quantity)
self.removekeys.append(key)
# Check Stop Loss
for key, value in self.tpsl.items():
if High >= value[1]:
self.MarketOrder(self.pair, self.quantity)
self.removekeys.append(key)
if len(self.removekeys) > 0:
for x in self.removekeys:
self.tpsl.pop(x)
self.removekeys.clear()
# Limit number of open trades
if len(self.tpsl) >= self.numtrades:
return
# Entry Long
if self.Long:
# Close > 9 EMA ( 5 minute )
if Close > self.emafast.Current.Value:
# Open > 9 EMA ( 5 minute)
if Open > self.emafast.Current.Value:
# Close < Open ( 5 minute )
if Close < Open:
# 9EMA > 50EMA ( 5 minute )
if self.emaslow.Current.Value < self.emafast.Current.Value:
# RSI < 65 ( 5 minute )
if self.rsi.Current.Value < 63:
# MACD > .0001 ( 5 minute )
if self.macdfiveminute.Current.Value > .0001:
# MACD Current > MACD 1 Bar Ago ( 5 minute and 1 hour )
if self.macdfiveminute.Current.Value > self.lastfiveminutemacdvalues[0] and self.macdonehour.Current.Value > self.lastonehourmacdvalues[0]:
# ATR > .00025
if self.atr.Current.Value > .00025:
# MACD Difference > 0 ( 5 minute and 1 hour )
if self.macdfiveminute.Current.Value - self.lastfiveminutemacdvalues[0] > 0 and self.macdonehour.Current.Value - self.lastonehourmacdvalues[0] > 0:
self.counter += 1
self.MarketOrder(self.pair, self.quantity)
tp = Close+self.tp
sl = Close-self.sl
self.tpsl[self.counter] = [tp, sl]
# Entry Short
if self.Short:
# Close < 9 EMA ( 5 minute )
if Close < self.emafast.Current.Value:
# Open < 9 EMA ( 5 minute)
if Open < self.emafast.Current.Value:
# Close > Open ( 5 minute )
if Close > Open:
# 9EMA < 50EMA ( 5 minute )
if self.emaslow.Current.Value > self.emafast.Current.Value:
# RSI > 35 ( 5 minute )
if self.rsi.Current.Value > 37:
# MACD < -.0001 ( 5 minute )
if self.macdfiveminute.Current.Value < -.0001:
# MACD Current > MACD 1 Bar Ago ( 5 minute and 1 hour )
if self.macdfiveminute.Current.Value < self.lastfiveminutemacdvalues[0] and self.macdonehour.Current.Value < self.lastonehourmacdvalues[0]:
# ATR > .00025
if self.atr.Current.Value > .00025:
# MACD Difference > 0 ( 5 minute and 1 hour )
if self.macdfiveminute.Current.Value - self.lastfiveminutemacdvalues[0] < 0 and self.macdonehour.Current.Value - self.lastonehourmacdvalues[0] < 0:
self.counter += 1
self.MarketOrder(self.pair, -self.quantity)
tp = Close-self.tp
sl = Close+self.sl
self.tpsl[self.counter] = [tp, sl]
# Record MACD values to compare at next datapoint
self.lastfiveminutemacdvalues.append(self.macdfiveminute.Histogram.Current.Value)
self.lastfiveminutemacdvalues.pop(0)
self.lastonehourmacdvalues.append(self.macdonehour.Histogram.Current.Value)
self.lastonehourmacdvalues.pop(0)