Overall Statistics |
Total Trades 36 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 COMPUSD E3 |
from AlgorithmImports import * COINS = ["ROSE", "ZMT", "LUNA", "REQ", "WAVES", "DUSK", "CCD", "COMP", "MANA", "ICP"] CURRENCY = "USD" STOPLOSS = 10 # % WAIT = 10 # Seconds LIMIT_BUY_LONG = 1.000 LIMIT_SELL_LONG = 1.001 LIMIT_SELL_SHORT = 1.000 LIMIT_BUY_SHORT = 0.999 THRESHOLD = 95 # % SMA_PERIOD = 90 POSITION = 500
# region imports from AlgorithmImports import * import config from datetime import * # endregion class FatSkyBlueLeopard(QCAlgorithm): def Initialize(self): # self.SetStartDate(2022, 5, 1) # Set Start Date # self.SetEndDate(2022, 7, 1) self.SetStartDate(2022, 7, 4) # Set Start Date self.SetEndDate(2022, 7, 5) self.SetCash("USD", 1000) # Binance doesnt have USD pairs, so the account needs to have USDT currency to trade # self.SetCash("USDT", 10000) # Set Strategy Cash self.SetBrokerageModel(BrokerageName.Bitfinex, AccountType.Margin) # self.SetSecurityInitializer(lambda security: security.SetMarketPrice(self.GetLastKnownPrice(security))) self.SetSecurityInitializer(self.CustomSecurityInitializer) # self.Portfolio.MarginCallModel = MarginCallModel.Null self.DefaultOrderProperties = BitfinexOrderProperties() self.DefaultOrderProperties.TimeInForce = TimeInForce.GoodTilCanceled self.DefaultOrderProperties.PostOnly = False self.symbols = [] self.DataBySymbol = {} Pairs = [x + config.CURRENCY for x in config.COINS] for Pair in Pairs: # self.Debug("HERE") try: self.symbols.append(self.AddCrypto(Pair, Resolution.Second, Market.Bitfinex).Symbol) except: if Pair in self.DataBySymbol.keys(): symbolData = self.DataBySymbol.pop(Pair, None) self.SubscriptionManager.RemoveConsolidator(Pair, symbolData.Bar_Consolidator) self.SubscriptionManager.RemoveConsolidator(Pair, symbolData.Calculation_Call) continue def CustomSecurityInitializer(self, security): # self.Debug(self.Time) security.SetMarketPrice(self.GetLastKnownPrice(security)) security.MarginModel = SecurityMarginModel(3.3) security.SetFeeModel(ConstantFeeModel(0)) def OnData(self, data: Slice): for symbol in self.symbols: if not symbol in self.DataBySymbol: history = map(lambda x: x[symbol], self.History(timedelta(40), Resolution.Minute)) #self.History(symbol, 40, Resolution.Minute) self.DataBySymbol[symbol] = SymbolData(self, symbol, history) # if data.ContainsKey(symbol) and self.CurrentSlice.Bars.ContainsKey(symbol): # symbolData = self.DataBySymbol[symbol] # if not self.Portfolio[symbol].Invested: # quantity = 100/self.Securities[symbol].Close # symbolData.ticket = self.MarketOrder(symbol, quantity) for symbol in self.DataBySymbol: symbolData = self.DataBySymbol[symbol] symbolData.OrderHandler(data) def OnOrderEvent(self, orderEvent: OrderEvent): # self.Debug("ORDEREVENT") order = self.Transactions.GetOrderById(orderEvent.OrderId) for symbol in self.DataBySymbol: if orderEvent.Symbol == symbol: if orderEvent.Status == OrderStatus.Filled: symbolData = self.DataBySymbol[symbol] symbolData.OnOrderEvent(orderEvent) # if orderEvent.Status == OrderStatus.Filled: # self.Debug("{0}: {1}: {2}".format(self.Time, order.Type, orderEvent)) # def OnEndOfAlgorithm(self): # for symbol in self.DataBySymbol: # symbolData = self.DataBySymbol[symbol] # self.Debug(f" {symbol} {symbolData.Orders_Sent}") class SymbolData(): def OnOrderEvent(self, orderEvent: OrderEvent): # self.Debug("ORDEREVENT") order = self.Transactions.GetOrderById(orderEvent.OrderId) def __init__(self, algorithm, symbol, history): self.algorithm = algorithm self.symbol = symbol # self.data = data # self.algorithm.Debug(algorithm.Securities[self.symbol].Price) self.sma = SimpleMovingAverage(config.SMA_PERIOD) algorithm.WarmUpIndicator(self.symbol, self.sma, timedelta(minutes=1)) self.count = 0 # self.OrderHandler(data) self.Stop_Loss_Long = (1-(config.STOPLOSS/100)) self.Stop_Loss_Short = (1+(config.STOPLOSS/100)) self.Wait_After_Order = config.WAIT self.Threshold = config.THRESHOLD/100 self.Order_Sent_Time = None self.Limit_Sell_Time = None self.Limit_Buy_Time_Short =None self.Current_Order = None self.Unfilled_Limit_Buy_Order = False self.Unfilled_Limit_Sell_Order = False self.Unfilled_Limit_Sell_Order_Short = False self.Limit_Price_Buy_Long = None self.Limit_Price_Sell_Long = None self.Limit_Buy_Long = config.LIMIT_BUY_LONG self.Limit_Sell_Long = config.LIMIT_SELL_LONG self.Remaining_Quantity_Lmt_Buy_Long = None self.Remaining_Quantity_Lmt_Sell_Short = None self.Minimum_Order_Size = self.algorithm.Securities[self.symbol].SymbolProperties.MinimumOrderSize self.symbol.ticket_LmtBuy = None self.symbol.ticket_LmtSell = None self.symbol.ticket_Stop_Long = None self.symbol.ticket_LmtSell_Short = None self.symbol.ticket_LmtBuyShort = None self.symbol.ticket_Stop_Short = None self.Long_Stop = None self.Short_Stop = None self.my_quantity = None self.Abs_Long_Buy = None self.Average_Long_Buy = None self.Long_Fill_Distance_LmtBuy = None self.Abs_Long_Sell = None self.Average_Long_Sell = None self.Long_Fill_Distance_LmtSell = None self.Abs_Short_Sell = None self.Average_Short_Sell = None self.Short_Fill_Distance_LmtSell = None self.Abs_Short_Cover = None self.Average_Short_Cover = None self.Short_Fill_Distance_Cover = None self.symbol.ticket_switch_short = None self.symbol.ticket_switch_long = None # self.Order_Status_List = [OrderStatus.New, OrderStatus.] self.Limit_Buy_Short= config.LIMIT_BUY_SHORT self.Limit_Sell_Short = config.LIMIT_SELL_SHORT # self.Order_Quantity = config.ORDER_QUANTITY_IN_USDT self.Current_SMA = None self.Current_Ask = None self.Current_Bid = None self.Minimum_Order_Size = None self.Orders_Sent = 0 self.Bar_Consolidator = TradeBarConsolidator(timedelta(minutes=1)) algorithm.SubscriptionManager.AddConsolidator(symbol, self.Bar_Consolidator) self.Bar_Consolidator.DataConsolidated += self.OnDataConsolidated # for bar in history: # # if symbol == row.Index[0]: # bar = TradeBar(bar.EndTime - timedelta(minutes=1), symbol, bar.Open, bar.High, bar.Low, bar.Close, 10000, bar.Period) # self.Bar_Consolidator.Update(bar) # def OnOrderEvent(self, orderEvent: OrderEvent): # self.Debug("ORDEREVENT") # order = self.Transactions.GetOrderById(orderEvent.OrderId) # if orderEvent.Status == OrderStatus.Filled: # self.Debug("{0}: {1}: {2}".format(self.Time, order.Type, orderEvent)) self.No_Open_Long_Position = True self.No_Open_Long_Sell_Order = True self.No_Open_Long_Stop_Order = True self.No_Open_Long_Buy_Order = True self.symbol.ticket_Stop_Long = None self.symbol.ticket_Long_Limit_Sell = None self.symbol.ticket_Long_Limit_Buy = None self.No_Open_Short_Position = True self.No_Open_Short_Buy_Order = True self.No_Open_Short_Stop_Order = True self.No_Open_Short_Sell_Order = True self.symbol.ticket_Stop_Short = None self.symbol.ticket_Short_Limit_Buy = None self.symbol.ticket_Short_Limit_Sell = None if self.symbol == "ROSEUSD": self.cash_symbol = "ROSE" if self.symbol == "ZMTUSD": self.cash_symbol = "ZMT" if self.symbol == "LUNAUSD": self.cash_symbol = "LUNA" if self.symbol == "REQUSD": self.cash_symbol = "REQ" if self.symbol == "WAVESUSD": self.cash_symbol = "WAVES" if self.symbol == "DUSKUSD": self.cash_symbol = "DUSK" if self.symbol == "CCDUSD": self.cash_symbol = "CCD" if self.symbol == "COMPUSD": self.cash_symbol = "COMP" if self.symbol == "MANAUSD": self.cash_symbol = "MANA" if self.symbol == "ICPUSD": self.cash_symbol = "ICP" ########################################################################################## self.Order_Tag_List = ["LONG BUY", "LONG SELL", "LONG STOP", "SHORT SELL", "SHORT COVER", "SHORT STOP", "UNEXPECTED", "QUANTITY WITHOUT PERMISSION"] self.User_Cancelled = False self.Entry_Time_Long = None self.Entry_Time_Short = None self.Interval = timedelta(seconds=config.WAIT) self.Long_Stop_Price = None self.Order_Permission = True def OnDataConsolidated(self, sender, bar): self.sma.Update(IndicatorDataPoint(bar.EndTime, bar.Close)) # self.OrderHandler() def OrderHandler(self, data): self.Lot_Size = self.algorithm.Securities[self.symbol].SymbolProperties.LotSize self.Minimum_Order_Size = (self.algorithm.Securities[self.symbol].SymbolProperties.MinimumOrderSize * self.algorithm.Securities[self.symbol].Price) self.Current_SMA = self.sma.Current.Value self.Current_Ask = self.algorithm.Securities[self.symbol].AskPrice self.Current_Bid = self.algorithm.Securities[self.symbol].BidPrice self.Minimum_Price_Variation = self.algorithm.Securities[self.symbol].SymbolProperties.MinimumPriceVariation # if not self.Order_Permission: # if self.cash_symbol in self.algorithm.Portfolio.CashBook: # quantity = self.algorithm.Portfolio.CashBook[self.cash_symbol].Amount # if quantity > 0: # self.algorithm.MarketOrder(self.symbol, -quantity, tag = "QUANTITY WITHOUT PERMISSION") # if quantity < 0: # self.algorithm.MarketOrder(self.symbol, abs(quantity), tag = "QUANTITY WITHOUT PERMISSION") if self.algorithm.Securities[self.symbol].Price > self.Current_SMA: if self.Order_Permission: if self.cash_symbol in self.algorithm.Portfolio.CashBook: quantity = self.algorithm.Portfolio.CashBook[self.cash_symbol].Amount if quantity != 0: self.algorithm.Debug("WTF") if quantity == 0: quantity = config.POSITION / (0.99 *(self.Current_Bid * self.Limit_Buy_Long)) entry_price = self.Current_Bid * self.Limit_Buy_Long quantity = round(quantity, 3) entry_price = round(entry_price, 5) self.algorithm.Debug("WTF") if quantity * self.algorithm.Securities[self.symbol].Price > (self.Minimum_Order_Size * 1.0001): self.algorithm.LimitOrder(self.symbol, quantity, entry_price, tag = "LONG BUY") self.Order_Permission = False self.Entry_Time_Long = self.algorithm.Time else: quantity = config.POSITION / (0.99 *(self.Current_Bid * self.Limit_Buy_Long)) entry_price = self.Current_Bid * self.Limit_Buy_Long quantity = round(quantity, 3) entry_price = round(entry_price, 5) self.algorithm.Debug("WTF") if quantity > 0 and (quantity * entry_price) > self.Minimum_Order_Size: self.algorithm.LimitOrder(self.symbol, quantity, entry_price, tag = "LONG BUY") self.Order_Permission = False self.Entry_Time_Long = self.algorithm.Time open_orders = self.algorithm.Transactions.GetOpenOrders(self.symbol) for Order in open_orders: if Order.Tag == "LONG BUY": if Order.Status == OrderStatus.Submitted or Order.Status == OrderStatus.PartiallyFilled or Order.Status == OrderStatus.UpdateSubmitted: if Order.Quantity * self.Current_Bid > self.Minimum_Order_Size and Order.Quantity > 0: # self.algorithm.Debug(self.algorithm.Time) if self.algorithm.Time > (self.Entry_Time_Long + self.Interval): order_tickets = self.algorithm.Transactions.GetOpenOrderTickets(self.symbol) for order_ticket in order_tickets: if order_ticket.OrderId == Order.Id: ticket = order_ticket entry_price = self.Current_Bid * self.Limit_Buy_Long entry_price = round(entry_price, 5) quantity = round(Order.Quantity, 3) Update_Settings = UpdateOrderFields() Update_Settings.LimitPrice= entry_price Update_Settings.Quantity = quantity Update_Settings.Tag = "LONG BUY" Update_Order = order_ticket.Update(Update_Settings) self.Entry_Time_Long = self.algorithm.Time if Update_Order.IsSuccess: pass else: self.Order_Permission = False if self.Order_Permission: if self.cash_symbol in self.algorithm.Portfolio.CashBook: quantity = self.algorithm.Portfolio.CashBook[self.cash_symbol].Amount if quantity > 0: exit_price = self.Current_Ask * self.Limit_Sell_Long self.algorithm.LimitOrder(self.symbol, -quantity, exit_price, tag = "LONG SELL") self.Long_Stop_Price = self.algorithm.Portfolio[self.symbol].AveragePrice * self.Stop_Loss_Long self.Long_Exit_Time = self.algorithm.Time self.Order_Permission = False open_orders = self.algorithm.Transactions.GetOpenOrders(self.symbol) for Order in open_orders: if Order.Tag == "LONG SELL": if Order.Status == OrderStatus.Submitted or Order.Status == OrderStatus.PartiallyFilled or Order.Status == OrderStatus.UpdateSubmitted: if ((abs(Order.Quantity)) * self.Current_Ask) > self.Minimum_Order_Size and Order.Quantity < 0: if self.algorithm.Time > (self.Long_Exit_Time + self.Interval): order_tickets = self.algorithm.Transactions.GetOpenOrderTickets(self.symbol) for order_ticket in order_tickets: if order_ticket.OrderId == Order.Id: ticket = order_ticket entry_price = self.Current_Ask * self.Limit_Sell_Long entry_price = round(entry_price, 5) quantity = round(Order.Quantity, 3) Update_Settings = UpdateOrderFields() Update_Settings.LimitPrice= entry_price Update_Settings.Quantity = quantity Update_Settings.Tag = "LONG SELL" Update_Order = order_ticket.Update(Update_Settings) self.Long_Exit_Time = self.algorithm.Time if Update_Order.IsSuccess: pass else: self.Order_Permission = False if self.Long_Stop_Price is not None: if self.algorithm.Securities[self.symbol].Price < self.Long_Stop_Price: quantity = self.algorithm.Portfolio.CashBook[self.cash_symbol].Amount self.algorithm.MarketOrder(self.symbol, -quantity, tag = "LONG STOP") self.Order_Permission = False def OnOrderEvent(self, orderEvent): order = self.algorithm.Transactions.GetOrderById(orderEvent.OrderId) open_orders = self.algorithm.Transactions.GetOpenOrders(self.symbol) # cash_book = self.algorithm.Portfolio.CashBook[self.symbol] symbol_open_quantity = self.algorithm.Transactions.GetOpenOrdersRemainingQuantity(self.symbol) if order.Tag == "LONG BUY": if order.Status == OrderStatus.PartiallyFilled: if (abs(order.AbsoluteFillQuantity * self.Securities[self.symbol].BidPrice)) < self.Minimum_Order_Size: self.algorithm.Transactions.CancelOrder(order.Id) self.User_Cancelled = True if self.algorithm.Time > (self.Entry_Time_Long + self.Interval + timedelta(seconds=10)): self.algorithm.Transactions.CancelOrder(order.Id) self.User_Cancelled = True if order.Status == OrderStatus.Filled: if self.cash_symbol in self.algorithm.Portfolio.CashBook: quantity = self.algorithm.Portfolio.CashBook[self.cash_symbol].Amount if not quantity > 0: self.Order_Permission = False self.algorithm.Transactions.CancelOpenOrders(self.symbol) if quantity > 0: self.Order_Permission = True # if self.cash_symbol not in self.algorithm.Portfolio.CashBook: # if self.algorithm.Portfolio[self.symbol].Quantity == 0: # # self.algorithm.Transactions.CancelOpenOrders(self.symbol) # self.Order_Permission = True if order.Tag == "LONG SELL": if order.Status == OrderStatus.PartiallyFilled: if (abs(order.AbsoluteFillQuantity * self.Securities[self.symbol].AskPrice)) < self.Minimum_Order_Size: self.algorithm.Transactions.CancelOrder(order.Id) self.User_Cancelled = True if self.Time > (self.Entry_Time_Long + self.Interval + timedelta(seconds=10)): self.algorithm.Transactions.CancelOrder(order.Id) self.User_Cancelled = True if order.Status == OrderStatus.Filled: quantity = self.algorithm.Portfolio.CashBook[self.cash_symbol].Amount if quantity > 0: self.Order_Permission = False self.MarketOrder(self.symbol, -quantity, tag = "ERROR") if quantity == 0: self.Order_Permission = True # if self.cash_symbol not in self.algorithm.Portfolio.CashBook: # if self.algorithm.Portfolio[self.symbol].Quantity == 0: # self.Order_Permission = True # self.algorithm.Transactions.CancelOpenOrders(self.symbol) if order.Tag == "LONG STOP": if Order.Status == OrderStatus.PartiallyFilled: if (abs(order.AbsoluteFillQuantity * self.Securities[self.symbol].BidPrice)) < self.Minimum_Order_Size: self.algorithm.Transactions.CancelOrder(order.Id) self.User_Cancelled = True if self.algorithm.Time > (self.Entry_Time_Long + self.Interval + timedelta(seconds=10)): self.algorithm.Transactions.CancelOrder(order.Id) self.User_Cancelled = True if order.Status == OrderStatus.Filled: quantity = self.algorithm.Portfolio.CashBook[self.cash_symbol].Amount if quantity > 0: self.Order_Permission = False self.MarketOrder(self.symbol, -quantity, tag = "ERROR") if quantity == 0: self.Order_Permission = True # if self.cash_symbol not in self.algorithm.Portfolio.CashBook: # if self.algorithm.Portfolio[self.symbol].Quantity == 0: # self.Order_Permission = True # self.algorithm.Transactions.CancelOpenOrders(self.symbol) if order.Tag == "SHORT SELL": if Order.Status == OrderStatus.PartiallyFilled: if (abs(order.AbsoluteFillQuantity * self.Securities[self.symbol].AskPrice)) < self.Minimum_Order_Size: self.algorithm.Transactions.CancelOrder(order.Id) self.User_Cancelled = True if self.Time > (self.Entry_Time_Long + self.Interval + timedelta(seconds=10)): self.algorithm.Transactions.CancelOrder(order.Id) self.User_Cancelled = True if order.Status == OrderStatus.Filled: quantity = self.algorithm.Portfolio.CashBook[self.cash_symbol].Amount if not quantity < 0: self.Order_Permission = False self.algorithm.Transactions.CancelOpenOrders(self.symbol) if quantity < 0: self.Order_Permission = True if self.cash_symbol not in self.algorithm.Portfolio.CashBook: if self.algorithm.Portfolio[self.symbol].Quantity == 0: # self.algorithm.Transactions.CancelOpenOrders(self.symbol) self.Order_Permission = True if order.Tag == "SHORT COVER": if Order.Status == OrderStatus.PartiallyFilled: if (abs(order.AbsoluteFillQuantity * self.Securities[self.symbol].BidPrice)) < self.Minimum_Order_Size: self.algorithm.Transactions.CancelOrder(order.Id) self.User_Cancelled = True if self.algorithm.Time > (self.Entry_Time_Long + self.Interval + timedelta(seconds=10)): self.algorithm.Transactions.CancelOrder(order.Id) self.User_Cancelled = True if order.Status == OrderStatus.Filled: quantity = self.algorithm.Portfolio.CashBook[self.cash_symbol].Amount if quantity < 0: self.Order_Permission = False self.MarketOrder(self.symbol, abs(quantity), tag = "ERROR") if quantity == 0: self.Order_Permission = True if self.cash_symbol not in self.algorithm.Portfolio.CashBook: if self.algorithm.Portfolio[self.symbol].Quantity == 0: self.algorithm.Transactions.CancelOpenOrders(self.symbol) self.Order_Permission = True if order.Tag == "SHORT STOP": if Order.Status == OrderStatus.PartiallyFilled: if (abs(order.AbsoluteFillQuantity * self.Securities[self.symbol].BidPrice)) < self.Minimum_Order_Size: self.algorithm.Transactions.CancelOrder(order.Id) self.User_Cancelled = True if self.algorithm.Time > (self.Entry_Time_Long + self.Interval + timedelta(seconds=10)): self.algorithm.Transactions.CancelOrder(order.Id) self.User_Cancelled = True if order.Status == OrderStatus.Filled: quantity = self.algorithm.Portfolio.CashBook[self.cash_symbol].Amount if quantity == 0: self.Order_Permission = True if quantity < 0: self.MarketOrder(self.symbol, abs(quantity), tag = "ERROR") if order.Status == OrderStatus.Canceled and not self.User_Cancelled: for symbol in self.algorithm.Portfolio.CashBook: if symbol == self.cash_symbol: quantity = self.algorithm.Portfolio.CashBook[self.cash_symbol].Amount if quantity > 0: self.MarketOrder(self.symbol, -quantity, tag = "INVALID OR CANCELLED") if quantity < 0: self.MarketOrder(self.symbol, abs(quantity), tag = "INVALID OR CANCELLED") if order.Status == OrderStatus.Canceled and self.User_Cancelled: self.User_Cancelled = False self.Order_Permission = True if order.Status == OrderStatus.Invalid: quantity = self.algorithm.Portfolio.CashBook[self.cash_symbol].Amount if quantity > 0: self.MarketOrder(self.symbol, -quantity, tag = "INVALID OR CANCELLED") if quantity < 0: self.MarketOrder(self.symbol, abs(quantity), tag = "INVALID OR CANCELLED") self.Order_Permission = False if order.Status == OrderStatus.CancelPending: self.Order_Permission = False if order.Status == OrderStatus.Submitted: self.Order_Permission = False if order.Status == OrderStatus.New: self.Order_Permission = False if order.Tag not in self.Order_Tag_List: quantity = self.algorithm.Portfolio.CashBook[self.cash_symbol].Amount if quantity > 0: self.algorithm.MarketOrder(self.symbol, -quantity, tag = "UNEXPECTED") self.Order_Permission = False if quantity < 0: self.algorithm.MarketOrder(self.symbol, abs(quantity), tag = "UNEXPECTED") self.Order_Permission = False if order.Tag == "INVALID OR CANCELLED" or order.Tag == "ERROR" or order.Tag == "UNEXPECTED": if order.Status == OrderStatus.Filled: for symbol in self.algorithm.Portfolio.CashBook: if symbol == self.cash_symbol: quantity = self.algorithm.Portfolio.CashBook[self.cash_symbol].Amount if quantity == 0: self.Order_Permission = True if quantity != 0: self.Order_Permission = False if order.Tag == "QUANTITY WITHOUT PERMISSION": if order.Status == OrderStatus.Filled: if self.cash_symbol in self.algorithm.Portfolio.CashBook: for symbol in self.algorithm.Portfolio.CashBook: if symbol == self.cash_symbol: quantity = self.algorithm.Portfolio.CashBook[self.cash_symbol].Amount if quantity == 0: self.Order_Permission = True if quantity != 0: self.Order_Permission = False else: self.Order_Permission = True # def OnOrderEvent(self, orderEvent: OrderEvent): # order = self.algorithm.Transactions.GetOrderById(orderEvent.OrderId) # if orderEvent.Status == OrderStatus.Filled: # self.algorithm.Debug("{0}: {1}: {2}".format(self.algorithm.Time, order.Type, orderEvent)) # self.count = self.count + 1 # if self.count <= 10: # self.algorithm.Debug(self.algorithm.Portfolio[self.symbol].UnrealizedProfitPercent) # self.algorithm.Debug(f" {self.algorithm.Time} {self.algorithm.Securities[self.symbol].Price}")