Overall Statistics |
Total Trades 1469 Average Win 0.07% Average Loss -0.05% Compounding Annual Return -6.345% Drawdown 10.700% Expectancy -0.320 Net Profit -10.537% Sharpe Ratio -3.154 Probabilistic Sharpe Ratio 0.000% Loss Rate 72% Win Rate 28% Profit-Loss Ratio 1.39 Alpha -0.052 Beta -0.008 Annual Standard Deviation 0.017 Annual Variance 0 Information Ratio -1.358 Tracking Error 0.128 Treynor Ratio 6.72 Total Fees $0.00 |
import pandas as pd class ResistanceVerticalInterceptor(QCAlgorithm): def Initialize(self): self.SetStartDate(2018, 1, 1) # Set Start Date self.SetStartDate(2018, 6, 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.2 self.symbols = {} self.states = {} self.price = {} self.orderstop = {} self.stoploss= {} self.profittaking = {} self.SetWarmUp(2) self.market = Market.Oanda for i in range(0,len(self.assets)): self.symbols[self.assets[i]] = self.AddForex(self.assets[i], Resolution.Hour, self.market) self.states[self.assets[i]] = 0 self.price[self.assets[i]] = 0 self.orderstop[self.assets[i]] = 0 self.stoploss[self.assets[i]] = 0 self.profittaking[self.assets[i]] = 0 def OnData(self, data): '''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here. Arguments: data: Slice object keyed by symbol containing the stock data ''' history = self.History(self.Securities.Keys, 2, Resolution.Hour) value = self.Portfolio.TotalPortfolioValue cash = self.Portfolio.Cash # go over all tickers for symbol in self.assets: self.holdings = self.Portfolio[symbol].Quantity self.price[symbol] = self.Portfolio[symbol].AveragePrice try: O1 = history.loc[symbol].open[0] #open first candle C1 = history.loc[symbol].close[0] #close first candle L1 = history.loc[symbol].low[0] #low first candle H1 = history.loc[symbol].high[0] #high first candle O2 = history.loc[symbol].open[1] #open second candle C2 = history.loc[symbol].close[1] #close second candle L2 = history.loc[symbol].low[1] #low second candle H2 = history.loc[symbol].high[1] #high second candle W = H2 - L2 #range except: self.Log('>> {} >> Missing Data') return if self.states[symbol] != 0: # if long pattern if self.states[symbol] == 1: # and short pattern if O1 > C1: # and second second contains first if (L2 < L1) and (H2 > H1): self.Liquidate(symbol) self.states[symbol] = 0 self.Debug("Liquidating long") # if short pattern if self.states[symbol] == -1: # and long pattern if O1 < C1: # and second contains first if (L2 < L1) and (H2 > H1): self.Liquidate(symbol) self.states[symbol] = 0 self.Debug("Liquidating short") else: self.Debug("Holding") if self.states[symbol] == 0: # go long if first green if O1 < C1: # and second contains first if (L2 < L1) and (H2 > H1): #self.SetHoldings(symbol, cash*self.risk) self.orderstop[symbol] = (H1 + 0.1 * W) self.stoploss[symbol] = (H1 - 0.2* W) self.profittaking[symbol] = (H1 + 0.8* W) # stop order self.StopMarketOrder(symbol, cash*self.risk, self.orderstop[symbol]) # stoploss self.StopMarketOrder(symbol, -cash*self.risk, self.stoploss[symbol]) # profit taking self.LimitOrder(symbol, -cash*self.risk, self.profittaking[symbol]) self.states[symbol] = 1 self.Debug("Buy") # go short if first red if 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) # stop order self.StopMarketOrder(symbol, -cash*self.risk, self.orderstop[symbol]) # stoploss self.StopMarketOrder(symbol, cash*self.risk, self.stoploss[symbol]) # profit taking self.LimitOrder(symbol, cash*self.risk, self.profittaking[symbol]) self.states[symbol] = -1 self.Debug("Sell")