| Overall Statistics |
|
Total Orders 4149 Average Win 0% Average Loss 0.00% Compounding Annual Return -39.381% Drawdown 3.100% Expectancy -1 Start Equity 100000 End Equity 96939.29 Net Profit -3.061% Sharpe Ratio -10.718 Sortino Ratio -9.933 Probabilistic Sharpe Ratio 0% Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha -0.314 Beta -0.081 Annual Standard Deviation 0.033 Annual Variance 0.001 Information Ratio -6.95 Tracking Error 0.121 Treynor Ratio 4.386 Total Fees $2761.00 Estimated Strategy Capacity $2400000.00 Lowest Capacity Asset PEV XZ448Z77KM79 Portfolio Turnover 0.37% |
# region imports
from AlgorithmImports import *
# endregion
class BiotechStrategy(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2024, 2, 1)
self.SetEndDate(2024, 2, 25)
self.SetCash(100000)
# Add symbols
self.symbols = ['ACON', 'SGLY', 'SLRN', 'PEV', 'SOPA']
self.order_tickets = {} # Store order tickets for TP and SL
for symbol in self.symbols:
equity = self.AddEquity(symbol, Resolution.Minute)
equity.SetDataNormalizationMode(DataNormalizationMode.Raw)
def OnData(self, data):
for symbol in self.symbols:
if not self.Portfolio[symbol].Invested:
# Example entry logic
quantity = 1
entry_ticket = self.MarketOrder(symbol, quantity)
# Define TP and SL prices
fill_price = entry_ticket.AverageFillPrice
tp_price = round(fill_price * 1.10, 2) # Take profit at +10%
sl_price = round(fill_price * 0.95, 2) # Stop loss at -5%
# Place TP and SL orders
tp_ticket = self.LimitOrder(symbol, -quantity, tp_price)
sl_ticket = self.StopMarketOrder(symbol, -quantity, sl_price)
# Store tickets for cancellation logic
self.order_tickets[symbol] = {"tp": tp_ticket, "sl": sl_ticket}
def OnOrderEvent(self, order_event):
if order_event.Status == OrderStatus.Filled:
symbol = str(order_event.Symbol)
# Check if there are active tickets for this symbol
if symbol not in self.order_tickets or self.order_tickets[symbol] is None:
return # No active tickets to process
tickets = self.order_tickets[symbol]
# Check if Take Profit was filled
if tickets["tp"] is not None and order_event.OrderId == tickets["tp"].OrderId:
# TP filled; cancel SL
if tickets["sl"] is not None:
tickets["sl"].Cancel()
self.Debug(f"Take Profit filled for {symbol}. Stop Loss canceled.")
self.order_tickets[symbol] = None # Clear tickets after TP fills
# Check if Stop Loss was filled
elif tickets["sl"] is not None and order_event.OrderId == tickets["sl"].OrderId:
# SL filled; cancel TP
if tickets["tp"] is not None:
tickets["tp"].Cancel()
self.Debug(f"Stop Loss filled for {symbol}. Take Profit canceled.")
self.order_tickets[symbol] = None # Clear tickets after SL fills