Для изменения размера нажмите или перетащите
Стоп-заявки

QuikTrader поддерживает работу со всеми типами стоп-заявок Quik-а. Стоп-заявки регистрируются, заменяются и снимаются через те же методы, что и обычные заявки:

Создание первой стратегии

Снятие заявок

Замена заявок

Для получения биржевой заявки, которая была создана стоп-заявкой при активации стоп условия, необходимо использовать свойство OrderDerivedOrder. Данное свойство используется, когда необходимо получить сделки, созданные в рамках стоп-заявки. При этом, сами сделки создаются не по стоп-, а по биржевой заявке, и чтобы их получить, следуют использовать подход вида:

C#
// получаем биржевую заявку по стоп-заявке
var marketOrder = stopOrder.DerivedOrder;

// если биржевая заявка зарегистрирована
if (marketOrder != null)
{
    var trades = trader.GetMyTrades(marketOrder);
    // ...
}

Примеры создания стоп-заявок:

  1. Выбор нужного типа стоп-заявки:

    Примечание Примечание

    Исходные коды примера лежат в дистрибутиве в папке под названием Sample.

    C#
    switch (this.StopOrderType.SelectedIndex)
    {
        case 0:
            stopOrder = CreateLinkedOrder();
            break;
        case 1:
            stopOrder = CreateStopLimit();
            break;
        case 2:
            stopOrder = CreateOtherSecurity();
            break;
        case 3:
            stopOrder = CreateTakeProfit();
            break;
        case 4:
            stopOrder = CreateTakeProfitAndStopLimit();
            break;
        default:
            throw new InvalidOperationException("Выбран неизвестный тип стоп-заявки.");
    }
    
    MainWindow.Instance.NewOrder(stopOrder);
  2. Со связанной заявкой:

    C#
    private Order CreateLinkedOrder()
    {
        return new Order
        {
            Type = OrderTypes.Conditional,
            Volume = this.Volume.Text.To<int>(),
            Price = this.Price.Text.To<decimal>(),
            Security = this.Security,
            Direction = this.IsBuy.IsChecked == true ? OrderDirections.Buy : OrderDirections.Sell,
            ExpiryDate = this.ExpirationDate.SelectedDate,
            StopCondition = new QuikOrderCondition
            {
                Type = QuikOrderConditionTypes.LinkedOrder,
                LinkedOrderPrice = this.LinkedOrderPrice.Text.To<decimal>(),
                LinkedOrderCancel = (bool)this.LinkedOrderCancel.IsChecked,
                StopPrice = this.StopPrice.Text.To<decimal>(),
                ActiveTime = this.ActiveTime,
            },
        };
    }
  3. Стоп-лимит:

    C#
    private Order CreateStopLimit()
    {
        return new Order
        {
            Type = OrderTypes.Conditional,
            Volume = this.Volume.Text.To<int>(),
            Price = this.Price.Text.To<decimal>(),
            Security = this.Security,
            Direction = this.IsBuy.IsChecked == true ? OrderDirections.Buy : OrderDirections.Sell,
            ExpiryDate = this.ExpirationDate.SelectedDate,
            StopCondition = new QuikOrderCondition
            {
                Type = QuikOrderConditionTypes.StopLimit,
                StopPrice = this.StopPrice.Text.To<decimal>(),
                ActiveTime = this.ActiveTime,
            },
        };
    }
  4. По другому инструменту:

    C#
    private Order CreateOtherSecurity()
    {
        return new Order
        {
            Type = OrderTypes.Conditional,
            Volume = this.Volume.Text.To<int>(),
            Price = this.Price.Text.To<decimal>(),
            Security = this.Security,
            Direction = this.IsBuy.IsChecked == true ? OrderDirections.Buy : OrderDirections.Sell,
            ExpiryDate = this.ExpirationDate.SelectedDate,
            StopCondition = new QuikOrderCondition
            {
                Type = QuikOrderConditionTypes.OtherSecurity,
                StopPriceCondition = this.StopPriceCondition.Text == ">=" ? QuikStopPriceConditions.MoreOrEqual : QuikStopPriceConditions.LessOrEqual,
                StopPrice = this.StopPrice.Text.To<decimal>(),
                OtherSecurityId = ((Security)this.OtherSecurities.SelectedValue).Id,
                ActiveTime = this.ActiveTime,
            },
        };
    }
  5. Тейк-профит:

    C#
    private Order CreateTakeProfit()
    {
        return new Order
        {
            Type = OrderTypes.Conditional,
            Volume = this.Volume.Text.To<int>(),
            Security = this.Security,
            Direction = this.IsBuy.IsChecked == true ? OrderDirections.Buy : OrderDirections.Sell,
            ExpiryDate = this.ExpirationDate.SelectedDate,
            StopCondition = new QuikOrderCondition
            {
                Type = QuikOrderConditionTypes.TakeProfit,
                StopPrice = this.StopPrice.Text.To<decimal>(),
                Offset = this.Offset.Unit,
                Spread = this.Spread.Unit,
                ActiveTime = this.ActiveTime,
            },
        };
    }
  6. Тейк-профит и стоп-лимит:

    C#
    private Order CreateTakeProfitAndStopLimit()
    {
        return new Order
        {
            Type = OrderTypes.Conditional,
            Volume = this.Volume.Text.To<int>(),
            Price = this.Price.Text.To<decimal>(),
            Security = this.Security,
            Direction = this.IsBuy.IsChecked == true ? OrderDirections.Buy : OrderDirections.Sell,
            ExpiryDate = this.ExpirationDate.SelectedDate,
            StopCondition = new QuikOrderCondition
            {
                Type = QuikOrderConditionTypes.TakeProfitStopLimit,
                StopPrice = this.StopPrice.Text.To<decimal>(),
                StopLimitPrice = this.StopLimitPrice.Text.To<decimal>(),
                Offset = this.Offset.Unit,
                Spread = this.Spread.Unit,
                ActiveTime = this.ActiveTime,
            },
        };
    }
  7. Сама регистрация стоп-заявки:

    C#
    public void NewOrder(Order order)
    {
        if (order == null)
            throw new ArgumentNullException("order");
    
        order.Portfolio = (Portfolio)this.Portfolios.SelectedValue;
        this.Trader.RegisterOrder(order);
    }
  8. Если необходимо зарегистрировать стоп-заявку "по исполнению", то необходимо присвоить идентификатор активной заявки свойству QuikOrderConditionConditionOrderId. Ниже показан выбор типа стоп-заявок "по исполнению", которых Quik предоставляет меньше, чем для обычных стоп-заявок:

    C#
    switch (this.StopOrderType.SelectedIndex)
    {
        case 1:
            stopOrder = CreateConditionStopLimit();
            break;
        case 3:
            stopOrder = CreateConditionTakeProfit();
            break;
        case 4:
            stopOrder = CreateConditionTakeProfitAndStopLimit();
            break;
        default:
            throw new InvalidOperationException("Выбран неизвестный тип стоп-заявки.");
    }
  9. Стоп-лимит "по исполнению":

    C#
    private Order CreateConditionStopLimit()
    {
        var stopLimit = CreateStopLimit();
        var condition = (QuikOrderCondition)stopLimit.StopCondition;
        condition.ConditionOrderId = this.ConditionOrder.Id;
        condition.ConditionOrderPartiallyMatched = this.PartiallyMatched.IsChecked;
        condition.ConditionOrderUseMatchedBalance = this.UseMatchedBalance.IsChecked;
        return stopLimit;
    }

    Как видно из кода, просто создается обычная стоп-заявка через метод CreateStopLimit, и она дозаполняется необходимыми параметрами.

    Внимание Внимание

    Свойство OrderDirection для стоп-заявок "по исполнению" игнорируется, так как такая заявка всегда обратна заявке-условию, передающейся через свойство QuikOrderConditionConditionOrderId, и при регистрации автоматически выставляется в правильное значение.

  10. Тейк-профит "по исполнению":

    C#
    private Order CreateConditionTakeProfit()
    {
        var stopLimit = CreateTakeProfit();
        var condition = (QuikOrderCondition)stopLimit.StopCondition;
        condition.ConditionOrderId = this.ConditionOrder.Id;
        condition.ConditionOrderPartiallyMatched = this.PartiallyMatched.IsChecked;
        condition.ConditionOrderUseMatchedBalance = this.UseMatchedBalance.IsChecked;
        return stopLimit;
    }
  11. Тейк-профит и стоп-лимит "по исполнению":

    C#
    private Order CreateConditionTakeProfitAndStopLimit()
    {
        var stopLimit = CreateTakeProfitAndStopLimit();
        var condition = (QuikOrderCondition)stopLimit.StopCondition;
        condition.ConditionOrderId = this.ConditionOrder.Id;
        condition.ConditionOrderPartiallyMatched = this.PartiallyMatched.IsChecked;
        condition.ConditionOrderUseMatchedBalance = this.UseMatchedBalance.IsChecked;
        return stopLimit;
    }
  12. В итоге должно получить следующее:

    Пример работы со стоп заявками.
См. также