I am stuck on the last execrise "Visualizing the Stop Levels". Below is my code (what I have so far):

class BootCampTask(QCAlgorithm): def Initialize(self): self.AddEquity("SPY", Resolution.Daily) def OnData(self, data): self.Plot("Data Chart", "Asset Price", self.Securities["SPY"].Price) if self.Portfolio.Invested: self.Plot("Data Chart", "Stop Price", 0.9 * self.orderTicket.Get(OrderField.StopPrice))

 The task requires two series "Asset Price" and "Stop Price". However, the error message says 

Exercise Hint: You should create exactly three different series.

Also, I tried the "solution" (solution.py), but it is not in Python, probably C#

namespace QuantConnect { class OrderManagementBootCampLesson : QCAlgorithm { // Main asset we intend to trade private string _mainAssetTicker = "SPY"; // Stop loss price as a percentage of main asset close price private decimal _stopLossRatio = 0.90m; // Order ticket for our stop loss private OrderTicket _stopLossTicket; // Datetime when stop loss or take profit was last hit private DateTime _lastLimitHitAt; // The highest close price our main asset has achieved since placing our market order private decimal _highestClose = -1m; // Take profit price as a percentage of main asset close price private decimal _takeProfitRatio = 1.10m; // Order ticket for our take profit private OrderTicket _takeProfitTicket; public override void Initialize() { SetStartDate( 2018, 12, 1 ); SetEndDate( 2019, 4, 1 ); SetCash( 100000 ); AddSecurity( SecurityType.Equity, _mainAssetTicker, Resolution.Daily ); } public override void OnData( Slice slice ) { // Plot the asset price in a separate chart Plot( "Data chart", "Asset price", Securities[_mainAssetTicker].Close ); // Check that at least 15 days (~3 weeks) have passed since we last hit our limit order if ( ( Time - _lastLimitHitAt ).TotalDays < 15 ) return; if ( !Portfolio.Invested ) { // Create market order for some units of SPY MarketOrder( _mainAssetTicker, 500 ); // Create stop loss through a stop market order _stopLossTicket = StopMarketOrder( _mainAssetTicker, -500, _stopLossRatio * Securities[_mainAssetTicker].Close ); // Store current price as the highest price _highestClose = Securities[_mainAssetTicker].Close; // Create take profit through a limit order _takeProfitTicket = LimitOrder( _mainAssetTicker, -500, _takeProfitRatio * Securities[_mainAssetTicker].Close ); } else { // Update stop loss price if main asset has risen above its highest price if ( Securities[_mainAssetTicker].Close > _highestClose ) { _stopLossTicket.Update( new UpdateOrderFields() { StopPrice = Securities[_mainAssetTicker].Close * _stopLossRatio } ); _highestClose = Securities[_mainAssetTicker].Close; Debug( "SL:" + Securities[_mainAssetTicker].Close * _stopLossRatio ); } // Plot the current stop loss price Plot( "Data chart", "Stop loss price", _stopLossTicket.Get( OrderField.StopPrice ) ); // Plot the current take profit price Plot( "Data chart", "Take profit price", _takeProfitTicket.Get( OrderField.LimitPrice ) ); } } public override void OnOrderEvent( OrderEvent orderEvent ) { // Only act on fills (ignore submits) if ( orderEvent.Status != OrderStatus.Filled ) return; // Log order fill price (can be extended to log more information) Debug( orderEvent.FillPrice ); // Check if we hit our stop loss if ( _stopLossTicket != null && orderEvent.OrderId == _stopLossTicket.OrderId ) { _lastLimitHitAt = Time; // Cancel the take profit, we no longer need it _takeProfitTicket.Cancel(); } // Check if we hit our take profit else if ( _takeProfitTicket != null && orderEvent.OrderId == _takeProfitTicket.OrderId ) { _lastLimitHitAt = Time; // Cancel the stop loss, we no longer need it _stopLossTicket.Cancel(); } } } }

 

Author