Overall Statistics
Total Orders
180
Average Win
1.01%
Average Loss
-0.94%
Compounding Annual Return
-3.781%
Drawdown
15.200%
Expectancy
-0.057
Start Equity
200000.00
End Equity
185128.42
Net Profit
-7.436%
Sharpe Ratio
-0.588
Sortino Ratio
-0.423
Probabilistic Sharpe Ratio
1.790%
Loss Rate
54%
Win Rate
46%
Profit-Loss Ratio
1.07
Alpha
-0.045
Beta
0.034
Annual Standard Deviation
0.077
Annual Variance
0.006
Information Ratio
-0.027
Tracking Error
0.713
Treynor Ratio
-1.352
Total Fees
$3015.74
Estimated Strategy Capacity
$44000000.00
Lowest Capacity Asset
BTCBUSD 18R
Portfolio Turnover
5.91%
from AlgorithmImports import *

class BinanceCryptoFutureDataAlgorithm(QCAlgorithm):

    def initialize(self) -> None:
        self.set_start_date(2021, 1, 1)
        self.set_end_date(2023, 1, 1)
        self.set_cash("BUSD", 100000)
        
        self.set_brokerage_model(BrokerageName.BINANCE_FUTURES, AccountType.MARGIN)

        crypto_future = self.add_crypto_future("BTCBUSD", Resolution.DAILY)
        self.btcbusd = crypto_future.symbol

        self.fast_ma = self.SMA(self.btcbusd, 10, Resolution.DAILY)
        self.slow_ma = self.SMA(self.btcbusd, 50, Resolution.DAILY)
        
        # Historical data
        history = self.history(self.btcbusd, 10, Resolution.DAILY)

        # Order variables
        self.stop_loss_percentage = 0.01  
        self.take_profit_percentage = 0.02 
        self.current_position = None

    def on_data(self, slice: Slice) -> None:
        if not slice.bars.contains_key(self.btcbusd) or not slice.quote_bars.contains_key(self.btcbusd):
            return
        
        if not self.fast_ma.IsReady or not self.slow_ma.IsReady:
            return
        
        # monitor price scale manually
        current_price = slice.bars[self.btcbusd].price

        if self.current_position is None and self.fast_ma.Current.Value > self.slow_ma.Current.Value:
            # Place a long trade
            self.current_position = self.MarketOrder(self.btcbusd, 1)
            entry_price = slice.bars[self.btcbusd].price
            self.entry_price = current_price
            self.Debug(f"Entered Long at {self.entry_price}")

        # Exit conditions: Stop-loss or take-profit for long position
        elif self.current_position is not None:
            stop_loss_price = self.entry_price * (1 - self.stop_loss_percentage)
            take_profit_price = self.entry_price * (1 + self.take_profit_percentage)

            if current_price <= stop_loss_price:
                self.Liquidate(self.btcbusd)
                self.current_position = None
                self.Debug(f"Exited Long for Stop Loss at {current_price}")

            elif current_price >= take_profit_price:
                self.Liquidate(self.btcbusd)
                self.current_position = None
                self.Debug(f"Exited Long for Take Profit at {current_price}")

        # Additional condition to exit on trend reversal
        if self.current_position is not None and self.fast_ma.Current.Value < self.slow_ma.Current.Value:
            self.Liquidate(self.btcbusd)
            self.current_position = None
            self.Debug(f"Exited Long on Trend Reversal at {current_price}")