Overall Statistics |
Total Trades 106 Average Win 2.00% Average Loss -1.14% Compounding Annual Return -9.383% Drawdown 16.700% Expectancy -0.114 Net Profit -7.535% Sharpe Ratio -0.467 Loss Rate 68% Win Rate 32% Profit-Loss Ratio 1.76 Alpha -0.03 Beta -0.194 Annual Standard Deviation 0.146 Annual Variance 0.021 Information Ratio -1.3 Tracking Error 0.205 Treynor Ratio 0.352 Total Fees $0.00 |
class HeikinCashi(QCAlgorithm): def Initialize(self): # Set our main strategy parameters self.SetStartDate(2019,1,2) self.SetCash(200) self.SetBrokerageModel(BrokerageName.OandaBrokerage) self.SetTimeZone( "Europe/Berlin" ); # Direction current position self.CP_D = "None" self.HK_PS = "None" self.HK_S = "None" self.Currencies = ["AUDUSD"] self.HK = dict() # Create dict to hold all our HK Indicators self.MO = dict() # Create dict to hold all our MO Indicators for Currency in self.Currencies: # Find more symbols here: http://quantconnect.com/data self.AddForex(Currency, Resolution.Daily, Market.Oanda) self.HK[Currency] = self.HeikinAshi(Currency, Resolution.Daily) self.MO[Currency] = self.MOM(Currency, 10, Resolution.Daily) self.Schedule.On(self.DateRules.Every(DayOfWeek.Friday), \ self.TimeRules.BeforeMarketClose(Currency, 60), \ self.EveryFridayBeforeMarketClose) def OnData(self, data): for Currency in self.Currencies: # Aliases # ----------------------------------------------------------------- # Heikin HK_O = self.HK[Currency].Open.Current.Value HK_C = self.HK[Currency].Close.Current.Value HK_P = self.HK[Currency].Current.Price # OHLC O = data[Currency].Open C = data[Currency].Close P = data[Currency].Price # Momentum MO_D = self.MO[Currency].Current.Value # ----------------------------------------------------------------- # Work out Heikin Sentiment # --------------------------------------- self.HK_PS = self.HK_S if HK_O < HK_C: self.HK_S = "Bull" elif HK_O > HK_C: self.HK_S = "Bear" else: self.HK_S = "None" # Logging # ----------------------------------------------------------------- #self.Log("{0} OC >> O: {1}, C:{2} | Price: {3}".format(Currency, O,C,P)) #self.Log("{0} Heikin >> O: {1}, C:{2} | Price: {3} | Sentiment: {4}".format(Currency, HK_O,HK_C,HK_P,HK_S)) # Entry / Exit Criteria # ----------------------------------------------------------------- # Check if we are in the market if not self.Portfolio.Invested: # If not, we check HK sentiment is bullish if self.HK_S == "Bull" and self.HK_S == self.HK_PS and MO_D > 0: self.MarketOrder(Currency, 1000, False, "Long") self.CP_D = "Bull" #self.Log("{0} Momentum >> {1}".format(Currency, MO_D)) elif self.HK_S == "Bear" and self.HK_S == self.HK_PS and MO_D < 0: self.MarketOrder(Currency, -1000, False, "Short") self.CP_D = "Bear" #self.Log("{0} Momentum >> {1}".format(Currency, MO_D)) else: #self.Log("{0} Profit: {1} {2}".format(Currency, self.Portfolio[Currency].UnrealizedProfit, self.HK_S)) if self.CP_D != self.HK_S: self.Log("{0} Realized Profit: {1} {2}".format(Currency, self.Portfolio[Currency].UnrealizedProfit, self.HK_S)) self.Liquidate(Currency) # Override the base class event handler for order events def OnOrderEvent(self, orderEvent): order = self.Transactions.GetOrderById(orderEvent.OrderId) self.Debug("{0}: {1}".format(order.Type, orderEvent)) if self.CP_D == "Bull" and order.Status == OrderStatus.Filled: self.CP_D = "None" if self.CP_D == "Bear" and order.Status == OrderStatus.Filled: self.CP_D = "None" def EveryFridayBeforeMarketClose(self): self.Liquidate()