finsight / QUIKSharp

QUIK# (QUIK Sharp) is the QUIK Lua interface ported to .NET.
Other
230 stars 134 forks source link

Раздвоение заявки #322

Closed Gitel3 closed 2 years ago

Gitel3 commented 2 years ago

Здравствуйте! Подписался на событие onQuote, при соблюдении определенных условий по цене отправляю заявку через _quik.Orders.SendLimitOrder(). Сегодня при передаче параметра в 27 контрактов, в терминал в одно и то же время пришло 2 заявки на 26 контракт и на 1 контракт. Все бы ничего, но я дальше отслеживаю поданную заявку по номеру, полученному при ее выставлении, а у выставленных заявок было два разных номера. В первый раз такое, раньше всегда была одна заявка. Подскажите, разделение одной заявки на две это нормальное поведение терминала?

Gitel3 commented 2 years ago

Дело в том, что я использовал для определения количества контрактов _quik.Trading.CalcBuySell(). Код примерно такой: i = 1; private void Events_OnQuote(OrderBook orderBook) { if (i == 1) { qt = _quik.Trading.CalcBuySell(tool.ClassCode, secCode, tool.СlientCode, AccountID, (double)(tool.LastPrice + protect), true, false).Result.Qty - 1; orderOpenLong1 = _quik.Orders.SendLimitOrder(tool.ClassCode, secCode, AccountID, Operation.Buy, tool.LastPrice + protect, qt).Result.OrderNum; i = 0; } } Могло ли прилететь сначала одно событие, код определил максимум 27 - 1, отправил заявку на 26 контрактов, а затем, пока SendLimitOrder выполнялся и i еще не изменилась, событие сработало снова и определило остаток по оставшемуся на это мгновение лимиту 2 - 1?

Pr0phet1c commented 2 years ago

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

private void Events_OnQuote(OrderBook orderBook) { if (i == 1) && !ignoreCall { ignoreCall = true; qt = _quik.Trading.CalcBuySell(tool.ClassCode, secCode, tool.СlientCode, AccountID, (double)(tool.LastPrice + protect), true, false).Result.Qty - 1; orderOpenLong1 = _quik.Orders.SendLimitOrder(tool.ClassCode, secCode, AccountID, Operation.Buy, tool.LastPrice + protect, qt).Result.OrderNum; i = 0; ignoreCall = false; } }

Gitel3 commented 2 years ago

Ок, интересный подход, спасибо за совет!