Overall Statistics
Total Orders
1
Average Win
0%
Average Loss
0%
Compounding Annual Return
139.235%
Drawdown
42.900%
Expectancy
0
Start Equity
100000.0
End Equity
240285.02
Net Profit
140.285%
Sharpe Ratio
3.103
Sortino Ratio
4.111
Probabilistic Sharpe Ratio
79.360%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
-1.029
Beta
0.744
Annual Standard Deviation
0.555
Annual Variance
0.308
Information Ratio
-9.362
Tracking Error
0.211
Treynor Ratio
2.316
Total Fees
$399.02
Estimated Strategy Capacity
$79000.00
Lowest Capacity Asset
BTCUSD 10B
Portfolio Turnover
0.13%
from AlgorithmImports import *
from QuantConnect.DataSource import *
from QuantConnect.Data.UniverseSelection import *

class CoinAPIDataAlgorithm(QCAlgorithm):

    def initialize(self) -> None:
        self.set_start_date(2020, 6, 1)
        self.set_end_date(2021, 6, 1)
        self.set_cash(100000)
        self.universe_settings.asynchronous = True
        # Kraken accepts both Cash and Margin type account.
        self.set_brokerage_model(BrokerageName.KRAKEN, AccountType.MARGIN)

        # Warm up the security with the last known price to avoid conversion error
        self.set_security_initializer(lambda security: security.set_market_price(self.get_last_known_price(security)))
        
        # Requesting data
        crypto = self.add_crypto("BTCUSD", Resolution.MINUTE, Market.KRAKEN)
        self.btcusd = crypto.symbol
        self.minimum_order_size = crypto.symbol_properties.minimum_order_size
        self.threshold = 0.5
        
        # Historical data
        history = self.history(self.btcusd, 30, Resolution.DAILY)
        self.debug(f"We got {len(history)} items from our history request")

        # Add Crypto Universe Selection
        self._universe = self.add_universe(CryptoUniverse.kraken(self.universe_selection_filter))

        # Historical Universe data
        universe_history = self.history(self._universe, 30, Resolution.DAILY)
        self.debug(f"We got {len(universe_history)} items from our universe history request")
        for (univere_symbool, time), universe_day in universe_history.items():
            for universe_item in universe_day:
                self.debug(f"{universe_item.symbol} price at {universe_item.end_time}: {universe_item.close}")

    def universe_selection_filter(self, universe_day):
        return [universe_item.symbol for universe_item in universe_day
                if universe_item.volume >= 100 
                and universe_item.volume_in_usd > 10000]

    def on_data(self, slice: Slice) -> None:
        if self.portfolio.cash_book['BTC'].amount == 0:
            free_cash = self.portfolio.cash_book['USD'].amount * (1-self.settings.free_portfolio_value_percentage)
            quantity = self.threshold*free_cash / slice[self.btcusd].price
            quantity -= quantity % self.minimum_order_size
            if quantity > 0:
                self.market_order(self.btcusd, quantity)