Ошибка при отмене заявки
Atom
09.09.2014
pma37592


Есть такой код. В нем в стратегии выставляем заявку, а потом сразу же отменяем. Версия stocksharp 4.2.22. Для тестирования использовался терминал Quik Junior брокера finam. Коннектор Lua. Лог следующий:

Имя Время Тип Сообщение OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 12:37:02 Info Стратегия запущена. [0,-1]. Позиция 0. OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 12:37:10 Info Регистрация новой Limit (0x19D013B) заявки на Buy с ценой 124770 и объемом 8. OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 12:37:10 Info Заявка UserOrderID=0b7f703e-e375-45a9-9f83-32ffe3209d8b; ID=0; TrasID=45327796; IsMatched=False; IsMatchedEmpty=True; IsMatchedPartially=False; Vol=8; Bal=8; State=Pending OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 12:37:10 Info Отмена заявки 45327796 (0x19D013B). OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 12:37:10 Info Заявку отменили OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 12:37:11 Error Заявка 45327796 (0x19D013B) не была принята по причине System.InvalidOperationException: Ошибка снятия заявки 0. Текст 'vy ne mozhete snyat' dannuyu zayavku'.. OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 12:37:11 Info [_OrderFailed]: Ошибка при регистрации заявки: 0; ThreadID: 16; Ошибка: System.InvalidOperationException: Ошибка снятия заявки 0. Текст 'vy ne mozhete snyat' dannuyu zayavku'.; IsMatched=False; IsMatchedEmpty=True; IsMatchedPartially=False; Vol=8; Bal=8; State=Pending OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 12:37:11 Info Заявка 45327796 (0x19D013B) больше не активна. OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 12:37:11 Info Новая позиция: SPBFUT00J13-RIU4@FORTS=8. OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 12:37:11 Info Новая Buy сделка 115669077 по цене 124770 на 1 заявки 45327796. OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 12:37:11 Info Новая позиция: SPBFUT00J13-RIU4@FORTS=1. OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 12:37:11 Info [_OrderRegistered]: Заявка зарегистрирована: 2441834779; ThreadID: 16; IsMatched=False; IsMatchedEmpty=False; IsMatchedPartially=True; Vol=8; Bal=7; State=Active OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 12:37:11 Info Новая позиция: SPBFUT00J13-RIU4@FORTS=8. OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 12:37:11 Info Новая Buy сделка 115669079 по цене 124770 на 5 заявки 45327796. OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 12:37:11 Info Новая позиция: SPBFUT00J13-RIU4@FORTS=6. OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 12:37:11 Info Новая позиция: SPBFUT00J13-RIU4@FORTS=8. OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 12:37:11 Info Новая Buy сделка 115669080 по цене 124770 на 2 заявки 45327796. OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 12:37:11 Info Заявка 45327796 (0x19D013B) больше не активна.

По логу видно, что при отмене заявки, если заявка еще выставляется на сервере вызывается функция _OrderFailed, а не функция _OrderCanceledFailed. Заявка ведь отменяется и ошибка отмены заявки. Так же не происходит реальной отмены заявки. Заявка выставляется и не происходит ее отмены. Так же хотелось бы иметь какие-то коды ошибок для заявок.

Код под катом:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using StockSharp.Algo;
using StockSharp.Algo.Strategies;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Testing;
using StockSharp.BusinessEntities;
using StockSharp.Logging;

namespace OrderTest
{
  class OpenCancelOrderStrategy:Strategy
  {
    CandleManager _candleManager; //Менеджер свечек
    CandleSeries _series;     //Серия однотиковых свечек
    
    protected override void OnStarted()
    {
      //Начало 
      _candleManager = new CandleManager(this.Connector);
      _series = new CandleSeries(typeof(TickCandle), this.Security, 1);

      Connector.RegisterMarketDepth(this.Security);

      _series
        .WhenCandlesFinished() //Когда закончится тик
        .Do(ProcessCandle) //Вызывать процедуру
        .Apply(this);

      _candleManager.Start(_series);
      base.OnStarted();
    }

    protected override void OnStopped()
    {
      _candleManager.Stop(_series);
      _series.Dispose();
      _candleManager.Dispose();
      base.OnStopped();
    }

    private int IsOrder = 0;
   
