| Overall Statistics |
|
Total Trades 11 Average Win 0% Average Loss 0% Compounding Annual Return 36.569% Drawdown 0.500% Expectancy 0 Net Profit 2.741% Sharpe Ratio 6.071 Probabilistic Sharpe Ratio 96.567% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.122 Beta 0.238 Annual Standard Deviation 0.041 Annual Variance 0.002 Information Ratio -3.381 Tracking Error 0.082 Treynor Ratio 1.035 Total Fees $11.00 Estimated Strategy Capacity $20000000.00 Lowest Capacity Asset IBM R735QTJ8XC9X |
# region imports
from AlgorithmImports import *
import pandas as pd
import numpy as np
from datetime import time, datetime, timedelta
# endregion
class MyAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021, 3, 15) # Set Start Date
self.SetEndDate(2021, 4, 15)
self.SetCash(100000) # Set Strategy Cash
self.symbolData = {}
self.ticker_list = ['AAPL', 'IBM', 'DIS', 'MSFT']
for ticker in self.ticker_list:
symbol = self.AddEquity(ticker).Symbol
self.symbolData[symbol] = SymbolData(self, symbol)
self.invest = False
self.sell = True
self.liquidate = True
'''
self.potential_buy = False
self.indicator_week = False
self.indicator_day = 0
self.indicatorHigh = 0
self.indicatorWeekHigh = 0
'''
self.potential_buy = {}
self.indicator_week = {}
self.indicator_day = {}
self.indicatorHigh = {}
self.indicatorWeekHigh = {}
for symbol, data in self.symbolData.items():
# define a consolidator to consolidate data for this symbol on the requested period
dailyConsolidator = TradeBarConsolidator(timedelta(days=1))
weeklyConsolidator = TradeBarConsolidator(Calendar.Weekly)
# write up our consolidator to update the indicator
dailyConsolidator.DataConsolidated += self.OnTwoDayBar
weeklyConsolidator.DataConsolidated += self.OnTwoWeekBar
# we need to add this consolidator so it gets auto updates
self.SubscriptionManager.AddConsolidator(data.symbol, dailyConsolidator)
self.SubscriptionManager.AddConsolidator(data.symbol, weeklyConsolidator)
def OnTwoDayBar(self, sender, bar):
self.symbolData[bar.Symbol].barWindow.Add(bar)
self.barWindow = self.symbolData[bar.Symbol].barWindow
if not self.barWindow.IsReady:
return
indicatorBar = self.barWindow[0]
previousBar = self.barWindow[1]
self.indicatorHigh[bar.Symbol] = indicatorBar.High
indicatorLow = indicatorBar.Low
previousHigh = previousBar.High
previousLow = previousBar.Low
# Inside Bar
if (self.indicatorHigh[bar.Symbol] < previousHigh) and (indicatorLow > previousLow):
self.indicator_day[bar.Symbol] = self.Time.day
self.potential_buy[bar.Symbol] = True
# 2Down
if (self.indicatorHigh[bar.Symbol] < previousHigh) and (indicatorLow < previousLow):
self.indicator_day[bar.Symbol] = self.Time.day
self.potential_buy[bar.Symbol] = True
def OnTwoWeekBar(self, sender, bar):
self.symbolData[bar.Symbol].weekBarWindow.Add(bar)
self.barWindow = self.symbolData[bar.Symbol].weekBarWindow
if not self.barWindow.IsReady:
return
indicatorBar = self.barWindow[0]
previousBar = self.barWindow[1]
self.indicatorWeekHigh[bar.Symbol] = indicatorBar.High
indicatorLow = indicatorBar.Low
previousHigh = previousBar.High
previousLow = previousBar.Low
# Inside Bar
if (self.indicatorWeekHigh[bar.Symbol] < previousHigh) and (indicatorLow > previousLow):
self.indicator_week[bar.Symbol] = True
self.Debug(str(self.indicator_week) + str(bar.Symbol.Value))
# 2Down
if (self.indicatorHigh[bar.Symbol] < previousHigh) and (indicatorLow < previousLow):
self.indicator_week[bar.Symbol] = True
def OnData(self, data):
for symbol in self.symbolData.keys():
symboldata = self.symbolData[symbol]
if symboldata.IsReady():
profit = self.Portfolio[symbol].UnrealizedProfitPercent
symbol_price = self.Securities[symbol].Price
if (self.indicator_day[symbol] == self.Time.day) and (symbol_price > self.indicatorHigh[symbol]) and self.potential_buy[symbol]:
shares_to_buy = int(self.Portfolio.Cash / data[symbol].Open)
self.Debug(symbol)
self.MarketOrder(symbol, (shares_to_buy*0.1))
self.potential_buy[symbol] = False
if symbol in self.indicatorWeekHigh is True:
if symbol in self.indicator_week is True:
if (symbol_price > self.indicatorWeekHigh[symbol]) and self.indicator_week[symbol]:
shares_to_buy = int(self.Portfolio.Cash / data[symbol].Open)
self.Debug(symbol)
self.MarketOrder(symbol, (shares_to_buy*0.1))
self.potential_buy[symbol] = False
class SymbolData:
def __init__(self, algorithm, symbol):
self.algorithm = algorithm
self.symbol = symbol
self.barWindow = RollingWindow[TradeBar](2)
self.weekBarWindow = RollingWindow[TradeBar](2)
def IsReady(self):
return self.barWindow.IsReady and self.weekBarWindow.IsReady