← 戻る

О LastTradeQuotingStrategy

Что-то оно совсем не так работает, как описано в документации. Насколько я понял, в конструкторе LastTradeQuotingStrategy предполагается в качестве параметра передать Unit, с параметрами которого стратегия будет работать для изменения цены выставляемой заявки. Пробую:

...
strategy = new QuotingStrategy(order, new Unit() { Type = UnitTypes.Percent, Value = 1 });
if (strategy != null)
{
    base.ChildStrategies.Add(strategy);
    strategy.Start();
}
...

В логе вижу, что стратегия работает, выставляет заявку и, как и ожидалось, меняет её с учётом последней сделки, но почему-то Unit не учитывается совсем. Я что-то не так делаю?

このトピックは参考になりましたか?

トピックを共有

コメント (3)

ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください

Mikhail Sukhov
Mikhail Sukhov

Soloton: Что-то оно совсем не так работает, как описано в документации.

Судя по всему ошибка в доке. MarketDelta учитывается при определении лучшей цены (в данном случае послед сделки). Если она ушла на эту дельту - перестановка. Честно говоря, уже не помню когда случилась разсинхронизация с документацией. Спасибо, исправлю. И да, а какое поведение ожидалось?

Soloton
Soloton 著者

Может это я не так понял документацию? Ожидалось, что цена в выставляемой стратегией заявке будет изменена на величину MarketDelta. Т.е. при последней сделке в 1000р. и MarketDelta 0,1%, заявка выставится с ценой 1001р. при продаже и 999р. при покупке. И так при каждой новой не нашей сделке.

Пробую реализовать такое поведение, создав класс-потомок LastTradeQuotingStrategy:

public class MyLastTradeQuotingStrategy : LastTradeQuotingStrategy
{
    public MyLastTradeQuotingStrategy(Order order, Unit marketDelta)
        : base(order, marketDelta) {}

    protected override double GetNewPrice()
    {
        var r = base.GetNewPrice();
        r = Math.Round((double)(r + (base.Order.Direction == OrderDirections.Buy ? new Unit(-base.MarketDelta.Value, base.MarketDelta.Type) : base.MarketDelta)), base.Security.Decimals);
        return r;
    }
}

Работает, однако что-то всё же делаю не так или не делаю как надо, потому что ожидаемой реакции на сделки нет. Заявка выставляется, но изменение происходит только при завершении заявки. Что упустил?

Soloton
Soloton 著者

Вопрос снят. Спешил задать его, не попробовав внести изменения с учётом уточнения Михаила. Теперь код выглядит так.

public class MyLastTradeQuotingStrategy : LastTradeQuotingStrategy
{
    Unit ChangeInPrice;
    public MyLastTradeQuotingStrategy(Order order, Unit marketDelta ,Unit changeInPrice)
        : base(order, marketDelta)
    {
        this.ChangeInPrice = changeInPrice;
    }

    protected override double GetNewPrice()
    {
        var r = base.GetNewPrice();
        r = Math.Round((double)(r + (base.Order.Direction == OrderDirections.Buy ? new Unit(-this.ChangeInPrice.Value, this.ChangeInPrice.Type) : this.ChangeInPrice)), base.Security.Decimals);
        return r;
    }
}

Работает как задумывалось. Прошу прощения, если успел кого-нибудь ввести в заблуждение.