| Overall Statistics |
|
Total Trades 48 Average Win 0.25% Average Loss -0.21% Compounding Annual Return 0.298% Drawdown 1.600% Expectancy 0.008 Net Profit 0.029% Sharpe Ratio 0.076 Loss Rate 54% Win Rate 46% Profit-Loss Ratio 1.20 Alpha 0.066 Beta -0.213 Annual Standard Deviation 0.043 Annual Variance 0.002 Information Ratio -3.701 Tracking Error 0.079 Treynor Ratio -0.016 Total Fees $79.94 |
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_daily = TradeBarConsolidator(timedelta(1))
consolidator_daily.DataConsolidated += self.OnDailyData
self.SubscriptionManager.AddConsolidator(symbol, consolidator_daily)
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, 20000)
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(9, 30, 00),
Action(self.Reset_counter))
# Add daily bar to daily rolling window
def OnDailyData(self, sender, bar):
self.symbolData[bar.Symbol].daily_rw.Add(bar)
def OnMinuteData(self, sender, bar):
self.symbolData[bar.Symbol].minute_rw.Add(bar)
def Reset_counter(self):
self.xe = 0
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
if not (window.IsReady and minute.IsReady): continue
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 not self.Portfolio[symbol].Invested and self.Securities[symbol].Exchange.ExchangeOpen:
#if self.xe > 0: self.xe = self.xe - 1
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
fourth_bar = minute[3].Close - minute[3].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
vwap = self.vwap[symbol]
if (last_bar > 0 and second_bar > 0 and third_bar > 0 and last_min_open < last_close):
self.SetHoldings(symbol, 1.0/3.0)
self.Log('shorting')
self.Log(str(symbol)+", "+str(last_bar)+", "+str(second_bar)+", "+str(symbol)+
", "+str(symbol)+", "+str(symbol)+", "+str(symbol)+", "+str(vwap))
#self.xe = self.xe + 5
if self.Portfolio[symbol].Invested:
if self.xe > 0: self.xe = self.xe - 1
last_close = window[0].Close
last_min_open = minute[0].Open
last_min_close = minute[0].Close
last_bar = minute[0].Close - minute[0].Open
second_bar = minute[1].Close - minute[1].Open
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))):
self.Liquidate(symbol)
# self.xe = self.xe + 5
def End_of_day_liquidate(self):
self.Liquidate()
class SymbolData(object):
def __init__(self):
self.daily_rw = RollingWindow[TradeBar](5)
self.minute_rw = RollingWindow[TradeBar](5)
#self.tensec_rw = RollingWindow[TradeBar](5)
self.window = RollingWindow[TradeBar](5)