QuikLua ReRegisterOrder Баг
Atom Ответить
05.07.2017


При использовании ReRegisterOrder(order, price, vol) новая заявка встает как надо, но старая так и остается висеть, хотя должна удаляться. В итоге вместо движения одной заявки по стакану, в нем плодится целая орава неуправляемых заявок.
В логе луа есть 2017/07/05 12:39:07.178|Error |FixServer |System.InvalidOperationException: Операция является недопустимой из-за текущего состояния объекта.

Что не так?

Есть ли какие нибудь не закрытые методы для отправки собственных транзакций в квик, или все сообщение с квиком закрыто и можно пользоваться только готовыми функциями типа register,cancel итд?

зы. версия билда 4.3.24
кстати arqa недавно фиксила баг с move_orders в trans2quik, мб появились некие изменения в архитектуре и дело в этом?

Теги:


Спасибо:




1 Ответов
Slepoy

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


На каком-то этапе работы с СтокШарпом, тебе откроется одна простая истина - что всё надо переписывать под себя. Создаёшь в боте отдельную либу, в которую постепенно переписываешь все методы, которые тебе необходимы. К примеру, твой метод ReRegisterOrder(order, price, vol). На него есть исходники, которые ты просто копируешь в свою либу и правишь под свои нужды. К примеру, в твоём методе, после создания клона заявки вызывается метод ReRegisterOrder(oldOrder, order) в котором обнаружишь нижеприведённый участок, где показано как они перерегистрируют стопы:
if (oldOrder.Type == OrderTypes.Conditional)
{
this.CancelOrder(oldOrder);
this.RegisterOrder(newOrder);
}

То есть, тупо проверяют тип ордера, если он условный(т.е. стоп заявка) то просто отменяют старую и тут же регают новую. Код банален и работает. С обычными заявками, там код иной, гораздо сложнее. С простыми заявками они создают там сообщение на переристрацию и т.п. Кстати, насколько мне известно, далеко не все биржевые площадки нативно поддерживают механизм переригистрации заявок. Вот этот сложный код и не робит ))). Нужен ли тебе сложный код который не робит? Я думаю, что нет. Так делай точно также как сделано со стопами, т.е. просто выпили проверку на тип заявки, т.е. выпили блок if и введи проверку на снятие заявки:
1. Делаешь клон заявки, тупо скопируй строчку из их же метода: Order order = oldOrder.ReRegisterClone(new decimal?(price), new decimal?(volume));
2. Снимаешь старую заявку: this.CancelOrder(oldOrder);
3. Тут нужна проверка, о том что заявка снята, т.е. нужно подписаться на событие снятия и проверить снят ордер или нет
4. Если проверка прошла успешно, то регаешь новый ордер: this.RegisterOrder(newOrder);


Тут четыре строки кода и это будет работать. Да, желательно всё это дело обезопасить в конструкции try-catch, но это необязательно. Всё будет робить и так. Вот такие дела. По-другому тут не выжить, ибо разработчики постоянно видоизменяют API и с каждым новым релизом API, у твоего бота будет что-то отваливаться. Надо всё переписывать под себя, ковыряясь в их исходинках ты сразу поймёшь насколько их код избыточен, запутан и сложен. Там такие цепочки связей и зависимостей, что мозг закипает. Неудивительно, что они раз за разом попадают на баги ))). Сами виноваты, правда расплачиваемся за это мы - простые пользователи.
Спасибо:


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

loading
clippy