Created with Highcharts 12.1.2EquityJan 6Jan 13Jan 20Jan 27Feb 3Feb 10Feb 17Feb 24Mar 3Mar 10Mar 17Mar 24Mar 31Apr 7Apr 14100,00045050055060065000.511.5
Overall Statistics
Total Orders
0
Average Win
0%
Average Loss
0%
Compounding Annual Return
0%
Drawdown
0%
Expectancy
0
Start Equity
100000
End Equity
100000
Net Profit
0%
Sharpe Ratio
0
Sortino 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
0.503
Tracking Error
0.247
Treynor Ratio
0
Total Fees
$0.00
Estimated Strategy Capacity
$0
Lowest Capacity Asset
Portfolio Turnover
0%
# region imports
from AlgorithmImports import *
from my_ibs_apla import *
# endregion

class my_strategy(QCAlgorithm):

    def initialize(self):
        self.set_start_date(2025, 1, 1)
        self.set_cash(100000)

        # Use ManualUniverseSelectionModel method to select a static set of equities, similar to traditional add_security methods, for a fixed trading universe.
        tickers = ["SPY", "QQQ"]
        my_symbol_list = []
        my_symbol = {}
        for ticker in tickers:
            my_symbol[ticker] = Symbol.create(ticker, SecurityType.EQUITY, Market.USA)
            my_symbol_list.append(my_symbol[ticker])

        self.add_universe_selection(ManualUniverseSelectionModel(my_symbol_list))
        self.universe_settings.resolution = Resolution.DAILY

        self.set_portfolio_construction(EqualWeightingPortfolioConstructionModel())
        self.set_execution(ImmediateExecutionModel())

        self.add_alpha(my_ibs_alpha(symbol=my_symbol['SPY'], ibs_len=3, resolution=Resolution.DAILY))
from AlgorithmImports import *

class my_ibs_alpha(AlphaModel):
    
    
    def __init__(self, symbol, ibs_len = 3, resolution = Resolution.Daily):
        ''' Initializes a new instance of the MacdAlphaModel class
        Args:
            ibs_len: The average ibs period</param>'''
        self.symbol = symbol
        self.ibs_len = ibs_len
        self.resolution = resolution
        self.insightCollection = InsightCollection()
        self.symbolData_dict = {}

        self.buyThreshold = 0.4
        self.sellThreshold = 0.6

        resolutionString = Extensions.GetEnumString(resolution, Resolution)
        self.Name = '{}({},{})'.format(self.__class__.__name__, ibs_len, resolutionString)


    def Update(self, algorithm, data):
        insights = []
        sd = SymbolData(algorithm, self.symbol, self.ibs_len, self.resolution)
        avg_ibs = sd.avg_ibs.current.value

        if avg_ibs < self.buyThreshold:
            direction = InsightDirection.Up
        if avg_ibs > self.sellThreshold:
            direction = InsightDirection.Flat

        # ignore signal for same direction as previous signal
        if direction == sd.PreviousDirection:
            return insights

        sd.PreviousDirection = direction

        if direction == InsightDirection.Flat:
            self.CancelInsights(algorithm, sd.Security)
            return insights

        insight = Insight.Price(sd.Security, 1, direction)
        insights.append(insight)
        self.insightCollection.Add(insight)

        return insights


    def CancelInsights(self, algorithm, symbol):
        if not self.insightCollection.ContainsKey(symbol):
            return
        insights = self.insightCollection[symbol]
        algorithm.Insights.Cancel(insights)
        self.insightCollection.Clear([ symbol ]);


class SymbolData:
    def __init__(self, algorithm, security, ibs_len, resolution):
        self.Security = security
        self.Consolidator = algorithm.ResolveConsolidator(self.Security, resolution)
        algorithm.subscription_manager.add_consolidator(self.Security, self.Consolidator)

        #self.ibs = InternalBarStrength(self.Security)
        self.my_ibs = algorithm.ibs(self.Security, resolution)
        self.avg_ibs = IndicatorExtensions.sma(self.my_ibs, ibs_len)

        algorithm.RegisterIndicator(self.Security, self.my_ibs, self.Consolidator)
        algorithm.WarmUpIndicator(self.Security, self.my_ibs, resolution)
        
        algorithm.RegisterIndicator(self.Security, self.avg_ibs, self.Consolidator)
        algorithm.WarmUpIndicator(self.Security, self.avg_ibs, resolution)

        self.PreviousDirection = None
        algorithm.plot("IBS", 'ibs', self.my_ibs.current.value)
        algorithm.plot("AverageIBS", 'ibs', self.avg_ibs.current.value)