| Overall Statistics |
|
Total Trades 4782 Average Win 0.14% Average Loss -1.00% Compounding Annual Return 39.142% Drawdown 25.500% Expectancy 0.109 Net Profit 83.153% Sharpe Ratio 1.034 Probabilistic Sharpe Ratio 43.415% Loss Rate 3% Win Rate 97% Profit-Loss Ratio 0.14 Alpha 0.223 Beta 1.283 Annual Standard Deviation 0.306 Annual Variance 0.094 Information Ratio 1.005 Tracking Error 0.243 Treynor Ratio 0.247 Total Fees $6732.00 Estimated Strategy Capacity $11000000.00 Lowest Capacity Asset SPY R735QTJ8XC9X |
#region imports
from AlgorithmImports import *
#endregion
class BasicTemplateAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020,9,7)
self.SetCash(2000000)
self.Data_Symbol = {}
tickers = ["SPY", #10 stocks per row
"AAPL","MSFT","AMZN","GOOGL", "FB", "TSLA", "TSM", "BABA","V",
]
#self.SetWarmUp(10, Resolution.Daily)
for stock in tickers:
symbol = self.AddEquity(stock, Resolution.Minute).Symbol
self.Data_Symbol[symbol] = SymbolData(self, symbol)
self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.Every(timedelta(minutes=1)), self.EveryDayAfterMarketOpen)
def EveryDayAfterMarketOpen(self):
#if self.IsWarmingUp: return
for symbol, symbol_data in self.Data_Symbol.items():
if not symbol_data.cci.IsReady: continue
holdings = self.Portfolio[symbol]
invested = holdings.Invested
nowprice = holdings.Price
aveprice = holdings.AveragePrice
quantity = holdings.Quantity
bpower = self.Portfolio.Cash
vestedvalue = self.Portfolio.TotalHoldingsValue
totalvalue = self.Portfolio.TotalPortfolioValue
limita = 0.1 * totalvalue
mofactor = 100
losta = 0.98
pofita = 1.03
dropa = 0.95
cci = symbol_data.cci.Current.Value
ccil = symbol_data.ccil.Current.Value
rsi = symbol_data.rsi.Current.Value
wilr = symbol_data.wilr.Current.Value
close = symbol_data.close.Current.Value
opena = symbol_data.open.Current.Value
high = symbol_data.high.Current.Value
if self.LiveMode and not invested: # and bpower > nowprice * mofactor and nowprice < limita and vestedvalue < (0.7 * totalvalue):
self.Log(f'{symbol} :: {cci:.6},{ccil:.6},{rsi:.6},{wilr:.6},{close:.6},{opena:.6},{high:.6}')
if self.LiveMode and invested and quantity > 0 and ((bpower > nowprice * mofactor and nowprice < aveprice * 0.95) or nowprice > aveprice * pofita):
self.Log(f'{symbol} :: {aveprice:.6}, {nowprice:.6},{quantity:.6},{bpower:.6}')
#Halt due to day trade limit###
if not invested and vestedvalue < (0.7 * totalvalue) and bpower > nowprice * mofactor and (nowprice * mofactor) < limita:
if (nowprice < close * losta) or (nowprice < opena * losta) or (nowprice < high * dropa) or cci < -50 or ccil < -90 or rsi < 20 or wilr < -85:
self.MarketOrder(symbol, mofactor)
if self.LiveMode:
self.Log(f'{symbol} bought on {self.Time}')
if invested and nowprice < aveprice * 0.95 and bpower > nowprice * mofactor and quantity < (6 * mofactor):
#self.MarketOrder(symbol, + mofactor)
self.LimitOrder(symbol, + mofactor, (aveprice * 0.95))
if invested and nowprice < aveprice * 0.90 and bpower > nowprice * mofactor and quantity > (4 * mofactor) and quantity < (10 * mofactor):
#self.MarketOrder(symbol, + mofactor)
self.LimitOrder(symbol, + mofactor, (aveprice * 0.90))
if invested and nowprice > aveprice * pofita:
self.LimitOrder(symbol, (-1 * quantity), (aveprice * pofita))
if invested and nowprice < aveprice * 0.85:
self.Liquidate(symbol)
class SymbolData:
def __init__ (self,algo,symbol):
self.algorithm = algo
self.symbol = symbol
self.cci = algo.CCI(symbol, 3, MovingAverageType.Simple, Resolution.Hour)
self.ccil = algo.CCI(symbol, 5, MovingAverageType.Simple, Resolution.Hour)
self.rsi = algo.RSI(symbol, 5, MovingAverageType.Simple, Resolution.Hour)
self.wilr = algo.WILR(symbol, 5, Resolution.Hour)
self.close = algo.Identity(symbol, Resolution.Daily,Field.Close)
self.open = algo.Identity(symbol, Resolution.Hour,Field.Open)
self.high = algo.Identity(symbol, Resolution.Hour,Field.High)