I have created a relatively simple strategy that follows a trail stop that comes from an indicator.
OnBarUpdate() section:
protected override void OnBarUpdate()
{
switch(Position.MarketPosition)
{
case MarketPosition.Flat:
.... // ENTRY CODE AND CANCEL ORDER CODE
break;
case MarketPosition.Short: // === OPEN SHORT POSITION
trailValue = TrailDown.TrailStop[0];
if (High[0] < trailValue)
{
if (stopOrder != null && stopOrder.StopPrice > trailValue)
{
// ... modify the stop loss to the new value of the trailing stop
stopOrder = ExitShortStop(0, true, stopOrder.Quantity, trailValue, "ShortStop", "ShortEntry");
}
}
break;
default:
break;
}
protectedoverridevoid OnOrderUpdate(IOrder order)
{
if (entryOrder != null && entryOrder.Token == order.Token)
{
if (order.OrderState == OrderState.Cancelled && order.Filled == 0)
entryOrder = null;
}
}
Then OnExecution() section:
protectedoverridevoid OnExecution(IExecution execution)
{
if (entryOrder != null && entryOrder.Token == execution.Order.Token)
{
if (execution.Order.OrderState == OrderState.Filled || execution.Order.OrderState == OrderState.PartFilled || (execution.Order.OrderState == OrderState.Cancelled && execution.Order.Filled > 0))
{
// INITIAL Stop-Loss
stopOrder = ExitShortStop(0, true, execution.Order.Filled, trailValue, "ShortStop", "ShortEntry");
// INITIAL Target - 50 ticks away from the entry price
targetOrder = ExitShortLimit(0, true, execution.Order.Filled, execution.Order.AvgFillPrice - 50 * TickSize, "ShortTarget", "ShortEntry");
// Resets the entryOrder object to null after the order has been filled or partially filled
if (execution.Order.OrderState != OrderState.PartFilled)
{
entryOrder = null;
}
}
}
// ... Reset the stop order and target orders' IOrder objects after the position is closed.
if ((stopOrder != null && stopOrder.Token == execution.Order.Token) || (targetOrder != null && targetOrder.Token == execution.Order.Token))
{
if (execution.Order.OrderState == OrderState.Filled || execution.Order.OrderState == OrderState.PartFilled)
{
stopOrder = null;
targetOrder = null;
}
}
}

Comment