Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2050

 
Alexandr Nikolaev #:

Подскажите пожалуйста, почему возникает такая ошибка? Если это ошибка в mql, как им сообщить об этом?

Для начала проверить, что возвращает ArrayResize().

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

 
Alexandr Nikolaev #:

Подскажите пожалуйста, почему возникает такая ошибка? Если это ошибка в mql, как им сообщить об этом?

1) укажите верную серийность массива (ArraySetAsSeries()) ДО вызова iMaOnArray

2) проверяйте параметры iMaOnArray чтобы точно не выходить за границы массива (у вас сейчас выход за границы массива)

 
JRandomTrader #:

Для начала проверить, что возвращает ArrayResize().

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

Возвращает -1, а если закомментировать строку нижу с iMAOnArray, возвращает 10. И вот это не понятно, какая связь между увеличением массива, и операцией iMAOnArray, которая следует после этого? Это не противоречит логике и всё должно отрабатывать без ошибок!

Массив как раз таки дальше используется, но выдает такую ошибку, а если не используется, отрабатывает нормально.

 
Maxim Kuznetsov #:

1) укажите верную серийность массива (ArraySetAsSeries()) ДО вызова iMaOnArray

2) проверяйте параметры iMaOnArray чтобы точно не выходить за границы массива (у вас сейчас выход за границы массива)

1) Это никак не влияет. Работать должно не зависимо от направления серийности. Вот цитата из описания функции iMaOnArray: "Расчет производится слева направо. Для организации доступа к элементам массива, как к таймсерии (то есть справа налево), необходимо использовать функцию ArraySetAsSeries()." - то есть так и так должно работать.

2) В каком месте выходит? Размер массива задаю 10, в функции период задан 5, сдвиг 0. Или я чего то не понимаю? Да и проблема то не в этой самой функции вылазит. А проблема в том, что размер массива, которая в ней используется, не изменить до этой функции, а если убрать эту операцию, размер массива прекрасно задается. Вопрос, что не так? Как сделать правильно тогда?

 
Alexandr Nikolaev #:

1) Это никак не влияет. Работать должно не зависимо от направления серийности. Вот цитата из описания функции iMaOnArray: "Расчет производится слева направо. Для организации доступа к элементам массива, как к таймсерии (то есть справа налево), необходимо использовать функцию ArraySetAsSeries()." - то есть так и так должно работать.

2) В каком месте выходит? Размер массива задаю 10, в функции период задан 5, сдвиг 0. Или я чего то не понимаю? Да и проблема то не в этой самой функции вылазит. А проблема в том, что размер массива, которая в ней используется, не изменить до этой функции, а если убрать эту операцию, размер массива прекрасно задается. Вопрос, что не так? Как сделать правильно тогда?

Не забывайте, что для правильного расчёта МА необходим запас данных перед необходимыми данными. Т.е., если хотите рассчитать МА на промежутке 10 баров, а период МА равен, например 5, то для расчёта требуется 15 баров. И это для разных МА по-разному - для каждого типа МА необходимо своё количество предварительно рассчитанных баров.

 
Alexandr Nikolaev #:

Возвращает -1, а если закомментировать строку нижу с iMAOnArray, возвращает 10. И вот это не понятно, какая связь между увеличением массива, и операцией iMAOnArray, которая следует после этого? Это не противоречит логике и всё должно отрабатывать без ошибок!

Массив как раз таки дальше используется, но выдает такую ошибку, а если не используется, отрабатывает нормально.

Приведённый код выполняется один раз, или таки несколько проходов? Если несколько - возможен вариант, что не первый вызов ArrayResize(), а следующий, уже после iMAOnArray() и, возможно, после ещё чего-то, возвращает ошибку (-1), а там уже и цикл за границу вылетает.

 
Alexandr Nikolaev #:

1) Это никак не влияет. Работать должно не зависимо от направления серийности. Вот цитата из описания функции iMaOnArray: "Расчет производится слева направо. Для организации доступа к элементам массива, как к таймсерии (то есть справа налево), необходимо использовать функцию ArraySetAsSeries()." - то есть так и так должно работать.

2) В каком месте выходит? Размер массива задаю 10, в функции период задан 5, сдвиг 0. Или я чего то не понимаю? Да и проблема то не в этой самой функции вылазит. А проблема в том, что размер массива, которая в ней используется, не изменить до этой функции, а если убрать эту операцию, размер массива прекрасно задается. Вопрос, что не так? Как сделать правильно тогда?

Внимательно и спокойно читаем документацию и думаем. 

"Расчет производится слева направо. Для организации доступа к элементам массива, как к таймсерии (то есть справа налево), необходимо использовать функцию ArraySetAsSeries()."

какие элементы массива должны быть прочитаны чтобы посчитать 5-ти периодную SMA со cдвигом 0 ? -4 -3 -2 -1 и 0 , всё что с минусом - это выход за границу массива

 
Artyom Trishkin #:

Не забывайте, что для правильного расчёта МА необходим запас данных перед необходимыми данными. Т.е., если хотите рассчитать МА на промежутке 10 баров, а период МА равен, например 5, то для расчёта требуется 15 баров. И это для разных МА по-разному - для каждого типа МА необходимо своё количество предварительно рассчитанных баров.

Понимаю. Тут расчет идет Простого усреднения SMA, для этого другие данные не нужны. Но я всё же проверил вашу теорию, и задал увеличение массива до 1000000 - ничего не изменилось, это не помогает.

Я всё же склоняюсь, что проблема в самом mql, а не в логике.

 
JRandomTrader #:

Приведённый код выполняется один раз, или таки несколько проходов? Если несколько - возможен вариант, что не первый вызов ArrayResize(), а следующий, уже после iMAOnArray() и, возможно, после ещё чего-то, возвращает ошибку (-1), а там уже и цикл за границу вылетает.

Этот код выполняется в скрипте один раз, и ошибка возникает сразу же. Можете попробовать у себя, и увидите проблему, которую я озвучил.

 
Maxim Kuznetsov #:

Внимательно и спокойно читаем документацию и думаем. 

"Расчет производится слева направо. Для организации доступа к элементам массива, как к таймсерии (то есть справа налево), необходимо использовать функцию ArraySetAsSeries()."

какие элементы массива должны быть прочитаны чтобы посчитать 5-ти периодную SMA со cдвигом 0 ? -4 -3 -2 -1 и 0 , всё что с минусом - это выход за границу массива

Читаем внимательно, обычно расчет производится слева направо, но если нам нужно справа налево, меняем направление индексации с помощью функции ArraySetAsSeries(), то есть функция работает в любом направлении индексации. И я проверял это на практике, так и есть. Проблема не в этом.

Обнаружил ещё один момент, если массив объявить глобальным, ошибка пропадает, если в блоке функции, как выше, то ошибка появляется. Ошибка точно не в логике. Ошибка в mql.

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