    private void ProcessCandle(Candle candle)
    {
      if (IsOrder < 1)
      {
        if (Security.BestAsk == null)
          return;

        IsOrder++;

        //var order = this.BuyAtMarket(this.Volume);
        
        var price = Security.BestAsk.Price;
        var order = this.CreateOrder(StockSharp.Messages.Sides.Buy, price, Volume);

        order
          .WhenRegistered()
          .Do(_OrderRegistered)
          .Apply(this);

        order
          .WhenRegisterFailed()
          .Do(_OrderFailed)
          .Apply(this);

        order
          .WhenCanceled()
          .Do(_OrderCanceled)
          .Apply(this);

        order
          .WhenCancelFailed()
          .Do(_OrderCanceledFailed)
          .Apply(this);

        RegisterOrder(order);

        var msg = String.Format("Заявка UserOrderID={0}; ID={1}; TrasID={2}; IsMatched={3}; IsMatchedEmpty={4}; IsMatchedPartially={5}; Vol={6}; Bal={7}; State={8}", order.UserOrderId, order.Id, order.TransactionId, order.IsMatched(), order.IsMatchedEmpty(), order.IsMatchedPartially(), order.Volume, order.Balance, order.State);
        this.AddInfoLog(msg);

        CancelOrder(order);
        msg = "Заявку отменили";   
        this.AddInfoLog(msg);
      }
    }

    private void _OrderFailed(OrderFail Error)
    {
      var msg = String.Format("[OnOrderFailed]: Ошибка при регистрации заявки: {0}; ThreadID: {1}; Ошибка: {2}; IsMatched={3}; IsMatchedEmpty={4}; IsMatchedPartially={5}; Vol={6}; Bal={7}; State={8}", Error.Order.Id, Thread.CurrentThread.ManagedThreadId, Error.Error, Error.Order.IsMatched(), Error.Order.IsMatchedEmpty(), Error.Order.IsMatchedPartially(), Error.Order.Volume, Error.Order.Balance, Error.Order.State);
      this.AddInfoLog(msg);
    }


    private void _OrderRegistered(Order order)
    {
      var msg = String.Format("[OnOrderRegistered1]: Заявка зарегистрирована: {0}; ThreadID: {1}; IsMatched={2}; IsMatchedEmpty={3}; IsMatchedPartially={4}; Vol={5}; Bal={6}; State={7}", order.Id, Thread.CurrentThread.ManagedThreadId, order.IsMatched(), order.IsMatchedEmpty(), order.IsMatchedPartially(), order.Volume, order.Balance, order.State);
      this.AddInfoLog(msg);
    }

    private void _OrderCanceled(Order order)
    {
      var msg = String.Format("[_OrderCanceled]: Заявка успешно отменена: {0}; ThreadID: {1}; IsMatched={2}; IsMatchedEmpty={3}; IsMatchedPartially={4}; Vol={5}; Bal={6}; State={7}", order.Id, Thread.CurrentThread.ManagedThreadId, order.IsMatched(), order.IsMatchedEmpty(), order.IsMatchedPartially(), order.Volume, order.Balance, order.State);
      this.AddInfoLog(msg);
    }

    private void _OrderCanceledFailed(OrderFail Error)
    {
      var msg = String.Format("[_OrderCanceledFailed]: Ошибка при отмене заявки: {0}; ThreadID: {1}; Ошибка: {2}; IsMatched={3}; IsMatchedEmpty={4}; IsMatchedPartially={5}; Vol={6}; Bal={7}; State={8}", Error.Order.Id, Thread.CurrentThread.ManagedThreadId, Error.Error, Error.Order.IsMatched(), Error.Order.IsMatchedEmpty(), Error.Order.IsMatchedPartially(), Error.Order.Volume, Error.Order.Balance, Error.Order.State);
      this.AddInfoLog(msg);
    }
  }
}


Теги:


Спасибо:


Andrii

Фотография
Дата: 09.09.2014
Ответить


присоединяюсь,

2014/09/09 15:53:25.451|       |QuikTrader|OrderCancelFailed: 52681380/2442218035 Продажа Цена=1152.6 Объем=1 Сост=Done Бал=0 
System.InvalidOperationException: Ошибка снятия заявки 2442218035. Текст 'vy ne mozhete snyat' dannuyu zayavku'.
Спасибо:

VirKato

Фотография
Дата: 09.09.2014
Ответить


Andrii: присоединяюсь,

