Удвоение ордера при перевыставлении
Atom Ответить
25.05.2012


По логике стратегии нужно перевыставлять ордера каждую секунду при определенных условиях. Поэтому я из дочерней стратегии наследованной от timeFrameStrategy вызываю каждую секунду CheckOrders. И при выставлении запоминаю ордер в свойство. Это почти работает. Но, периодически ордера дублируются. При этом в свойстве запоминается только один из них, а второй остается висеть. Сижу думаю как отлавливать. Если подкинете мысли - в чем может быть ошибка, буду очень признателен. Да, ордера выставляются через квик (быструю, но надежную программу).

Кусок кода. Функция CheckOrders вызывается только из OnProcess дочерней, раз в секунду:
Код

class aStratagy: Strategy
{
    private Order CurrBuy { get; set; }
    
    public void CheckOrders(){
      //проверка условий
      var newBuy = this.CreateOrder(OrderDirections.Buy, bid, qbuy);
      ReRegisterBuy(newBuy);
    }

    private void ReRegisterBuy(Order newBuy)
    {
      this.ReRegisterOrder(CurrBuy, newBuy);
      this.CurrBuy = newBuy;
    }
}

Теги:


Спасибо:



Скидка 15% на все обучение до 5 апреля (осталось 2 дней).

10 Ответов
esper

Фотография
Программист
Дата: 25.05.2012
Ответить


Надо смотреть в сторону Order.WhenRegistered, Order.WhenRegisterFailed и Order.WhenCancelFailed
Спасибо:

VirKato

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


QUIK быстрая, но надежная программа. Поэтому с некоторой периодичностью ордера зависают: новая регистрируется, но старая заявка CancelFailed, новая RegisterFailed и т.д. Варианты решения этого:
1) Пытаться обработать все варианты с помощью WhenSomeShitHappened. У меня пока не получается. Если можете - приведите пожалуйста примеры. Я пытаюсь сделать что то вроде этого обработчика:
Код

CurrSell.WhenCancelFailed().Do((err) =>
{
             errorLogStrategy.AddInfoLog(Thread.CurrentThread.ManagedThreadId + "Cancel ask failed order id: " 
                                    + err.Order.Id + "  and transId: " + err.Order.TransactionId);
             errorLogStrategy.AddInfoLog(Thread.CurrentThread.ManagedThreadId + "Cancel failed order state: " 
                                    + err.Order.State + "  and status: " + err.Order.Status);
             if (err.Order.State != OrderStates.Done) this.ReCancelOrder(err.Order);
}).Apply(this);
CurrSell.WhenChanged().Do((order) =>
{
if (order.State == OrderStates.Done && order.Balance != 0)
          errorLogStrategy.AddInfoLog(Thread.CurrentThread.ManagedThreadId + "Canceled ask order id: " 
                               + order.Id + "  and transId: " + order.TransactionId);
}).Apply(this);
newOrder.WhenRegisterFailed().Do((err) => errorLogStrategy.AddInfoLog(Thread.CurrentThread.ManagedThreadId + 
                                "RegisterFailed ask order id: " + err.Order.Id + "  and transId: " + err.Order.TransactionId + " "
                                 +  err.Error.ToString())).Apply(this);
newOrder.WhenRegistered().Do((order) => errorLogStrategy.AddInfoLog(Thread.CurrentThread.ManagedThreadId + 
                                "Registered ask order id: " + order.Id + "  and transId: " + order.TransactionId)).Apply(this);

2) Доставать непосредственно из QUIKa все ордера искать все активные и Cancel ненужные. Реализуется за минуту. Но, через некоторое время ордеров становится слишком много. Есть возможность доставать из QUIK только активные ордера?
Автор топика
Спасибо:

Alexander

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


Квик апи - не быстрый, а самый медленный из доступных.
Спасибо:

Den

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


Alexander Mukhanchikov Перейти
Квик апи - не быстрый, а самый медленный из доступных.

Смарт быстрее работает?
У меня знакомые в свое время, кто на прямую под него писали ругались на глюкавость и тормознутость...
Спасибо:

Alexander

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


Den Перейти
Alexander Mukhanchikov Перейти
Квик апи - не быстрый, а самый медленный из доступных.

Смарт быстрее работает?
У меня знакомые в свое время, кто на прямую под него писали ругались на глюкавость и тормознутость...


смарт глюкавыЙ, у меня такое же впечатление. я работаю под квик апи, не парюсь особо.
но смарт по тестам побыстрее.

У нас есть пример для тестирования на codeplex - SpeedTest, в Samples\Common
Спасибо:

esper

Фотография
Программист
Дата: 29.05.2012
Ответить


VirKato Перейти
1) Пытаться обработать все варианты с помощью WhenSomeShitHappened. У меня пока не получается. Если можете - приведите пожалуйста примеры. Я пытаюсь сделать что то вроде этого обработчика:

Если в кратце, то отправляем заявку на регистрацию, пока не будет вызвано Regitered или Failed с заявкой ничего не делаем, даже если прошел таймаут, по одному из событий решаем дальше что делать с заявкой. Если интересуют конкретные примеры, то это лучше в платную поддержку обратиться.

VirKato Перейти
2) Доставать непосредственно из QUIKa все ордера искать все активные и Cancel ненужные. Реализуется за минуту. Но, через некоторое время ордеров становится слишком много. Есть возможность доставать из QUIK только активные ордера?

Код
Trader.Orders.Where(o => o.State == OrderState.Active)
Спасибо: VirKato

VirKato

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


Alexander Mukhanchikov
Квик апи - не быстрый, а самый медленный из доступных.

Хех. То, что "QUIK быстрая, но надежная программа" - это стандартная фраза, которую я слышал после кучи мата от трейдеров, которые руками трейдят.

esper
Спасибо. А отмену заявки при перерегистрации можно так же отловить? WhenCanceleFailed срабатывает, WhenCancel - нет.
Автор топика
Спасибо:

Den

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


Alexander Mukhanchikov Перейти
Den Перейти
Alexander Mukhanchikov Перейти
Квик апи - не быстрый, а самый медленный из доступных.

Смарт быстрее работает?
У меня знакомые в свое время, кто на прямую под него писали ругались на глюкавость и тормознутость...


смарт глюкавыЙ, у меня такое же впечатление. я работаю под квик апи, не парюсь особо.
но смарт по тестам побыстрее.

У нас есть пример для тестирования на codeplex - SpeedTest, в Samples\Common


Сегодня брокер осчастливил апгрейдом Quik'а с 5.24 на 6.02 наконец-то.
Все стало еще шустрее работать...
Спасибо:

esper

Фотография
Программист
Дата: 30.05.2012
Ответить


VirKato Перейти
А отмену заявки при перерегистрации можно так же отловить? WhenCanceleFailed срабатывает, WhenCancel - нет.

На плазе WhenCancel точно срабатывает, должно и на квике работать.
Спасибо:

VirKato

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


Хм, самым надежным способом оказалось просматривать все активные ордера и пытаться убить лишние:
Код

var activeOrders = Trader.Orders.Where(o => ((o.State == OrderStates.Active) && (o.Status == OrderStatus.Accepted)));

Через некоторое время появляются ордера которые реально уже сняты, но отображаются как активные. Причем со временем их количество растет. Может быть до Trader просто не доходят сообщения от квика о том, что они сняты. Если переподключить Trader к квику, то проблема снимается. Можно ли создать Clone шлюза и стратегии и подключить их до того как отключить предыдущие, что бы сократить до минимума время рестарта стратегии?
Автор топика
Спасибо:


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

loading
clippy