Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Изменил
Теперь без алертов.
Ответ напрашивается сам - если Ticket == PrevTicket ---> return WRONG_VALUE.
Если функция вернула значение меньше ноля, значит нужно её ещё раз вызвать.
Ответ напрашивается сам - если Ticket == PrevTicket ---> return WRONG_VALUE.
Так это решение частной случая проблемы, который описал для наглядности в виде равенства соседних тикетов.
Проблема, на самом деле, все та же - перетряхивание индексации во время цикла. Это может привести к ситуации, когда какой-то тикет будет пропущен или тикет через одного повторится и т.д.
Альтернативу IsChange не нашел.
Так это решение частной случая проблемы, который описал для наглядности в виде равенства соседних тикетов.
Проблема, на самом деле, все та же - перетряхивание индексации во время цикла. Это может привести к ситуации, когда какой-то тикет будет пропущен или тикет через одного повторится и т.д.
Альтернативу IsChange не нашел.
Создаём в таймере список и работаем с ним.
Создаём в таймере список и работаем с ним.
Лучше кодом.
Лучше кодом.
Кодом показать очень сложно - там целая библиотека взаимосвязанных классов.
Смысл такой - в таймере проходим по всем ордерам и позициям на счёте и заполняем список CArrayObj. Постоянно его обновляем для получения актуальной информации за один проход.
При необходимости закрытия позиций или удаления ордеров, получаем этот список и выбираем из него нужные объекты-ордера, и их тикеты, нужные для функций закрытия (модификации). При физическом отсутствии этого объекта-ордера (закрыт или удалён за время этих действий), просто уходим на следующий по списку, так как этот уже закрыт, и на следующей итерации таймера список уже будет обновлён. Первое, что приходит в голову из возможных проблем - неактуальность полученного списка при изменении торгового окружения за время выполнения действий с полученным списком. Но, как мне видится, что физическое отсутствие ордера, записанного в списке, не должно сильно напрягать - просто получаем ошибку и идём к следующему по списку - этот список-то не тасуется как в торговом окружении, и пропуск невозможен - лишь констатация факта отсутствия ордера, соответствующего записи в списке.
Это мне пока так представляется, так как ещё не реализовывал сиё в коде. Как раз подбираюсь к реализации, но изначально необходимо доделать некоторые иные классы (вопрос по замене функций задавал в ветке особенностей). Когда начну реализацию - там будут видны возможные проблемы, и буду решать методы их решения и устранения.
Ответ напрашивается сам - если Ticket == PrevTicket ---> return WRONG_VALUE.
Если функция вернула значение меньше ноля, значит нужно её ещё раз вызвать.
Абсолютно ничего делать не надо. Достаточно пройти по логике с видом идиота.
1. Имеем 6 ордеров
Начинаем перебирать ордера для, скажем модификации,
Выбрали 5 тикет 105, проверили надо-ли модифицировать, модифицировали.
В это время шаловливые ручки удалили ордер 2 тикет 102 и список изменился. Теперь ордер с тикетом 105 стал в списке четвёртым, 4. И опять получается выбран для модификации. Но ведь без проверки не работаем... проверили надо-ли модифицировать, НО!!! НЕ надо... и что??? Кому стало плохо от того что ордер выбран повторно?
Кодом показать очень сложно - там целая библиотека взаимосвязанных классов.
Смысл такой - в таймере проходим по всем ордерам и позициям на счёте и заполняем список CArrayObj. Постоянно его обновляем для получения актуальной информации за один проход.
При необходимости закрытия позиций или удаления ордеров, получаем этот список и выбираем из него нужные объекты-ордера, и их тикеты, нужные для функций закрытия (модификации). При физическом отсутствии этого объекта-ордера (закрыт или удалён за время этих действий), просто уходим на следующий по списку, так как этот уже закрыт, и на следующей итерации таймера список уже будет обновлён. Первое, что приходит в голову из возможных проблем - неактуальность полученного списка при изменении торгового окружения за время выполнения действий с полученным списком. Но, как мне видится, что физическое отсутствие ордера, записанного в списке, не должно сильно напрягать - просто получаем ошибку и идём к следующему по списку - этот список-то не тасуется как в торговом окружении, и пропуск невозможен - лишь констатация факта отсутствия ордера, соответствующего записи в списке.
Это мне пока так представляется, так как ещё не реализовывал сиё в коде. Как раз подбираюсь к реализации, но изначально необходимо доделать некоторые иные классы (вопрос по замене функций задавал в ветке особенностей). Когда начну реализацию - там будут видны возможные проблемы, и буду решать методы их решения и устранения.
Вот реализация этого
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Организация цикла перебора ордеров
fxsaber, 2017.09.11 20:29
После отправки торгового приказа меняется торговое окружение, поэтому желательно сразу после ответа торгового сервера выполнять с нуля всю торговую логику ТС.
Только она все равно требует IsChange. Таймер - это совсем не вариант. Даже Sleep(1) портит всю картину.
Абсолютно ничего делать не надо. Достаточно пройти по логике с видом идиота.
Таки да, не проблема если проверяется закрытие/активация ордера.
Ну и если свой массив тикетов, то ордер просто пропустится.
пс. подкину еще один случай - если отложка установлена на стоп реального ордера (для переворота), то при срабатывании стопа, отложка, может задержаться в открытии на неопределенное время. То есть один ордер сработает по рынку, а второй будет висеть какое-то количество тиков...
Вот реализация этого
Только она все равно требует IsChange. Таймер - это совсем не вариант. Даже Sleep(1) портит всю картину.
IsChange() как раз и реализован в таймере (пока не доделанная тестовая версия):
В управляющем классе можно поймать изменение либо по числу, возвращаемому из Refresh() обоих классов (в тестере):
либо в пользовательском событии, которые ещё не реализованы (демо, реал).
IsChange() как раз и реализован в таймере (пока не доделанная тестовая версия):
Для чего, если IsChange - это пять строк?