namespace QuantConnect
{
public class TrailingStop : QCAlgorithm
{
bool first = true;
OrderTicket _stopLoss;
const decimal _tailingPercent = 0.05m;
const decimal _stopLossFactor = 1 - _tailingPercent;
public override void Initialize()
{
SetStartDate(2014, 8, 1);
SetEndDate(2014, 11, 1);
SetCash(25000);
AddSecurity(SecurityType.Equity, "SPY", Resolution.Hour);
// plot SPY price
PlotIndicator("SPY", Identity("SPY"));
}
public void OnData(TradeBars data)
{
if (first)
{
first = false;
var quantity = CalculateOrderQuantity("SPY", 1m);
MarketOrder("SPY", quantity);
_stopLoss = StopMarketOrder("SPY", -quantity, Securities["SPY"].Price*_stopLossFactor);
return;
}
if (_stopLoss != null && !_stopLoss.Status.IsFill())
{
var currentStopLoss = _stopLoss.Get(OrderField.StopPrice);
var newStopLoss = Securities["SPY"].Price*_stopLossFactor;
if (newStopLoss > currentStopLoss)
{
_stopLoss.Update(new UpdateOrderFields {
StopPrice = newStopLoss
});
}
Plot("SPY", "Stop", _stopLoss.Get(OrderField.StopPrice));
}
}
}
}