2014/09/09 15:53:25.451| |QuikTrader|OrderCancelFailed: 52681380/2442218035 Продажа Цена=1152.6 Объем=1 [b]Сост=Done[/b] Бал=0 System.InvalidOperationException: Ошибка снятия заявки 2442218035. Текст 'vy ne mozhete snyat' dannuyu zayavku'.


Состояние Done согласно документации выставляется, когда заявка полностью удовлетворена или снята. Чтож вы с ней еще хотите сделать?

> **pma37592:**
> Есть такой код. В нем в стратегии выставляем заявку, а потом сразу же отменяем.
На сколько - сразу: по заявке успевает прийти биржевой ID? Судя по логу событие о том, что она зарегистрировано от биржи приходит одновременно с ошибкой. Не уверен на счет forts, но на стоках так точно делать нельзя. May be try sleep(100)?
Спасибо:

pma37592

Фотография
Дата: 09.09.2014
Ответить


VirKato: Состояние Done согласно документации выставляется, когда заявка полностью удовлетворена или снята. Чтож вы с ней еще хотите сделать?

Проблема в том, что вызывается не то событие об ошибке, а в некоторых случаях вообще не вызывается.

Если добавить код.


...
order.WhenMatched().Do(_OrderMatched).Apply(this);
...

private void _OrderMatched(Order order)
{
 var msg = String.Format("[OrderMatched]: Заявка полностью исполнена: {0}; ThreadID: {1}; IsMatched={2}; IsMatchedEmpty={3}; IsMatchedPartially={4}; Vol={5}; Bal={6}; State={7}",
        order.Id, Thread.CurrentThread.ManagedThreadId, order.IsMatched(), order.IsMatchedEmpty(), order.IsMatchedPartially(),
        order.Volume, order.Balance, order.State);
      Logs.LogMsg(msg);
      this.AddInfoLog(msg);

      CancelOrder(order);
      msg = "[OrderMatched]: Заявку отменили";
      Logs.LogMsg(msg);
      this.AddInfoLog(msg);
}

То лог будет, таким

Имя Время Тип Сообщение OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 19:08:12 Info Стратегия запущена. [0,-1]. Позиция 0. OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 19:08:25 Info Регистрация новой Limit (0x228E01D) заявки на Buy с ценой 125170 и объемом 2. OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 19:08:25 Info Заявка ID=0; TrasID=68866896; IsMatched=False; IsMatchedEmpty=True; IsMatchedPartially=False; Vol=2; Bal=2; State=Pending OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 19:08:25 Info Отмена заявки 68866896 (0x228E01D). OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 19:08:25 Info Заявку отменили OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 19:08:25 Error Заявка 68866896 (0x228E01D) не была принята по причине System.InvalidOperationException: Ошибка снятия заявки 0. Текст 'vy ne mozhete snyat' dannuyu zayavku'.. OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 19:08:25 Info [_OrderFailed]: Ошибка при регистрации заявки: 0; ThreadID: 15; Ошибка: System.InvalidOperationException: Ошибка снятия заявки 0. Текст 'vy ne mozhete snyat' dannuyu zayavku'.; IsMatched=False; IsMatchedEmpty=True; IsMatchedPartially=False; Vol=2; Bal=2; State=Pending OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 19:08:25 Info Заявка 68866896 (0x228E01D) больше не активна. OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 19:08:25 Info Новая позиция: SPBFUT00J13-RIU4@FORTS=2. OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 19:08:25 Info Новая Buy сделка 115716930 по цене 125170 на 1 заявки 68866896. OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 19:08:25 Info Новая Buy сделка 115716931 по цене 125170 на 1 заявки 68866896. OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 19:08:25 Info [_OrderMatched]: Заявка полностью исполнена: 2442481882; ThreadID: 15; IsMatched=True; IsMatchedEmpty=False; IsMatchedPartially=False; Vol=2; Bal=0; State=Done OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 19:08:25 Warning Для заявки 68866896 (0x228E01D) уже был послан сигнал на отмену. OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 19:08:25 Info [_OrderMatched]: Заявку отменили OCOS_RIU4@FORTS_SPBFUT00J13 09.09.2014 19:08:25 Info Заявка 68866896 (0x228E01D) больше не активна.

Вообще не вызывается ничего, получается ошибка - отмена уже не существующего ордера. При этом запрос на отмену отсылается, но квик сообщает, что не может отменить заявку. Возникает вопрос: если все же отменяем заявку, которая на бирже уже исполнилась, а квик эту информацию еще не получил. Будет вызвано сообщение об ошибке WhenCancelFailed?

Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy