← Zurück

Котирование по волатильности

Добрый день! Пытаюсь организовать работу с заявками по волатильности, но никак не получается добиться более менее комфортной работы от VolatilityQuotingStrategy для Quik. Библиотека S# 4.0 Попытаюсь систематизировать возникащие проблемы:

  1. <u>Остановка по ошибке</u> Сейчас в случае возникновения любой ошибки стратегия котирования останавливается или пытается продолжить работу пока не будет исчерпан лимит MaxErrorCount. Но такое поведение не всегда подходит.

Например, в случае ошибки:

. Причина '[FORTS] Премия по опциону вне лимитов. 12065.00000 - 12565.00000'.

обоснована немедленная остановка стратегии, а в случае ошибок типа:

не удается снять заявку

хотелось бы, чтобы стратегия предприняла еще попытки отменить заявку.

В связи с этим возникает вопрос... - Можно ли как-то определить типы исключений, по которым стратегия должна останавливаться, а по которым нет? Или может есть какой-то альтернативный механизм, при помощи которого можно организовать подобную логику?

  1. <u>Логгирование</u> Сейчас логги стратегии котирования содержат огромное количество информации. И сам процесс перестановки заявок и все ошибки выводятся через событие Log. Очевидно, что в общем случае для пользователя такое количество информации является избыточным, нужно как-то фильтровать сообщения. Например, мне было бы достаточно выводить только ошибки, которые привели к остановке стратегии. Я пытаюсь фильтровать только message, где MessageState.Error Но тексте такой ошибки выводится StackTrace и Транзакция, которые очень сильно захламляют выводимое сообщение. Пример:

System.ArgumentException: Транзакции 'ACCOUNT=SPBFUT00021; CLIENT_CODE=SPBFUT00021; TRANS_ID=53588440; CLASSCODE=SPBOPT; SECCODE=RI125000BX1; QUANTITY=1; OPERATION=B; TYPE=L; ACTION=NEW_ORDER; PRICE=15055; EXECUTION_CONDITION=PUT_IN_QUEUE;' не была зарегистрирована. Причина '[FORTS] Премия по опциону вне лимитов. 12065.00000 - 12565.00000'. Parameter name: transactionTxt at #=qWPEZbaPXXnfu0dolel1ZCrOozOSaV9Evx8y5tzJ_qRg=.#=qUmjMMAjUTZss3dBE$Ew$fpc_JpVLlqt0ZmiB6BsvsdU=(String #=qL04X18_51q6kCgj6rYNY5g==, OrderStatus& #=qsrLj2ADhO$O_1gepTOivtA==, UInt32& #=qLxax_yvVk4z0qUc0dAQ32g==, Int64& #=qtjdK4awArO9TiFZTKitnBQ==, String& #=q2bRWR3jcDI1Bu7F20PAwxw==) at StockSharp.Quik.QuikTrader.#=qNjNbkG4PfYKhxHndxWXTWF1Ov$hID1w11HFWHeJ2x5k=(Order #=qLe3cC9AUaUdkc1nayio1IA==, TransactionBuilder #=qI3zb3NAT7OuakeMqyKo6bw==) at StockSharp.Quik.QuikTrader.OnRegisterOrder(Order order) at StockSharp.Algo.BaseTrader.RegisterOrder(Order order) at StockSharp.Algo.Strategies.Strategy.RegisterOrder(Order order) at StockSharp.Algo.Strategies.QuotingStrategy.#=qUnRhFjJYBEJR2aX1ii4r3g==() at StockSharp.Algo.Strategies.QuotingStrategy.#=qMLnz$QQgJVSunmZKGb$991wLpKURSLxlpEtBpES1NFI=.#=qmtxb5GB9904qysMgCjwVBQ==() at StockSharp.Algo.Strategies.StrategyRule.#=qQrecZK95seh7eX31S0$L1c4z__sUsXGlZDSN84Xriek=.#=qhftCtuaqFJhzzRNZOlqGig==(Object #=qKbVbzSe0ZKnXvU43LzXRuw==) at StockSharp.Algo.Strategies.Strategy.#=q1CfLqaNuJVblIvl$mfhRZQ==(StrategyRule #=qjNSQS_xTM$cIj4bTUzJoNQ==, Object #=qnC3HLgCCuWFncdxUk6AxAQ==)

  1. <u>Отмена заявок в VolatilityQuotingStrategy</u>

Не получается чисто прервать работу VolatilityQuotingStrategy с отменой всех активных заявок:

  1. При вызове strategy.CancelActiveOrders() часто выдается исключение типа "Стратегия должна быть зарегистрирована". Поэтому я проверяю сначала ProcessState
if (volaOrder.ProcessState == StockSharp.Algo.Strategies.ProcessStates.Started)
                {
                    volaOrder.CancelActiveOrders();
                }

Но что делать, если стратегия остановлена(она остановилась по ошибке), а активные заявки остались?

  1. В последней версии такого не замечал, но возможно по чистой случайности, поэтому напишу еще об одной проблеме. При попытке остановить стратегию VolatilityQuotingStrategy

volaOrder.Stop()

стратегия зависает в состоянии Stopping, начинает что-то пытаться делать, в логи валятся сообщения... Т.е. создается ощущение, что в OnStopping крутится какой-то код, который не дает перевестись стратегии в состояние Stopped. Приходится выводить volaOrder.Stop() в отдельный поток, чтобы не блокировать основной поток при таком зависании.

Kommentare (2)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Alexander
Alexander
  1. Обрабатывайте событие возникновения ошибки стратегии и поступайте как считаете нужным в зависимости от текста ошибки
  2. Переопределите OnWriteMessage
  3. Снимайте заявки через Trader.CancelOrders
Артем_2
Артем_2
Артем_2 Autor

Alexander Mukhanchikov:

  1. Обрабатывайте событие возникновения ошибки стратегии и поступайте как считаете нужным в зависимости от текста ошибки
  2. Переопределите OnWriteMessage
  3. Снимайте заявки через Trader.CancelOrders

Спасибо, попробую!