Обновление платформы MetaTrader 4 build 670: виртуальный хостинг, web-запросы и работа с сигналами из MQL-программ - страница 40
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Я потому и спрашиваю, что у меня учет ордеров идет списком. Иногда получается так, что ордера закрываются и сразу появляется сигнал на открытие ордера, советник начинает просчитывать стратегию отталкиваясь от ордеров в списке, но там их уже нет, а следующий анализ списка происходит на следующем тике, в результате получаем ошибку.
На каждом тике делать анализ всего списка ордеров тоже накладно, т.к. в отличие от массивов список хоть и легче в обработке (не нужно постоянно проводить операции с выделением памяти под массив и т.д., в списке элемент просто удаляется без перезаписи всего списка), но не хотелось бы лишним анализом списка грузить стратегию советника.
Видимо пока остается только способ анализа состояния цены по отношению к уровням S/L или T/P.
Иногда получается так,
1 что ордера закрываются
2 и сразу появляется сигнал на открытие ордера,
ВОТ тут в начале алгоритма который должен открывать - и анализируйте - до открытия/закрытия нового ордера
и тогда не надо на каждом тике анализировать
3 советник начинает просчитывать стратегию отталкиваясь от ордеров в списке,
4 но там их уже нет,
Очень жаль что в мт4 нет события OnTrade()
Иногда получается так,
1 что ордера закрываются
2 и сразу появляется сигнал на открытие ордера,
ВОТ тут в начале алгоритма который должен открывать - и анализируйте - до открытия/закрытия нового ордера
и тогда не надо на каждом тике анализировать
3 советник начинает просчитывать стратегию отталкиваясь от ордеров в списке,
4 но там их уже нет,
Очень жаль что в мт4 нет события OnTrade()
Данный анализ является все таки затратной операцией, поэтому остановлюсь на анализе цены по отношению к уровням и в случае прохода уровней производить анализ списка. Так менее затратно будет. MetaQuotes наверное специально не дают возможности МТ5 по OpenCL и облачным технологиям при оптимизации.
Правильнее - при изменении кол-ва ордеров в истории проверять.
Вот когда-то давно статью писал про это - События в МetaТrader 4
Правильнее - при изменении кол-ва ордеров в истории проверять.
Вот когда-то давно статью писал про это - События в МetaТrader 4
У меня примерно по такому же принципу все учитывается и отслеживается только списком. Но если мы на одном тике будет по несколько раз делать данный анализ, то получим минимум из следующих затратных операций:
- запрос на сервер списка ордеров (истории ордеров)
- обработка данного списка - фильтрация
А если стратегия построена на основе уровней S/L и (или) T/P, то ведь и так понятно, что если цена не дошла до этих уровней, то и количество ордеров не уменьшилось. При условии ручного (в нарушении торговой стратегии или по иным причинам) закрытия ордеров, достаточно одного анализа на каждое направление (Buy/Sell) за один тик.
Вот поэтому и плохо, что в MQL4 нет возможности отслеживания событий как в MQL5. И именно поэтому приходится извращаться :) приделывая костыли.
У меня примерно по такому же принципу все учитывается и отслеживается только списком. Но если мы на одном тике будет по несколько раз делать данный анализ, то получим минимум из следующих затратных операций:
- запрос на сервер списка ордеров (истории ордеров)
- обработка данного списка - фильтрация
Думаю, Вы слишком преувеличиваете затратность этих операций. К примеру, для получения списка ордеров никакого обращения к серверу не происходит, т. к. этот список уже есть в самом терминале. Обработка списка - это более быстрая операция, чем расчет МАшки или подобного индикатора.
А если стратегия построена на основе уровней S/L и (или) T/P, то ведь и так понятно, что если цена не дошла до этих уровней, то и количество ордеров не уменьшилось. При условии ручного (в нарушении торговой стратегии или по иным причинам) закрытия ордеров, достаточно одного анализа на каждое направление (Buy/Sell) за один тик.
А если кто-то (другая программа или трейдер) закрыл эти ордера по рынку? Такой вариант тоже стоит учитывать, не смотря на то, что стратегия построена именно на достижении SL/TP. В жизни ведь всякое бывает.
Думаю, Вы слишком преувеличиваете затратность этих операций. К примеру, для получения списка ордеров никакого обращения к серверу не происходит, т. к. этот список уже есть в самом терминале. Обработка списка - это более быстрая операция, чем расчет МАшки или подобного индикатора.
А если кто-то (другая программа или трейдер) закрыл эти ордера по рынку? Такой вариант тоже стоит учитывать, не смотря на то, что стратегия построена именно на достижении SL/TP. В жизни ведь всякое бывает.
Как раз при оптимизации скажется затратность нескольких пересчетов на каждом тике. Я уже практически сравнивал и поэтому задал вопрос по отлову события.
По поводу ручного закрытия на оптимизации ни как сказывается т.к. событие на каждом тике один раз отлавливается путем как раз проверки списка ордеров в списке программы и списка ордеров на сервере. Во время оптимизации невозможно закрыть ордера по рынку вручную. Я имею в виду именно оптимизацию, а не тестирование.
А насчет того, что список истории ордеров находится в терминале я не совсем понял, где находится и чем его вызвать?
Как раз при оптимизации скажется затратность нескольких пересчетов на каждом тике. Я уже практически сравнивал и поэтому задал вопрос по отлову события.
По поводу ручного закрытия на оптимизации ни как сказывается т.к. событие на каждом тике один раз отлавливается путем как раз проверки списка ордеров в списке программы и списка ордеров на сервере. Во время оптимизации невозможно закрыть ордера по рынку вручную. Я имею в виду именно оптимизацию, а не тестирование.
А насчет того, что список истории ордеров находится в терминале я не совсем понял, где находится и чем его вызвать?
К серверу обращаются только торговые функции.
OrdersTotal(), OrdersHistoryTotal() - возвращают списки ордеров и позиций.
К серверу обращаются только торговые функции.
OrdersTotal(), OrdersHistoryTotal() - возвращают списки ордеров и позиций.
По крайней мере размерность массива и какое значение принимает элемент массива, выходящий за допустимые пределы.
Дебагировать эту ошибку очень тяжело, она появляется лишь в процессе работы Советника.
Как раз при оптимизации скажется затратность нескольких пересчетов на каждом тике. Я уже практически сравнивал и поэтому задал вопрос по отлову события.
По поводу ручного закрытия на оптимизации ни как сказывается т.к. событие на каждом тике один раз отлавливается путем как раз проверки списка ордеров в списке программы и списка ордеров на сервере. Во время оптимизации невозможно закрыть ордера по рынку вручную. Я имею в виду именно оптимизацию, а не тестирование.
А насчет того, что список истории ордеров находится в терминале я не совсем понял, где находится и чем его вызвать?
С какой целью на каждом тике необходимо производить несколько расчетов списка ордеров? Вполне достаточно ограничиться одним расчетом на тик. Более того, для оптимизации и тестирования можно сделать алгоритмическую вилку, сократив потребности до минимума.