| Overall Statistics |
|
Total Orders 280 Average Win 0.92% Average Loss -0.76% Compounding Annual Return -8.119% Drawdown 20.900% Expectancy -0.128 Start Equity 200000.00 End Equity 168773.71 Net Profit -15.613% Sharpe Ratio -0.959 Sortino Ratio -0.87 Probabilistic Sharpe Ratio 0.381% Loss Rate 61% Win Rate 39% Profit-Loss Ratio 1.22 Alpha -0.087 Beta 0.051 Annual Standard Deviation 0.092 Annual Variance 0.008 Information Ratio -0.088 Tracking Error 0.702 Treynor Ratio -1.74 Total Fees $4114.14 Estimated Strategy Capacity $41000000.00 Lowest Capacity Asset BTCBUSD 18R Portfolio Turnover 8.50% |
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, 5, Resolution.DAILY)
self.slow_ma = self.SMA(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}")
# Trend reversal exit
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}")