Обновление платформы MetaTrader 4 build 670: виртуальный хостинг, web-запросы и работа с сигналами из MQL-программ - страница 40

 
_Konstantin_:

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

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

Видимо пока остается только способ анализа состояния цены по отношению к уровням S/L или T/P.


Иногда получается так,

1 что ордера закрываются

2 и сразу появляется сигнал на открытие ордера, 

    ВОТ тут в начале  алгоритма который должен открывать - и анализируйте - до открытия/закрытия  нового ордера

     и тогда не надо на каждом тике анализировать

3 советник начинает просчитывать стратегию отталкиваясь от ордеров в списке,

4 но там их уже нет,

       Очень жаль что в мт4 нет события OnTrade()

 
YuraZ:

Иногда получается так,

1 что ордера закрываются

2 и сразу появляется сигнал на открытие ордера, 

    ВОТ тут в начале  алгоритма который должен открывать - и анализируйте - до открытия/закрытия  нового ордера

     и тогда не надо на каждом тике анализировать

3 советник начинает просчитывать стратегию отталкиваясь от ордеров в списке,

4 но там их уже нет,

       Очень жаль что в мт4 нет события OnTrade()


Данный анализ является все таки затратной операцией, поэтому остановлюсь на анализе цены по отношению к уровням и в случае прохода уровней производить анализ списка. Так менее затратно будет. MetaQuotes наверное специально не дают возможности МТ5 по OpenCL и облачным технологиям при оптимизации.
 
_Konstantin_:
Данный анализ является все таки затратной операцией, поэтому остановлюсь на анализе цены по отношению к уровням и в случае прохода уровней производить анализ списка. Так менее затратно будет. MetaQuotes наверное специально не дают возможности МТ5 по OpenCL и облачным технологиям при оптимизации.

Правильнее - при изменении кол-ва ордеров в истории проверять.

Вот когда-то давно статью писал про это - События в МetaТrader 4

 
komposter:

Правильнее - при изменении кол-ва ордеров в истории проверять.

Вот когда-то давно статью писал про это - События в МetaТrader 4

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

- запрос на сервер списка ордеров (истории ордеров)

- обработка данного списка - фильтрация

А если стратегия построена на основе уровней S/L и (или) T/P, то ведь и так понятно, что если цена не дошла до этих уровней, то и количество ордеров не уменьшилось. При условии ручного (в нарушении торговой стратегии или по иным причинам) закрытия ордеров, достаточно одного анализа на каждое направление (Buy/Sell) за один тик.

Вот поэтому и плохо, что в MQL4 нет возможности отслеживания событий как в MQL5. И именно поэтому приходится извращаться :) приделывая костыли.

 
_Konstantin_:

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

- запрос на сервер списка ордеров (истории ордеров)

- обработка данного списка - фильтрация

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

А если стратегия построена на основе уровней S/L и (или) T/P, то ведь и так понятно, что если цена не дошла до этих уровней, то и количество ордеров не уменьшилось. При условии ручного (в нарушении торговой стратегии или по иным причинам) закрытия ордеров, достаточно одного анализа на каждое направление (Buy/Sell) за один тик.

А если кто-то (другая программа или трейдер) закрыл эти ордера по рынку? Такой вариант тоже стоит учитывать, не смотря на то, что стратегия построена именно на достижении SL/TP. В жизни ведь всякое бывает.

 
Scriptong:

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

А если кто-то (другая программа или трейдер) закрыл эти ордера по рынку? Такой вариант тоже стоит учитывать, не смотря на то, что стратегия построена именно на достижении SL/TP. В жизни ведь всякое бывает.

Как раз при оптимизации скажется затратность нескольких пересчетов на каждом тике. Я уже практически сравнивал и поэтому задал вопрос по отлову события.

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

А насчет того, что список истории ордеров находится в терминале я не совсем понял, где находится и чем его вызвать?

 
_Konstantin_:

Как раз при оптимизации скажется затратность нескольких пересчетов на каждом тике. Я уже практически сравнивал и поэтому задал вопрос по отлову события.

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

А насчет того, что список истории ордеров находится в терминале я не совсем понял, где находится и чем его вызвать?

К серверу обращаются только торговые функции.

OrdersTotal(), OrdersHistoryTotal() - возвращают списки ордеров и позиций.

 
artmedia70:

К серверу обращаются только торговые функции.

OrdersTotal(), OrdersHistoryTotal() - возвращают списки ордеров и позиций.


Это я знаю, а какими функциями MQL4 можно еще вытащить список ордеров и истории ордеров не обращаясь при этом к серверу?
 
Пожалуйста предоставьте пользователям больше информации когда возникает ошибка:

array out of range in 'FILE_NAME.mq4' (350,87)

По крайней мере размерность массива и какое значение принимает элемент массива, выходящий за допустимые пределы.
Дебагировать эту ошибку очень тяжело, она появляется лишь в процессе работы Советника.
 
_Konstantin_:

Как раз при оптимизации скажется затратность нескольких пересчетов на каждом тике. Я уже практически сравнивал и поэтому задал вопрос по отлову события.

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

А насчет того, что список истории ордеров находится в терминале я не совсем понял, где находится и чем его вызвать?


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