Overall Statistics |
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset |
import numpy as np class JumpingSkyBlueHorse(QCAlgorithm): def Initialize(self): self.SetStartDate(2018, 1, 1) # Set Start Date self.SetEndDate(2020,1,1) self.SetCash(10000) self.Settings.FreePortfolioValuePercentage = 0.3 self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage) self.entrySignalMessage = "" self.exitSignalMessage = "" self.AddEquity("IBM", Resolution.Hour) self.SetWarmup(12) self.obv = OnBalanceVolume() self.RegisterIndicator("IBM", self.obv, Resolution.Hour) self.priceWindow = RollingWindow[float](12) self.obvWindow = RollingWindow[float](12) #self.momentum = Momentum(self.forex, Resolution.Daily,) # Price offset for stop order self.initialStopRisk = 0.98 self.trailingStopRisk = 0.96 self.target = 1.06 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 ''' self.UpdateRollingWindows() #if not self.IsWarmingUp() and self.IndicatorsAreReady(): if self.EntrySignalFired(): if not self.Portfolio.Invested: self.SetHoldings("IBM", 0.02, tag=self.entrySignalMessage) self.stopMarketTicket = self.StopMarketOrder("IBM", -self.Portfolio["IBM"].Quantity, self.Portfolio["IBM"].AveragePrice*self.initialStopRisk) self.entrySignalMessage = "" #self.Debug(f"The lot quantity is {lotQuantity}") if self.Portfolio["IBM"].IsLong: # If no order exists, send stop-loss if not self.Transactions.GetOpenOrders("IBM"): self.stopMarketTicket = self.StopMarketOrder("IBM", -self.Portfolio["IBM"].Quantity, self.Portfolio["IBM"].AveragePrice*self.initialStopRisk) self.targetMarketTicket = self.LimitOrder("IBM", -self.Portfolio["IBM"].Quantity, self.Portfolio["IBM"].AveragePrice*self.target) if self.Securities["IBM"].Close > self.Portfolio["IBM"].AveragePrice and self.initialStopRisk*self.Portfolio["IBM"].AveragePrice < self.Securities["IBM"].Price*self.trailingStopRisk: updateFields = UpdateOrderFields() updateFields.StopPrice = self.Securities["IBM"].Price*self.trailingStopRisk if not self.stopMarketTicket != OrderStatus.Invalid: self.stopMarketTicket.Update(updateFields) self.Debug(f"The stop price is {updateFields.StopPrice}") if self.ExitSignalFired(): if self.Portfolio["IBM"].Invested: self.Liquidate() self.stopMarketTicket.Cancel() self.targetMarketTicket.Cancel() def EntrySignalFired(self): # # for i in range(self.priceWindow[1:i-1:1]): # # if (index+1 < len(self.priceWindow) and index-1>=0): # # up = count(self.priceWindow[index] > self.priceWindow[index -1]) # # down = count(self.priceWindow[index] < self.priceWindow[index -1]) if not self.priceWindow.IsReady and self.obvWindow.IsReady: return obvList = list(self.obvWindow) obvList.reverse() obvList = obvList[:-1] self.Debug(obvList[:-1]) self.Debug(obvList[-2:]) #obvMax = max(obvList) upCount = 0 downCount = 0 closeList = list(self.priceWindow) closeList.reverse() for index, elem in enumerate(closeList): if (index+1 < len(closeList) and index-1>=0): prev = closeList[index-1] current = closeList[index] if prev < current: upCount += 1 if prev > current: downCount += 1 # if upCount > downCount and (self.obvWindow[0] > obvMax): # #self.Debug(upCount) # return True return False def ExitSignalFired(self): # if self.Portfolio["IBM"].Invested: # if self.lowWindow[0] < self.lowWindow[1]: # return True pass def UpdateRollingWindows(self): self.priceWindow.Add(self.Securities["IBM"].Close) self.obvWindow.Add(self.obv.Current.Value) def IndicatorsAreReady(): return self.obv.IsReady def PlotCharts(self): pass