| 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)}')