Использование индикатора рассчитанного на другом символе в советнике mql4

 

Если рассчитывать индикатор на одном символе, а торговать на его основе на другом инструменте, то на сколько корректно будет все работать? Какие нужны проверки? 

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


И еще вопрос, в мкл5 можно контролировать, если данные индикатора не скопировались в буффер, а как быть в мкл4 ?

 
forexman77:

Если рассчитывать индикатор на одном символе, а торговать на его основе на другом инструменте, то на сколько корректно будет все работать? Какие нужны проверки? 

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

И еще вопрос, в мкл5 можно контролировать, если данные индикатора не скопировались в буффер, а как быть в мкл4 ?

с другим символом надо пробовать в тестере или демо. В мкл4 есть функция iCustom

 
forexman77:

Если рассчитывать индикатор на одном символе, а торговать на его основе на другом инструменте, то на сколько корректно будет все работать? Какие нужны проверки? 

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

И еще вопрос, в мкл5 можно контролировать, если данные индикатора не скопировались в буффер, а как быть в мкл4 ?

Возможность контроля есть везде, но этот контроль вошёл в моду только с появлением мкл5

В четвёртом мало кто проверял данные, да и редко вообще об этом задумывались. В пятом сделано ударение в документации на проверку данных, вот её и начали использовать повсеместно. Если не проверяли в четвёрке, то можете не проверять и в пятёрке, ну а если нужна проверка в четвёрке, то можете её делать, просто получать и сравнивать значения в буферах индикатора.

 
forexman77:

Если рассчитывать индикатор на одном символе, а торговать на его основе на другом инструменте, то на сколько корректно будет все работать? Какие нужны проверки? 

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


И еще вопрос, в мкл5 можно контролировать, если данные индикатора не скопировались в буффер, а как быть в мкл4 ?


В начале OnCalculate надо делать ArrayCopySeries() и проверять ошибку 4066. Как только копирование произойдет без ошибки, то делать полный перерасчет индикатора.

Так же и в советнике, в начала OnStart() вызывать ArrayCopySeries() и проверять ошибку 4066, если есть ошибка, то return.

Дополнительно модно вызывать iClose() и проверять на 0 (на случай, если символ еще ни разу не открывался) и еще количество баров - iBars() проверять, чтобы хоть какое -то количество было. Это тоже на случай ,если символ не открывался, потому-что бывало, что данные еще не качаются Их нет вообще, и ошибки 4066 тоже нет.

 
STARIJ:

с другим символом надо пробовать в тестере или демо. В мкл4 есть функция iCustom


Vitaly Muzichenko:

Возможность контроля есть везде, но этот контроль вошёл в моду только с появлением мкл5

В четвёртом мало кто проверял данные, да и редко вообще об этом задумывались. В пятом сделано ударение в документации на проверку данных, вот её и начали использовать повсеместно. Если не проверяли в четвёрке, то можете не проверять и в пятёрке, ну а если нужна проверка в четвёрке, то можете её делать, просто получать и сравнивать значения в буферах индикатора.


Dmitry Fedoseev:

В начале OnCalculate надо делать ArrayCopySeries() и проверять ошибку 4066. Как только копирование произойдет без ошибки, то делать полный перерасчет индикатора.

Так же и в советнике, в начала OnStart() вызывать ArrayCopySeries() и проверять ошибку 4066, если есть ошибка, то return.

Дополнительно модно вызывать iClose() и проверять на 0 (на случай, если символ еще ни разу не открывался) и еще количество баров - iBars() проверять, чтобы хоть какое -то количество было. Это тоже на случай ,если символ не открывался, потому-что бывало, что данные еще не качаются Их нет вообще, и ошибки 4066 тоже нет.


Спасибо! 

 

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

 
Dmitry Fedoseev:

В начале OnCalculate надо делать ArrayCopySeries() и проверять ошибку 4066. Как только копирование произойдет без ошибки, то делать полный перерасчет индикатора.

Так же и в советнике, в начала OnStart() вызывать ArrayCopySeries() и проверять ошибку 4066, если есть ошибка, то return.

Дополнительно модно вызывать iClose() и проверять на 0 (на случай, если символ еще ни разу не открывался) и еще количество баров - iBars() проверять, чтобы хоть какое -то количество было. Это тоже на случай ,если символ не открывался, потому-что бывало, что данные еще не качаются Их нет вообще, и ошибки 4066 тоже нет.


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

В справке по "ArrayCopySeries": Реального распределения памяти под массив данных и копирования не происходит. При обращении к такому массиву производится перенаправление доступа. Исключение составляют массивы, назначенные в качестве индексных в пользовательских индикаторах. В этом случае производится реальное копирование данных.

То есть, если правильно понимаю, то увеличение расхода памяти будет, если в копируемом массиве используются функции "ArrayMaximum" и "ArrayMinimum"?

 
forexman77:

1. Еще хочу уточнить один момент. Если в индикаторе используются индикаторы из стандартной поставки, то нужно ли еще, что-то дополнительно проверять, может там какие есть свои особенности?

2. В справке по "ArrayCopySeries": Реального распределения памяти под массив данных и копирования не происходит. При обращении к такому массиву производится перенаправление доступа. Исключение составляют массивы, назначенные в качестве индексных в пользовательских индикаторах. В этом случае производится реальное копирование данных.

3. То есть, если правильно понимаю, то увеличение расхода памяти будет, если в копируемом массиве используются функции "ArrayMaximum" и "ArrayMinimum"?


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

Допустим советник вызывает индикатор с другого символа. Если в советнике вызвали ArrayCopySeries(), получили ошибку 4066, значит данные грузятся, значит завершаем работу OnStart() вызовом return. Поскольку идет загрузка данных, терминал в индикаторе обнуляет переменную prev_calculated или функция IndicatorCounted() возвращает 0 и от этого индикатор пересчитывается заново. Поэтому, как в советнике перестали получать ошибку 4066, это значит что и индикаторы пересчитаны по свежим данным.

2. Эти данные вообще не нужны, функция  ArrayCopySeries() вызывается только для того, чтобы проверить, есть ошибка или нет.

3. Эти функции вообще память не используют, разве что по одной переменной.

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