| Overall Statistics |
|
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset |
class FocusedMagentaHornet(QCAlgorithm):
# THIS ALGORITHM FOCUSES ON 3 MAJOR SIGNALS FOR EXITING A TRADE and one trend indicator for allocating our portfolio:
# Exiting a trade signal:
# 1. Exiting a trade when the price goes above 5%
# 2. Exiting a trade when the price goes above 2%
# 3. Exiting a trade when the trailing stop loss is hit which is %10 of last highest close price
# Trend indicator:
# 10 Day moving average
# Order ticket for our stop order, Datetime when stop order was last hit
# ADGI ORDER TICKET
stopMarketTicketFirst = None
stopMarketOrderFillTimeFirst = datetime.min
highestFirstPrice = -1
# CORZ ORDER TICKET
stopMarketTicketSecond = None
stopMarketOrderFillTimeSecond = datetime.min
highestSecondPrice = -1
def Initialize(self):
#Brokerage model and account type:
self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Cash)
self.SetStartDate(2021, 2, 1) # Set Start Date
self.SetCash(170) # Set Strategy Cash
self.kpti = self.AddEquity("KPTI", Resolution.Daily)
# stockOne.SetDataNormalizationMode(DataNormalizationMode.Raw)
self.ego = self.AddEquity("EGO", Resolution.Daily)
# stockTwo.SetDataNormalizationMode(DataNormalizationMode.Raw)
self.kptiMomentum = self.MOMP("KPTI", 10, Resolution.Daily)
self.egoMomentum = self.MOMP("EGO", 10, Resolution.Daily)
# INITIALIZE 50 HISTORY DATA
self.SetWarmUp(50)
def OnData(self, data):
if self.IsWarmingUp:
return
# 1. Plot the current Stock1 price to "Data Chart" on series "Stock 1 Price"
self.Plot("Data Chart", "Stock 1 Price", self.Securities["KPTI"].Close)
# 2. Plot the current Stock 2 price to "Data Chart" on series "Stock 2 Price"
self.Plot("Data Chart", "Stock 2 Price", self.Securities["EGO"].Close)
if self.kptiMomentum.Current.Value > self.egoMomentum.Current.Value:
if (self.Time - self.stopMarketOrderFillTimeFirst).days < 1:
return
if not self.Portfolio.Invested or self.Portfolio.Invested:
if not self.Securities["KPTI"].Invested:
# Calculate the fee adjusted quantity of shares with given buying power
quantityFirst = self.CalculateOrderQuantity("KPTI", 0.8)
self.MarketOrder("KPTI", quantityFirst)
self.Debug(f"Quantity: {quantityFirst}")
self.stopMarketTicketFirst = self.StopMarketOrder("KPTI", -quantityFirst, 0.9 * self.Securities["KPTI"].Close)
elif (self.Securities["KPTI"].Close > self.stopMarketTicketFirst.AverageFillPrice * 1.05) and (self.Securities["KPTI"].Close > self.highestFirstPrice):
#2. Plot the moving stop price on "Data Chart" with "Stock 1 Stop Price" series name
self.Plot("Data Chart", "Stock 1 Stop Price", self.highestFirstPrice * 0.9)
self.highestFirstPrice = self.Securities["KPTI"].Close
updateFields = UpdateOrderFields()
updateFields.StopPrice = self.highestFirstPrice * 0.9
self.stopMarketTicketFirst.Update(updateFields)
self.Debug("Highest Close Price for Stock 1: " +str(self.highestFirstPrice))
quantityFirst = self.CalculateOrderQuantity("KPTI", 0.8)
self.MarketOrder("KPTI", -((quantityFirst)/3))
self.Debug(f"Quantity: {-((quantityFirst)/3)}")
elif (self.Securities["KPTI"].Close > self.stopMarketTicketFirst.AverageFillPrice * 1.02) and (self.Securities["KPTI"].Close > self.highestFirstPrice):
#2. Plot the moving stop price on "Data Chart" with "Stock 1 Stop Price" series name
self.Plot("Data Chart", "Stock 1 Stop Price", self.highestFirstPrice * 0.9)
self.highestFirstPrice = self.Securities["KPTI"].Close
updateFields = UpdateOrderFields()
updateFields.StopPrice = self.highestFirstPrice * 0.9
self.stopMarketTicketFirst.Update(updateFields)
self.Debug("Highest Close Price for Stock 1: " +str(self.highestFirstPrice))
quantityFirst = self.CalculateOrderQuantity("KPTI", 0.8)
self.MarketOrder("KPTI", -((quantityFirst)/2))
self.Debug(f"Quantity: {-((quantityFirst)/2)}")
else:
if self.Securities["KPTI"].Close > self.highestFirstPrice:
self.highestFirstPrice = self.Securities["KPTI"].Close
updateFields = UpdateOrderFields()
updateFields.StopPrice = self.highestFirstPrice * 0.9
self.stopMarketTicketFirst.Update(updateFields)
self.Debug("Highest Close Price for Stock 1: " +str(self.highestFirstPrice))
else:
if (self.Time - self.stopMarketOrderFillTimeSecond).days < 1:
return
if not self.Portfolio.Invested or self.Portfolio.Invested:
if not self.Securities["EGO"].Invested:
# Calculate the fee adjusted quantity of shares with given buying power
quantitySecond = self.CalculateOrderQuantity("EGO", 0.8)
self.MarketOrder("EGO", quantitySecond)
self.Debug(f"Quantity: {quantitySecond}")
self.stopMarketTicketSecond = self.StopMarketOrder("EGO", -quantitySecond, 0.9 * self.Securities["EGO"].Close)
elif (self.Securities["EGO"].Close > self.stopMarketTicketSecond.AverageFillPrice * 1.05) and (self.Securities["EGO"].Close > self.highestSecondPrice):
#2. Plot the moving stop price on "Data Chart" with "Stock 2 Stop Price" series name
self.Plot("Data Chart", "Stock 2 Stop Price", self.highestSecondPrice * 0.9)
self.highestSecondPrice = self.Securities["EGO"].Close
updateFields = UpdateOrderFields()
updateFields.StopPrice = self.highestSecondPrice * 0.9
self.stopMarketTicketSecond.Update(updateFields)
self.Debug("Highest Close Price for Stock 2: " +str(self.highestSecondPrice))
quantitySecond = self.CalculateOrderQuantity(self.stockTwo, 0.8)
self.MarketOrder("EGO", -((quantityEGO)/3))
self.Debug(f"Quantity: {-((quantityEGO)/3)}")
elif (self.Securities["EGO"].Close > self.stopMarketTicketSecond.AverageFillPrice * 1.02) and (self.Securities["EGO"].Close > self.highestSecondPrice):
#2. Plot the moving stop price on "Data Chart" with "Stock 2 Stop Price" series name
self.Plot("Data Chart", "Stock 2 Stop Price", self.highestSecondPrice * 0.9)
self.highestSecondPrice = self.Securities["EGO"].Close
updateFields = UpdateOrderFields()
updateFields.StopPrice = self.highestSecondPrice * 0.9
self.stopMarketTicketSecond.Update(updateFields)
self.Debug("Highest Close Price for Stock 2: " +str(self.highestSecondPrice))
quantitySecond = self.CalculateOrderQuantity("EGO", 0.8)
self.MarketOrder("EGO", -((quantitySecond)/2))
self.Debug(f"Quantity: {-((quantitySecond)/2)}")
else:
if self.Securities["EGO"].Close > self.highestSecondPrice:
self.highestSecondPrice = self.Securities["EGO"].Close
updateFields = UpdateOrderFields()
updateFields.StopPrice = self.highestSecondPrice * 0.9
self.stopMarketTicketSecond.Update(updateFields)
self.Debug("Highest Close Price for Stock 2: " +str(self.highestSecondPrice))
def OnOrderEvent(self, orderEvent):
if orderEvent.Status != OrderStatus.Filled:
return
if self.stopMarketTicketFirst is not None and self.stopMarketTicketFirst.OrderId == orderEvent.OrderId:
self.stopMarketOrderFillTimeFirst = self.Time
else:
if self.stopMarketTicketSecond is not None and self.stopMarketTicketSecond.OrderId == orderEvent.OrderId:
self.stopMarketOrderFillTimeSecond = self.Time