Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
В сервисе Фриланс выполнено тысячи оплачиваемых заказов. Присоединяйся!
AndriusS
76
AndriusS 2013.05.21 20:12 

   Здравствуйте,

   Я обнаружил скрытую ошибку в функции iMAOnArray(). Ниже привожу код, позволяющий проявить эту проблему:

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   double dataArray[10], subDataArray[6];
   ArraySetAsSeries(dataArray,    TRUE);
   ArraySetAsSeries(subDataArray, TRUE);
   
   // Initialize dataArray
   for (int i = 0; i < 10; i++) dataArray[i] = i;
   
   ArrayCopy(subDataArray, dataArray, 0, 0, 6);
   Print("Should be equal to 3: ", iMAOnArray(subDataArray, WHOLE_ARRAY, 3, 0, MODE_SMA, 2));
   
   ArrayCopy(subDataArray, dataArray, 0, 1, 6);
   Print("Should be equal to 4: ", iMAOnArray(subDataArray, WHOLE_ARRAY, 3, 0, MODE_SMA, 2));

//----
   return(0);
  }
//+------------------------------------------------------------------+

   Повторный вызов функции ArrayCopy() копирует передвинутый массив. Поэтому, арифметичкское среднее должно равняться 4.0, но вышеприведенный код выдаёт вот такой результат:

   22:09:33 Test EURUSD,M1: Should be equal to 3: 3

   22:09:33 Test EURUSD,M1: Should be equal to 4: 3

   Надеюсь, что представители MetaQuotes увидят этот мой пост и выправят эту проблему в следующем MT4 билде.


   Andrius_S

Файлы:
test.mq4 2 kb
Vadim Zhunko
5218
Vadim Zhunko 2013.05.21 21:08  

Так работает правильно:

int start()
 {
  double dataArray[10], subDataArray[6];
  ArraySetAsSeries(dataArray,    TRUE);
  ArraySetAsSeries(subDataArray, TRUE);
  
  // Initialize dataArray
  for (int i = 0; i < 10; i++) dataArray[i] = i;
  
  ArrayCopy(subDataArray, dataArray, 0, 0, 6);
//  for (i = 0; i < 10; i++) Alert(subDataArray[i]);
  Alert("Should be equal to 3: ", iMAOnArray(subDataArray, WHOLE_ARRAY, 3, 0, MODE_SMA, 2));
  
//  ArrayInitialize(subDataArray, 0);
  ArrayCopy(subDataArray, dataArray, 0, 1, 6);
  for (i = 0; i < 10; i++) Alert(subDataArray[i]);
  Alert("Should be equal to 4: ", iMAOnArray(subDataArray, WHOLE_ARRAY, 3, 0, MODE_SMA, 2));
 }

Это баг. Требуется предварительное обращение к массиву, чтобы работало правильно. Что-то с инициализацией напутали.

Хотя, припоминаю, что и раньше с этим сталкивался. Тогда всё переделал, чтобы на необъяснимые явления не нарываться.

AndriusS
76
AndriusS 2013.05.22 08:50  

Это баг. Требуется предварительное обращение к массиву, чтобы работало правильно. Что-то с инициализацией напутали.

Хотя, припоминаю, что и раньше с этим сталкивался. Тогда всё переделал, чтобы на необъяснимые явления не нарываться.

    Да, я тоже заметил, что предварительное обращение к массиву нейтрализует этот баг MQL-компилятора. Поэтому, я после каждого вызова (в вышеприведенном коде достаточно только после второго вызова) функции ArrayCopy() "профилактически" вставляю строку с таким кодом:

subDataArray[0] = subDataArray[0];


   Andrius_S

AndriusS
76
AndriusS 2014.08.28 22:37  

    Здравствуйте,

    После долгой паузы опять возобновляю эту тему... До недавнего времени ещё существовал способ (см. предыдущий пост) избежать этого бага, но теперь, с нынешными билдами MQL-компилятора, он уже не работает. Я подозреваю, из-за чего получается этот баг: MetaQuotes чересчур перестаралась оптимизировать подсчёт индикаторов и тем самым не пренебрегли полностью все случаи, когда пересчёт значений буффера является обязательным. Может быть, кто-нибудь из Вас подскажет способ, как заставить функцию iMAOnArray() полностью заново подсчитать МА значение? Неужели придётся самому написать код альтернативной функции iMAOnArray()?

    P.S.: Жаль, что никто из представителей или разработчиков MetaQuotes не обратили внимания на этот баг. Может быть, есть какой-нибудь прямой контакт для информирования об ошибках MQL-компилятора?

Vitalie Postolache
10989
Vitalie Postolache 2014.08.28 22:56  
Andrius_S:


    Здравствуйте,

    После долгой паузы опять возобновляю эту тему... До недавнего времени ещё существовал способ (см. предыдущий пост) избежать этого бага, но теперь, с нынешными билдами MQL-компилятора, он уже не работает. Я подозреваю, из-за чего получается этот баг: MetaQuotes чересчур перестаралась оптимизировать подсчёт индикаторов и тем самым не пренебрегли полностью все случаи, когда пересчёт значений буффера является обязательным. Может быть, кто-нибудь из Вас подскажет способ, как заставить функцию iMAOnArray() полностью заново подсчитать МА значение? Неужели придётся самому написать код альтернативной функции iMAOnArray()?

    P.S.: Жаль, что никто из представителей или разработчиков MetaQuotes не обратили внимания на этот баг. Может быть, есть какой-нибудь прямой контакт для информирования об ошибках MQL-компилятора?


Конечно есть - Сервисдеск на пятом форуме, доступен в профиле пользователя.
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий