Организация цикла перебора ордеров - страница 2

 
Andrey Khatimlianskii:

Потому что цена будет двигаться, и на каждом новом вызове ОнТик будет выполняться условие для новой модификации все того же, первого в списке, ордера. Особенно, если модификация будет длиться 5 секунд ;)

Опять же затрагивается вопрос актуальности. Один ордер будет всегда в актуальном состоянии. Остальные - по возможности. Ваш же вариант - все ордера не в актуальном состоянии.

Такой "костяк" сломает логику советника, работающего с более чем одним ордером.

Какой в нем смысл, если он не даст ни каких преимуществ для систем с одним ордером и испортит остальные?

Рад бы понять, что имеете в виду, но не получается. Не вижу проблемы в принципе "если прошло время ожидания, обнови торговое окружение".

Сортировка по объему и/или отдаленности от цены перед работой с ордерами — правильное решение. Но не нужно подразумевать, что все, кто скопирует код с форума, будут ее реализовывать.
В этом смысле мой код безопаснее.

Ну не для новичков же было написано. Мы с Вами очень хорошо это здесь обсуждаем - без воды.

 
fxsaber:

Опять же затрагивается вопрос актуальности. Один ордер будет всегда в актуальном состоянии. Остальные - по возможности. Ваш же вариант - все ордера не в актуальном состоянии.

Актуальном — на сколько?

  • Открыто 2 покупки, бид 1.2345, СЛ обоих на 1.2344
  • Следующий тик: бид 1.2350, СЛ первого ордера переносится на 1.2349, второй остается на 1.2344
  • Не дожидаясь тика: бид уже 1.2375, СЛ первого ордера переносится на 1.2374, второй все там же
  • Еще один шажок: бид 1.2376, СЛ первого ордера переносится на 1.2375, второй стоит на месте
  • Цена возвращается на 1.2300, срабатывает СЛ обоих (1.2374 и 1.2344) [для простоты расчетов представим, что цена дошла до 1.2300 не скачком (тогда оба стопа проскользили бы до этого уровня), а шла постепенно, но наш советник был занят модификацией и не успел в этот момент ничего сделать].
  • Итог: +30 пунктов по первому ордеру и +0 по второму
В моем варианте оба СЛ были бы модифицированы на 1.2375 или, в худшем случае, на 1.2374. Итог: +30 пунктов по обоим ордерам.


fxsaber:

Рад бы понять, что имеете в виду, но не получается. Не вижу проблемы в принципе "если прошло время ожидания, обнови торговое окружение".

Ваш алгоритм зациклен на первом в списке ордере, вот и все.

В некоторых ситуациях это может быть губительным для системы (я встретился с этим на практике).

 
Andrey Khatimlianskii:

Актуальном — на сколько?

  • Открыто 2 покупки, бид 1.2345, СЛ обоих на 1.2344
  • Следующий тик: бид 1.2350, СЛ первого ордера переносится на 1.2349, второй остается на 1.2344
  • Не дожидаясь тика: бид уже 1.2375, СЛ первого ордера переносится на 1.2374, второй все там же
  • Еще один шажок: бид 1.2376, СЛ первого ордера переносится на 1.2375, второй стоит на месте
  • Цена возвращается на 1.2300, срабатывает СЛ обоих (1.2374 и 1.2344) [для простоты расчетов представим, что цена дошла до 1.2300 не скачком (тогда оба стопа проскользили бы до этого уровня), а шла постепенно, но наш советник был занят модификацией и не успел в этот момент ничего сделать].
  • Итог: +30 пунктов по первому ордеру и +0 по второму

В моем варианте оба СЛ были бы модифицированы на 1.2375 или, в худшем случае, на 1.2374. Итог: +30 пунктов по обоим ордерам.

На каждом шаге в Вашем примере ТС должна знать, где должны быть ее ордера без какого-либо торгового приказа. Т.е. ТС вообще никак не может быть привязана к тому, где там сейчас стоят ордера. Она занимается только вычислением, где они должны стоять, а также синхронизацией торгового окружения с тем, что насчитала, через торговые приказы.


В Вашем же примере результат ТС зависит от того, пришел ли OnTick на High-цене или нет. А правильной ТС должно быть ровно до этого. Она видит, что такая цена была (даже если OnTick с ней был пропущен), а значит соответствующим образом должны размещаться ее СЛ. И синхронизация сделает свое дело на 100%.

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

 
fxsaber:

На каждом шаге в Вашем примере ТС должна знать, где должны быть ее ордера без какого-либо торгового приказа. Т.е. ТС вообще никак не может быть привязана к тому, где там сейчас стоят ордера. Она занимается только вычислением, где они должны стоять, а также синхронизацией торгового окружения с тем, что насчитала, через торговые приказы.

