| 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 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 |
class OptimizedResistanceCircuit(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2019, 1, 29) # Set Start Date
self.SetCash(100000) # Set Strategy Cash
# choose the equities with top 100 DollarVolumn as universe
self.AddUniverse(self.Universe.DollarVolume.Top(100))
# self-designed alpha model
self.SetAlpha(WeeklyHighsLowsAlphaModel())
# use existing models for portfolio construction, execution, and risk management
self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel())
self.SetExecution(ImmediateExecutionModel())
self.SetRiskManagement(MaximumDrawdownPercentPerSecurity(0.01))
class WeeklyHighsLowsAlphaModel(AlphaModel):
def __init__(self, lookback = 360, insightPeriod = 10, resolution = Resolution.Daily):
self.resolution = resolution
self.insightPeriod = Time.Multiply(Extensions.ToTimeSpan(resolution), insightPeriod)
self.lookback = lookback
self.symbolData = {}
resolutionString = Extensions.GetEnumString(resolution, Resolution)
self.Name = "{}({}, {})".format(self.__class__.__name__, resolution, insightPeriod)
def Update(self, algorithm, data):
'''Updates this alpha model with the latest data from the algorithm.
This is called each time the algorithm receives data for subscribed securities
Args:
algorithm: The algorithm instance
data: The new data available
Returns:
The new insights generated'''
insights = []
for symbol, symbolData in self.symbolData.items():
if symbolData.Max.IsReady and symbolData.Min.IsReady:
if algorithm.Securities[symbol].Price > symbolData.Max.Current.Value:
insights.append(Insight.Price(symbol, self.insightPeriod, InsightDirection.Up))
if algorithm.Securities[symbol].Price < symbolData.Min.Current.Value:
insights.append(Insight.Price(symbol, self.insightPeriod, InsightDirection.Down))
return insights
def OnSecuritiesChanged(self, algorithm, changes):
'''Event fired each time the we add/remove securities from the data feed
Args:
algorithm: The algorithm instance that experienced the change in securities
changes: The security additions and removals from the algorithm'''
for added in changes.AddedSecurities:
symbolData = self.symbolData.get(added.Symbol)
if symbolData is None:
# create MIN/MAX indicators
symbolData = SymbolData(algorithm, added.Symbol, self.lookback)
self.symbolData[added.Symbol] = symbolData
else:
# a security that was already initialized was re-added, reset the indicators
symbolData.Max.Reset()
symbolData.Min.Reset()
class SymbolData:
def __init__(self, algorithm, symbol, lookback):
self.symbol = symbol
self.Max = Maximum(lookback)
self.Min = Minimum(lookback)
### or
# self.Max = algorithm.MAX(symbol, lookback, Resolution.Daily)
# self.Min = algorithm.MIN(symbol, lookback, Resolution.Daily)
self.window = RollingWindow[TradeBar](lookback)
algorithm.Consolidate(symbol, CalendarType.Weekly, self.CalendarTradeBarHandle)
def CalendarTradeBarHandle(self, bar):
self.Max.Update(bar.EndTime, bar.Close)
self.Min.Update(bar.EndTime, bar.Close)
self.window.Add(bar)