| 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 Probabilistic 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 -2.613 Tracking Error 0.132 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 |
from datetime import datetime
### Demonstrates how to create a custom indicator and register it for automatic updates
class CustomIndicatorAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021, 1, 1)
self.SetEndDate(2021, 5, 1)
symbol = self.AddEquity("TSLA", Resolution.Daily).Symbol
# Create custom indicator
self.indicator = CustomIndicator('custom', 8, 10, 4)
# Register inidicator for automatic updates
self.RegisterIndicator("TSLA", self.indicator, Resolution.Daily)
# Warm up indicator
history = self.History(symbol, self.indicator.Period, Resolution.Daily)
if history.empty or 'close' not in history.columns:
return
for time, row in history.loc[symbol].iterrows():
tradebar = TradeBar(time, symbol, row.open, row.high, row.low, row.close, row.volume)
self.indicator.Update(tradebar)
def OnData(self, data):
if self.indicator.IsReady:
self.Plot("Custom", "Value", self.indicator.Value)
class CustomIndicator(PythonIndicator):
def __init__(self, name, n1, n2, n3):
self.Name = name
self.Time = datetime.min
self.Value = 0
# Internal indicators
self.esa = ExponentialMovingAverage(n1)
self.d = ExponentialMovingAverage(n1)
self.tci = ExponentialMovingAverage(n2)
self.wt2 = SimpleMovingAverage(n3)
self.Period = n1 + n1 + n2 + n3
# Update method is mandatory
def Update(self, input):
self.Time = input.EndTime
self.Value = 0
# get the hlc3 price for average
ap = (input.High + input.Low + input.Close) / 3
# get the ema based on the hlc3
if not self.esa.Update(input.Time, ap):
return False
# generate ema based on the absolute value of the average price - the ema on period n1
if not self.d.Update(input.Time, abs(ap - self.esa.Current.Value)) or self.d.Current.Value == 0:
return False
# return some calculated value with some tolerance
ci = (ap - self.esa.Current.Value) / (0.015 * self.d.Current.Value)
# generate ema based on above
if not self.tci.Update(input.Time, ci):
return False
# generate sma from tci
if not self.wt2.Update(input.Time, self.tci.Current.Value):
return False
# Set indicator value
self.Value = self.wt2.Current.Value
# Return IsReady
return True