| Overall Statistics |
|
Total Trades 36 Average Win 0.00% Average Loss 0.00% Compounding Annual Return -0.119% Drawdown 0.300% Expectancy 0.105 Net Profit -0.018% Sharpe Ratio -0.015 Probabilistic Sharpe Ratio 33.061% Loss Rate 42% Win Rate 58% Profit-Loss Ratio 0.89 Alpha 0.015 Beta -0.033 Annual Standard Deviation 0.008 Annual Variance 0 Information Ratio -3.732 Tracking Error 0.123 Treynor Ratio 0.004 Total Fees $0.00 Estimated Strategy Capacity $13000000.00 |
import numpy as np
from collections import deque
from datetime import timedelta
import decimal as d
class BreakoutExample(QCAlgorithm):
class MacdState:
''' This class is used to save the state of the MACD values with each bar'''
def __init__(self, macd):
if not macd.IsReady:
self.Macd = 0.0
self.Fast = 0.0
self.Slow = 0.0
self.Signal = 0.0
else:
self.Macd = macd.Current.Value
self.Fast = macd.Fast.Current.Value
self.Slow = macd.Slow.Current.Value
self.Signal = macd.Signal.Current.Value
def Initialize(self):
# Set the cash for backtest
self.SetCash(100000)
# Start and end dates for backtest
self.SetStartDate(2021,3,1)
self.SetEndDate(2021,4,25)
self.Hist = 100
# Add asset
self.symbol = self.AddForex("AUDUSD", Resolution.Minute).Symbol
#Self.addForex("AUDUSD",Resolution.Minute)
# Schedule function 5 minutes after every market open
self.Schedule.On(self.DateRules.EveryDay(self.symbol), \
self.TimeRules.AfterMarketOpen(self.symbol, 5), \
Action(self.EveryMarketOpen))
# create a 15 day exponential moving average
self.fast = self.EMA(self.symbol, 9, Resolution.Minute);
self.slow = self.EMA(self.symbol, 50, Resolution.Minute);
# create a 30 day exponential moving average
self.__macd = self.MACD("AUDUSD", 12, 26, 9, MovingAverageType.Exponential, Resolution.Minute)
self.__atr = self.ATR("AUDUSD", 14)
self.__previous = datetime.min
self.PlotIndicator("MACD", True, self.__macd, self.__macd.Signal)
self.PlotIndicator("AUDUSD", self.__macd.Fast, self.__macd.Slow)
self.closeval = self.History(self.symbol, 1, Resolution.Minute)["close"]
self.openprice = self.History(self.symbol, 1, Resolution.Minute)["open"]
self.lowval = self.History(self.symbol, 1, Resolution.Minute)["low"]
self.macd = self.MACD("AUDUSD", 12, 26, 9, MovingAverageType.Exponential)
self.macd.Updated += self.macdUpdated
self.SubscriptionManager
self.macdHist = deque([self.MacdState(self.macd)], self.Hist)
fiveMinuteConsolidator = QuoteBarConsolidator(timedelta(minutes=5))
# attach our event handler. the event handler is a function that will
# be called each time we produce a new consolidated piece of data.
fiveMinuteConsolidator.DataConsolidated += self.FiveMinuteBarHandler
# this call adds our 30 minute consolidator to
# the manager to receive updates frnom the engine
self.SubscriptionManager.AddConsolidator("AUDUSD", fiveMinuteConsolidator)
def FiveMinuteBarHandler(self, sender, consolidated):
'''This is our event handler for our 5 minute trade bar defined above in Initialize(). So each time the
consolidator produces a new 5 minute bar, this function will be called automatically. The 'sender' parameter
will be the instance of the IDataConsolidator that invoked the event, but you'll almost never need that!'''
def macdUpdated(self, sender, updated):
# Save the current state of the macd values by instantiating a new MacdState
# object and adding it to the deque
self.macdHist.appendleft(self.MacdState(self.macd))
def OnData(self, data):
if not self.Portfolio.Invested:
price = data[self.symbol].Close
self.Buy("AUDUSD", 1000)
self.LimitOrder(self.symbol, -1000, price + 0.0008)
self.StopMarketOrder(self.symbol, -1000, price - .0005)
fxOpen = data['AUDUSD'].Open ## Market Open FX Rate
fxClose = data['AUDUSD'].Close ## Market Close FX Rate
## If you are subscribed to more than one Forex or Futures data stream then you can
## access the QuoteBar dictionary and then subset this for your desired Forex symbol
fxQuoteBars = data.QuoteBars
audusdQuoteBar = fxQuoteBars['AUDUSD'] ## audusd QuoteBar
fxOpen = audusdQuoteBar.Open ## Market Open FX Rate
fxClose = audusdQuoteBar.Close ## Market Close FX Rate
def EveryMarketOpen(self):
self.Plot("Data Chart", self.symbol, self.Securities[self.symbol].Close)
MACDdifference = self.__macd.Current.Value - self.__macd.Signal.Current.Value
if self.fast > self.slow and MACDdifference > 0 and self.macdHist[2].Macd > self.__macd.Current.Value and self.__macd.Current.Value > 0.0001 and self.openprice > self.fast and self.closeval > self.fast and self.openprice < self.fast and self.__atr > 0.00025:
if not (MACDdifference < 0 and self.macdHist[1] < self.__macd.Current.Value and self.macdHist[2] < self.__macd.Current.Value):
if (self.Securities["AUDUSD"].Price - self.fast) > .0003:
self.SetHoldings("AUDUSD",10000)