Overall Statistics |
Total Trades 7297 Average Win 0.01% Average Loss -0.02% Compounding Annual Return -2.588% Drawdown 10.400% Expectancy -0.195 Net Profit -10.313% Sharpe Ratio -2.108 Probabilistic Sharpe Ratio 0.000% Loss Rate 59% Win Rate 41% Profit-Loss Ratio 0.95 Alpha -0.021 Beta -0.001 Annual Standard Deviation 0.01 Annual Variance 0 Information Ratio -1.206 Tracking Error 0.115 Treynor Ratio 34.569 Total Fees $0.00 |
import pandas as pd class ResistanceVerticalInterceptor(QCAlgorithm): def Initialize(self): self.SetStartDate(2016, 1, 1) # Set Start Date self.SetCash(100000) # Set Strategy Cash self.assets = ["GBPUSD"] #some other assets ["EURGBP","GBPJPY", "USDJPY"] self.count = len(self.assets) self.risk = 0.1 self.price = {} self.orderstop = {} self.stoploss= {} self.profittaking = {} # create order tickets for each symbol self.orderticket = {} self.stoplossticket = {} self.takeprofitticket = {} self.reverseticket = {} self.holdings = {} self.SetWarmUp(2) self.market = Market.Oanda self.windows = {} for ticker in self.assets: symbol = self.AddForex(ticker, Resolution.Hour, self.market).Symbol self.price[symbol] = 0 self.orderstop[symbol] = 0 self.stoploss[symbol] = 0 self.profittaking[symbol] = 0 self.windows[symbol] = RollingWindow[TradeBar](2) self.holdings[symbol] = 0 self.orderticket[symbol] = 0 self.stoplossticket[symbol] = 0 self.takeprofitticket[symbol] = 0 self.reverseticket[symbol] = 0 def OnData(self, data): value = self.Portfolio.TotalPortfolioValue cash = self.Portfolio.Cash # go over all tickers for symbol in self.windows: # this is needed for OnOrderEvent to cancel the right tickets #self.symbol = symbol if data.ContainsKey(symbol) and data.Bars[symbol] != None: self.windows[symbol].Add(data.Bars[symbol]) self.holdings[symbol] = self.Portfolio[symbol].Quantity self.price[symbol] = self.Portfolio[symbol].AveragePrice self.invest = cash*self.risk if not self.windows[symbol].IsReady: continue firstBar = self.windows[symbol][0] O1 = firstBar.Open #open first candle C1 = firstBar.Close #close first candle L1 = firstBar.Low #low first candle H1 = firstBar.High #high first candle secondBar = self.windows[symbol][1] O2 = secondBar.Open #open second candle C2 = secondBar.Close #close second candle L2 = secondBar.Low #low second candle H2 = secondBar.High #high second candle W = H2 - L2 #range # if no prior holding if self.holdings[symbol] == 0: # go long if first green if O1 < C1: # and second contains first if (L2 < L1) and (H2 > H1): self.orderstop[symbol] = (H1 + 0.1 * W) self.stoploss[symbol] = (H1 - 0.2* W) self.profittaking[symbol] = (H1 + 0.8* W) # calc how much to buy self.quantity = int(self.invest/C2) # stop order self.orderticket[symbol] = self.MarketOrder(symbol, self.quantity) # stop loss self.stoplossticket[symbol] = self.StopMarketOrder(symbol, -self.quantity, self.orderstop[symbol]) # profit taking self.takeprofitticket[symbol] = self.LimitOrder(symbol, -self.quantity, self.profittaking[symbol]) # message self.Debug("Going long: " + str(symbol)) # skip to next symbol continue # go short if first red elif O1 > C1: # and second second contains first if (L2 < L1) and (H2 > H1): self.orderstop[symbol] = (L1 - 0.1 * W) self.stoploss[symbol] = (L1 + 0.2* W) self.profittaking[symbol] = (L1 - 0.8* W) # calc how much to buy #self.quantity = int(self.invest/self.orderstop[symbol] - self.stoploss[symbol]) self.quantity = int(self.invest/C2) # stop order self.orderticket[symbol] = self.MarketOrder(symbol, -self.quantity) # stop loss self.stoplossticket[symbol] = self.StopMarketOrder(symbol, self.quantity, self.orderstop[symbol]) # profit taking self.takeprofitticket[symbol] = self.LimitOrder(symbol, self.quantity, self.profittaking[symbol]) # message self.Debug("Going short: " + str(symbol)) # skip to next symbol continue # if long pattern elif self.holdings[symbol] > 0: # and then short pattern if O1 > C1: # and second second contains first if (L2 < L1) and (H2 > H1): self.reverseticket[symbol] = self.Liquidate(symbol) self.Debug("Reversing long: " + str(symbol)) continue # if short pattern elif self.holdings[symbol] < 0: # and long pattern if O1 < C1: # and second contains first if (L2 < L1) and (H2 > H1): self.reverseticket[symbol] = self.Liquidate(symbol) self.Debug("Reversing short: " + str(symbol)) continue def OnOrderEvent(self, orderEvent): for symbol in self.windows: try: # if stoploss is triggered cancel profit taking if self.stoplossticket[symbol].Status == OrderStatus.Filled: self.takeprofitticket[symbol].Cancel self.Debug("Stoploss triggered: " + str(symbol)) # if profit taking is triggered cancel stoploss if self.takeprofitticket[symbol].Status == OrderStatus.Filled: self.stoplossticket[symbol].Cancel self.Debug("Takeprofit triggered: " + str(symbol)) # if position is reversed if self.reverseticket[symbol].Status == OrderStatus.Filled: self.stoplossticket[symbol].Cancel self.takeprofitticket[symbol].Cancel self.Debug("Position reversed: " + str(symbol)) except: self.Debug("No Ticket for Symbol: " + str(symbol))