Created with Highcharts 12.1.2EquityOct 14Oct 28Nov 11Nov 25Dec 9Dec 23Jan 6Jan 20Feb 3Feb 17Mar 3Mar 170100k200k300k02k4k-10105M10M01G2G2.42.452.52.55
Overall Statistics
Total Orders
36640
Average Win
0.04%
Average Loss
-0.04%
Compounding Annual Return
947.304%
Drawdown
1.900%
Expectancy
0.137
Start Equity
86000.00
End Equity
236257.70
Net Profit
174.718%
Sharpe Ratio
14.641
Sortino Ratio
0
Probabilistic Sharpe Ratio
100.000%
Loss Rate
43%
Win Rate
57%
Profit-Loss Ratio
1.01
Alpha
3.662
Beta
-0.094
Annual Standard Deviation
0.25
Annual Variance
0.063
Information Ratio
13.339
Tracking Error
0.277
Treynor Ratio
-39.093
Total Fees
â‚®0.00
Estimated Strategy Capacity
â‚®1500000.00
Lowest Capacity Asset
BTCUSDT 2UZ
Portfolio Turnover
11409.89%
# region imports
from AlgorithmImports import *
# endregion

class CasualBlueHornet(QCAlgorithm):

    def initialize(self):
        self.set_start_date(2024, 10, 1)
        self.set_account_currency('USDT', 86_000)
        #self.set_brokerage_model(BrokerageName.INTERACTIVE_BROKERS_BROKERAGE, AccountType.MARGIN)
        self._spot = self.add_crypto("BTCUSDT", Resolution.SECOND, market=Market.BYBIT)
        self._future = self.add_crypto_future("BTCUSDT", Resolution.SECOND, market=Market.BYBIT)
        self._bb = BollingerBands(30*24*60*60, 2)
        self.set_warm_up(timedelta(30))

    def on_data(self, data: Slice):
        if not (self._spot.symbol in data and self._future.symbol in data):
            return
        spread = self._spot.price - self._future.price
        if not self._bb.update(self.time, spread):
            return
        
        if not self.portfolio.invested:
            if spread < self._bb.lower_band.current.value:
                # Sell future; buy spot
                self.set_holdings(self._future.symbol, -0.5)
                self.set_holdings(self._spot.symbol, 0.5)
            elif spread > self._bb.upper_band.current.value:
                # Sell spot; buy future
                self.set_holdings(self._spot.symbol, -0.5)
                self.set_holdings(self._future.symbol, 0.5)
        elif (self._spot.holdings.is_long and spread >= self._bb.middle_band.current.value or
              self._future.holdings.is_long and spread <= self._bb.middle_band.current.value):
                self.liquidate()

        #self.plot('BTCUSD', 'SPREAD', spread)
        #self.plot('BTCUSD', 'Upper Band', self._bb.upper_band.current.value)
        #self.plot('BTCUSD', 'Middle Band', self._bb.middle_band.current.value)
        #self.plot('BTCUSD', 'Lower Band', self._bb.lower_band.current.value)