Overall Statistics
Total Orders
1
Average Win
0%
Average Loss
0%
Compounding Annual Return
-0.589%
Drawdown
0.300%
Expectancy
0
Start Equity
100000
End Equity
99858.32
Net Profit
-0.142%
Sharpe Ratio
-20.869
Sortino Ratio
-23.947
Probabilistic Sharpe Ratio
7.192%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
-0.063
Beta
0.013
Annual Standard Deviation
0.003
Annual Variance
0
Information Ratio
-3.75
Tracking Error
0.091
Treynor Ratio
-4.546
Total Fees
$1.00
Estimated Strategy Capacity
$650000000.00
Lowest Capacity Asset
AAPL R735QTJ8XC9X
Portfolio Turnover
0.02%
# region imports
from AlgorithmImports import *
# endregion

class CreativeRedOrangeFrog(QCAlgorithm):

    def initialize(self):
        self.set_start_date(2024, 1, 1)
        self.set_end_date(2024, 3, 31)
        self.set_cash(100000)
        self.aapl = self.add_equity("AAPL", Resolution.DAILY).symbol
        self.qty_counter = 0
        self.orders = []

    def on_data(self, data: Slice):
        if data.contains_key(self.aapl):
            # Place a stop market order for qty_counter+10 shares of AAPL. Stop price is high of today.
            bar = data.bars[self.aapl]
            original_ticket = self.stop_market_order(self.aapl, quantity=self.qty_counter+10, stop_price=bar.high, tag="OTO order")
            self.orders.append(original_ticket)
            self.log(f'{self.time} - Placing order for {self.qty_counter+10} {self.aapl} with stop price: {bar.high} Bar: {bar} {bar.end_time}')

            if self.qty_counter >= 1:
                # Update the order from yesterday with the high of today
                # POSSIBLE BUG: This makes the order to fill immediately.
                ticket = self.orders[self.qty_counter-1]
                self.log(f'{self.time} - Updating {ticket.quantity} {ticket.symbol} previous stop price: {ticket.get(OrderField.STOP_PRICE)}, new stop price: {bar.high}')
                update_settings = UpdateOrderFields()
                update_settings.stop_price = bar.high
                update_settings.tag = "Updated stop price"
                response = ticket.update(update_settings)

            self.qty_counter += 1



    def on_order_event(self, order_event: OrderEvent) -> None:
        self.log(f'{self.time} - Order of {order_event.quantity} {order_event.symbol} filled at {order_event.fill_price}. Status: {order_event.status}')

# region imports
from AlgorithmImports import *
# endregion


order_statuses = {
    0: 'NEW',
    1: 'SUBMITTED',
    2: 'PARTIALLY_FILLED',
    3: 'FILLED',
    4: 'CANCELED',
    6: 'NONE',
    7: 'INVALID',
    8: 'CANCEL_PENDING',
    9: 'UPDATE_SUBMITTED'
}

class CreativeRedOrangeFrog(QCAlgorithm):

    def initialize(self):
        self.set_start_date(2024, 1, 1)
        self.set_end_date(2024, 3, 31)
        self.set_cash(100000)
        self.aapl = self.add_equity("AAPL", Resolution.MINUTE).symbol
        self.qty_counter = 0
        self.orders = []

        # In Initialize, subscribe to a security, create the consolidator, and register it for automatic updates
        self._consolidator = self.consolidate(self.aapl, Resolution.DAILY, self._consolidation_handler)


    def _consolidation_handler(self, bar: TradeBar):        
        self.log(f'{self.time} - Current aapl bar: {bar} - start time: {bar.time}  end time: {bar.end_time}')

        if self.qty_counter == 0:
            # Place a stop market order for 10 AAPL. Stop price is high of today.
            original_ticket = self.stop_market_order(self.aapl, quantity=10, stop_price=bar.high, tag="Initial order")
            self.orders.append(original_ticket)
            self.log(f'{self.time} - Placing order for 10 {self.aapl} with stop price: {bar.high}')

        if self.qty_counter == 1:
            # Update the order from yesterday with the high of today
            ticket = self.orders[self.qty_counter-1]
            self.log(f'{self.time} - Updating {ticket.quantity} {ticket.symbol} previous stop price: {ticket.get(OrderField.STOP_PRICE)}, new stop price: {bar.high}')
            update_settings = UpdateOrderFields()
            update_settings.stop_price = bar.high
            update_settings.tag = "Updated stop price"
            response = ticket.update(update_settings)

        self.qty_counter += 1


    def on_order_event(self, order_event: OrderEvent) -> None:
        self.log(f'{self.time} - Order of {order_event.quantity} {order_event.symbol} had an update. Fill price: {order_event.fill_price}. Order status: {order_statuses.get(order_event.status)}')

# region imports
from AlgorithmImports import *
# endregion


order_statuses = {
    0: 'NEW',
    1: 'SUBMITTED',
    2: 'PARTIALLY_FILLED',
    3: 'FILLED',
    4: 'CANCELED',
    6: 'NONE',
    7: 'INVALID',
    8: 'CANCEL_PENDING',
    9: 'UPDATE_SUBMITTED'
}

class CreativeRedOrangeFrog(QCAlgorithm):

    def initialize(self):
        self.set_start_date(2024, 1, 1)
        self.set_end_date(2024, 3, 31)
        self.set_cash(100000)
        self.aapl = self.add_equity("AAPL", Resolution.DAILY).symbol
        self.qty_counter = 0
        self.orders = []

        self.Schedule.On(self.DateRules.EveryDay(self.aapl),
                        self.TimeRules.BeforeMarketClose(self.aapl, -10),
                        self.run_algo)

    def run_algo(self):
        data = self.current_slice
        if data.contains_key(self.aapl):                    
            # Place a stop market order for qty_counter+10 shares of AAPL. Stop price is high of today.
            bar = data.bars[self.aapl]
            self.log(f'{self.time} - Current aapl bar: {bar} end time: {bar.end_time}')  
            original_ticket = self.stop_market_order(self.aapl, quantity=self.qty_counter+10, stop_price=bar.high, tag="OTO order")
            self.orders.append(original_ticket)
            self.log(f'{self.time} - Placing order for {self.qty_counter+10} {self.aapl} with stop price: {bar.high}')

            if self.qty_counter >= 1:
                # Update the order from yesterday with the high of today
                # POSSIBLE BUG: This makes the order to fill immediately.
                ticket = self.orders[self.qty_counter-1]
                self.log(f'{self.time} - Updating {ticket.quantity} {ticket.symbol} previous stop price: {ticket.get(OrderField.STOP_PRICE)}, new stop price: {bar.high}')
                update_settings = UpdateOrderFields()
                update_settings.stop_price = bar.high
                update_settings.tag = "Updated stop price"
                response = ticket.update(update_settings)

            self.qty_counter += 1


    def on_order_event(self, order_event: OrderEvent) -> None:
        self.log(f'{self.time} - Order of {order_event.quantity} {order_event.symbol} had an update. Fill price: {order_event.fill_price}. Order status: {order_statuses.get(order_event.status)}')