Так и есть, она знает. Но синхронизировать не успевает — пока проходит одна модификация, цена уходит дальше, и новое просчитанное состояние говорит ей модифицировать опять первый ордер. И так все время.


fxsaber:

В Вашем же примере результат ТС зависит от того, пришел ли OnTick на High-цене или нет. А правильной ТС должно быть ровно до этого. Она видит, что такая цена была (даже если OnTick с ней был пропущен), а значит соответствующим образом должны размещаться ее СЛ. И синхронизация сделает свое дело на 100%.

Не зависит (в примере расчетов уровня СЛ не было).

А синхронизация дело не сделает, т.к. не успеет (см. выше).


fxsaber:

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

Как обычная, я это понял.

Но, пока шла модификация, цена уже изменилась, и принудительный вызов ОнТик уже работает с новой ценой, а второй ордер так и остается на начальном уровне.

Ошибки нет. Возможно, слишком специфическая для вас (но, повторюсь, вполне реальная, из жизни) ситуация.

 
Andrey Khatimlianskii:

Так и есть, она знает. Но синхронизировать не успевает — пока проходит одна модификация, цена уходит дальше, и новое просчитанное состояние говорит ей модифицировать опять первый ордер. И так все время.

Придуманный Вами пример только доп. убытка не приносит при такой логике. Теперь с меня пример.


Пусть мы трейлим BuyLimit-ы за движением вверх, чтобы открыться на нужном откате. Почти Lucky-ТС. Если мы будем тащить гору лимитников каждый раз, мы не поймаем откат при Вашем варианте.


Ну странно отдавать торговые приказы на основе устаревшего торгового окружения. Но Вы упорно (как и я) отстаиваете иную точку зрения.

 
fxsaber:

Ну странно отдавать торговые приказы на основе устаревшего торгового окружения. Но Вы упорно (как и я) отстаиваете иную точку зрения.

Приходится выбирать из двух зол меньшее.

Пример с лимитом, тянущимся за ценой, конечно, лучше реализовывать в варианте "1 советник = 1 ордер в каждом направлении".

Но в общем случае правильнее держать под контролем все свои ордера.

 
Andrey Khatimlianskii:

Но в общем случае правильнее держать под контролем все свои ордера.

Т.е. Вы не согласны с требованием для ТС работать только с актуальным торговым окружением.

 
fxsaber:

Т.е. Вы не согласны с требованием для ТС работать только с актуальным торговым окружением.

Если для этого придется пожертвовать контролем за всеми ордерами ТС — безусловно.

Представьте: у вас авто-парк из 4 грузовиков. Каждый из них везет ценный груз из точки А в точку Б. Вам нужно проконтролировать маршрут.
Что вы предпочтете: иметь связь каждую минуту - с одним из них, или раз в 2 минуты - со всеми?

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

 
Andrey Khatimlianskii:

Если для этого придется пожертвовать контролем за всеми ордерами ТС — безусловно.

Представьте: у вас авто-парк из 4 грузовиков. Каждый из них везет ценный груз из точки А в точку Б. Вам нужно проконтролировать маршрут.
Что вы предпочтете: иметь связь каждую минуту - с одним из них, или раз в 2 минуты - со всеми?

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

+1.

Возможно новая идея не возникла бы при ООП подходе, когда аналог цикла с перебором ордеров скрыт в какой-то сущности типа менеджера, который вместо непосредственного вызова OrderModify формирует команду на модификацию (со всеми параметрами) и помещает её в очередь, которая затем обрабатывается. Суть в том, чтобы разделить ответственность (которая в приведенном коде запихнута в единый цикл) между неким объектом анализа окружения и объектом выполнения действий на основе анализа.

 
Stanislav Korotky:

Возможно данная идея не возникла бы при ООП подходе, когда аналог цикла с перебором ордеров скрыт в какой-то сущности типа менеджера, который вместо непосредственного вызова OrderModify формирует команду на модификацию (со всеми параметрами) и помещает её в очередь, которая затем обрабатывается. Суть в том, чтобы разделить ответственность (которая в приведенном коде запихнута в единый цикл) между неким объектом анализа окружения и объектом выполнения действий на основе анализа.

Избежать такой ситуации получилось бы только с помощью асинхронных приказов.

Иначе все равно будет цикл по списку команд, которые нужно выполнить, а это, по сути, и есть цикл по ордерам.

Только в ситуации с очередью еще нужно было бы предусмотреть вытеснение более старого неисполненного приказа, относящегося к ордеру, более новым. Иначе очередь могла бы переполниться, а приказы из нее отправляться - устаревшие.

Причина обращения: