Добрый день,
Подскажите, пожалуйста, как на S# корректно реализовать следующий алгоритм:
- Выставляем лимитную заявку на покупку
- При каждом частичном исполнении заявки выставляется тейк-профит в виде противоположной лимитной заявки. Тейк-профит должен быть всегда один, т.е. при каждом новом частичном исполнении заявки старый тейк-профит отменяется, новый же с сальдированным большим объёмом - выставляется. И так, пока заявка на покупку полностью не исполнится. Т.е. в итоге после исполнения лимитной заявки на покупку из n лотов должна быть одна противоположная заявка на продажу (тейк-профит) тоже из n лотов.
Делаю примерно так через WhenNewTrade:
...
_orderOpen.WhenNewTrade(Connector)
.Do(o =>
{
// фиксируем набранную позицию
_summVolumeOpen += o.Trade.Volume;
_summPriceVolumeOpen += _orderdata.OpenPrice * o.Trade.Volume;
// Создать заявку тейк-профит по набранной позиции
CreateTakeProfitOrderSell(_summVolumeOpen);
})
.Apply(this);
...
private void CreateTakeProfitOrderSell(decimal curvol)
{
lock (_syncObjSafe)
{
if (_orderClose != null && _orderClose.State == OrderStates.Active)
CancelOrder(_orderClose);
_orderClose = this.SellAtLimit(_orderdata.ClosePrice, curvol);
...
RegisterOrder(_orderClose);
}
}
Проблема в том, что при исполнении лимитной заявки по частям WhenNewTrade вызывается быстро несколько раз так, что заявка тейк-профит _orderClose не успевает принять состояние Active и поэтому не отменяется. WhenPartiallyMatched, как я понял, тоже не решает проблему - это правило вызывается столько же раз, сколько и WhenNewTrade. В общем, в результате вместо одного тейк-профита у меня выставляется сразу несколько, что неправильно (все заявки кроме последней должны быть отменёнными).
Kommentare (3)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
А как это реализуется на практике через собственные флаги? Я имею ввиду как дождаться, того, что выставленная заявка станет активной, чтобы к ней можно было применить CancelOrder ? Просто не совсем очевидно.