Overall Statistics |
Total Trades 66 Average Win 0.07% Average Loss -0.12% Compounding Annual Return 3.225% Drawdown 0.500% Expectancy 0.077 Net Profit 0.305% Sharpe Ratio 1.697 Loss Rate 30% Win Rate 70% Profit-Loss Ratio 0.55 Alpha 0.018 Beta 0.026 Annual Standard Deviation 0.015 Annual Variance 0 Information Ratio -4.836 Tracking Error 0.056 Treynor Ratio 1.003 Total Fees $109.46 |
from QuantConnect.Data.Market import TradeBar from datetime import timedelta from System import * from QuantConnect import * from QuantConnect.Algorithm import * from QuantConnect.Indicators import * import decimal as d class MyAlgorithm(QCAlgorithm): def Initialize(self): self.SetStartDate(2017, 1, 14) # Set Start Date self.SetEndDate(2017, 02, 17) self.SetCash(100000) # Set Strategy Cash self.symbolData = dict() self.vwap = dict() for ticker in ["BABA"]: symbol = self.AddEquity(ticker, Resolution.Second).Symbol consolidator_minute = TradeBarConsolidator(60) consolidator_minute.DataConsolidated += self.OnMinuteData self.SubscriptionManager.AddConsolidator(symbol, consolidator_minute) self.symbolData[symbol] = SymbolData() self.vwap[symbol]= self.VWAP(symbol, 23400) self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.Every(timedelta(seconds=10)), Action(self.Tensec)) self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.At(15, 59, 52), Action(self.End_of_day_liquidate)) self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.At(16, 00, 00), Action(self.Resetting)) def OnMinuteData(self, sender, bar): self.symbolData[bar.Symbol].minute_rw.Add(bar) def Resetting(self): for symbol in self.symbolData: self.vwap[symbol].Reset() def OnData(self, data): for symbol in data.Keys: if data[symbol] is None: continue # Create local variable to readability window = self.symbolData[symbol].window # Update the window. If not ready, continue window.Add(data[symbol]) minute = self.symbolData[symbol].minute_rw def Tensec(self): for symbol in self.symbolData: # Create local variable to readability window = self.symbolData[symbol].window # Update the window. If not ready, continue minute = self.symbolData[symbol].minute_rw if not (window.IsReady and minute.IsReady): continue if self.Securities[symbol].Exchange.ExchangeOpen: last_bar = minute[0].Close - minute[0].Open #last_bar_wicks = minute[0].High - minute[0].Low second_bar = minute[1].Close - minute[1].Open third_bar = minute[2].Close - minute[2].Open last_close = window[0].Close last_min_open = minute[0].Open last_min_close = minute[0].Close #sec_min_open = minute[1].Open sec_min_close = minute[1].Close thrd_min_close = minute[2].Close vwap = self.vwap[symbol].Current.Value if not self.Portfolio[symbol].Invested: if (last_bar > 0 and second_bar > 0 and third_bar > 0 and last_min_open < vwap < last_close): self.SetHoldings(symbol, 1.0/3.0) self.Log('long') self.Log(str(symbol)+", "+str(last_bar)+", "+str(second_bar)+", "+str(symbol)+ ", "+str(symbol)+", "+str(symbol)+", "+str(symbol)+", "+str(vwap)) if self.Portfolio[symbol].Invested: if (last_close *d.Decimal(1.005) < self.Portfolio[symbol].AveragePrice or #last_bar > 0 and last_min_open - last_close > last_bar *d.Decimal(2))): last_min_close * d.Decimal(1.002) < vwap or last_close > self.Portfolio[symbol].AveragePrice * d.Decimal(1.0015)): self.Liquidate(symbol) def End_of_day_liquidate(self): self.Liquidate() class SymbolData(object): def __init__(self): self.minute_rw = RollingWindow[TradeBar](5) self.window = RollingWindow[TradeBar](5)