Logo

Вход

Войти с помощью соц. сетей
X
 
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения
ТОП СООБЩЕНИЙ
14.04.2020, 13:51
Лучший ответ
Выплачено: 37168 RUB
Сообщение от MonyaMaker Посмотреть сообщение
(Array,0,15,0,MODE_EMA,0);
int total, // количество элементов
Что написал, то и вывело.
0 - означает все и не имеет отношение к этому. Вывод был до этой строки, Print находится во второй строке, а iMAOnArray в третьей, посмотрите внимательней. В этом странность.
Сообщение от ir0407 Посмотреть сообщение
1. Скорее с ArraySize(). Используй ArrayRange().
2. Период для iMAOnArray не должен быть больше размера массива. Иначе получишь шопопало.
Вы не обратили внимание, что Print, который выводит кол-во элементов массива, стоит до iMAOnArray. И получается iMAOnArray влияет на массив раньше, нежели он его получает в обработку. Я говорю именно об этом.
14.04.2020, 14:01
Лучший ответ
Выплачено: 182669 RUB
Сообщение от LionFx Посмотреть сообщение
Вы не обратили внимание, что Print, который выводит кол-во элементов массива, стоит до iMAOnArray.
Обратил. Потому и отписал. Ты все ж попробуй мой совет. И про результат отпиши.
14.04.2020, 14:06
Лучший ответ
Выплачено: 37168 RUB
Сообщение от ir0407 Посмотреть сообщение
Обратил. Потому и отписал. Ты все ж попробуй мой совет. И про результат отпиши.
Нет, не работает. Я изначально естественно не на этом коде заметил, а на другом, где период меньше массива.
Сейчас, специально еще проверил, с массивом 10 элементов, и периодом 3, чтобы наверняка убедиться. Не работает.
14.04.2020, 14:41
Лучший ответ
Выплачено: 182669 RUB
Сообщение от LionFx Посмотреть сообщение
Нет, не работает.
Прикольно однако... Тоже проверил скриптом - не работает. Причем даже с динамическим массивом не работает. Потом вынес объявление массива на глобальный уровень скрипта - заработало. И со статическим и с динамическим массивом заработало. Видать что-то там запереоптимизировали при создании переменных на стеке, что в рантайме такие глюки вылазят.
14.04.2020, 15:50
Лучший ответ
Выплачено: 37168 RUB
Сообщение от ir0407 Посмотреть сообщение
Видать что-то там запереоптимизировали при создании переменных на стеке, что в рантайме такие глюки вылазят.
Скорее всего, для одного и того же исходного массива функция iMAOnArray не пересчитывает все данные каждый раз при вызове (при условии одинаковых настроек), а считает только новые данные. Поэтому создается от этого исходного массива, что-то вроде ссылки на такой-же массив, но с уже посчитанными данными (предположение). И iMAOnArray использует его в дальнейшем. При объявлении массива на глобальном уровне, все в порядке. А иначе исходный массив то на каждом тике пересоздается. И тут именно глюк компилятора похоже.
14.04.2020, 16:47
Лучший ответ
Выплачено: 69915 RUB
Сообщение от LionFx Посмотреть сообщение
0 - означает все и не имеет отношение к этому. Вывод был до этой строки, Print находится во второй строке, а iMAOnArray в третьей, посмотрите внимательней. В этом странность.


Вы не обратили внимание, что Print, который выводит кол-во элементов массива, стоит до iMAOnArray. И получается iMAOnArray влияет на массив раньше, нежели он его получает в обработку. Я говорю именно об этом.
Ты его так определи, а потом зачистишь.
Код:
static double Arr[3] = {1.0, 2.5, 3.0};
Черкни им в сервисдеск, может ответят чего по этому поводу.
  • #1 Свернуть

    iMAOnArray странности в работе

    Либо я заработался, либо что-то случилось с iMAOnArray.

    Имеем такой простенький код (специально для примера):
    MQL код:

    double Array[3] = {1.0, 2.5, 3.0};
    Print(ArraySize(Array));

    Print выводит размер массива равный 3. Все верно.

    Далее делаем так (добавляем строку после Print):
    MQL код:

    double Array[3] = {1.0, 2.5, 3.0};
    Print(ArraySize(Array));
    double ma = iMAOnArray(Array,0,15,0,MODE_EMA,0);

    Print выводит 0. Довольно странно..
  • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
  • #2 Свернуть

    Сообщение от LionFx Посмотреть сообщение
    Либо я заработался, либо что-то случилось с iMAOnArray.

    Имеем такой простенький код (специально для примера):
    MQL код:

    double Array[3] = {1.0, 2.5, 3.0};
    Print(ArraySize(Array));

    Print выводит размер массива равный 3. Все верно.

    Далее делаем так (добавляем строку после Print):
    MQL код:

    double Array[3] = {1.0, 2.5, 3.0};
    Print(ArraySize(Array));
    double ma = iMAOnArray(Array,0,15,0,MODE_EMA,0);

    Print выводит 0. Довольно странно..
    Код:
       double  iMAOnArray( 
       double       array[],          // массив 
       int          total,            // количество элементов 
       int          ma_period,        // период 
       int          ma_shift,         // сдвиг средней 
       int          ma_method,        // метод усреднения 
       int          shift             // сдвиг 
       );
    (Array,0,15,0,MODE_EMA,0);
    int total, // количество элементов

    Что написал, то и вывело.
    Последний раз редактировалось MonyaMaker; 14.04.2020, 13:17.

    Комментарий

    • #3 Свернуть

      Сообщение от LionFx Посмотреть сообщение
      Либо я заработался, либо что-то случилось с iMAOnArray.
      1. Скорее с ArraySize(). Используй ArrayRange().
      2. Период для iMAOnArray не должен быть больше размера массива. Иначе получишь шопопало.

      Комментарий

      • #4 Свернуть

        Сообщение от MonyaMaker Посмотреть сообщение
        (Array,0,15,0,MODE_EMA,0);
        int total, // количество элементов
        Что написал, то и вывело.
        0 - означает все и не имеет отношение к этому. Вывод был до этой строки, Print находится во второй строке, а iMAOnArray в третьей, посмотрите внимательней. В этом странность.
        Сообщение от ir0407 Посмотреть сообщение
        1. Скорее с ArraySize(). Используй ArrayRange().
        2. Период для iMAOnArray не должен быть больше размера массива. Иначе получишь шопопало.
        Вы не обратили внимание, что Print, который выводит кол-во элементов массива, стоит до iMAOnArray. И получается iMAOnArray влияет на массив раньше, нежели он его получает в обработку. Я говорю именно об этом.

        Комментарий

        • #5 Свернуть

          Сообщение от LionFx Посмотреть сообщение
          Вы не обратили внимание, что Print, который выводит кол-во элементов массива, стоит до iMAOnArray.
          Обратил. Потому и отписал. Ты все ж попробуй мой совет. И про результат отпиши.

          Комментарий

          • #6 Свернуть

            Сообщение от ir0407 Посмотреть сообщение
            Обратил. Потому и отписал. Ты все ж попробуй мой совет. И про результат отпиши.
            Нет, не работает. Я изначально естественно не на этом коде заметил, а на другом, где период меньше массива.
            Сейчас, специально еще проверил, с массивом 10 элементов, и периодом 3, чтобы наверняка убедиться. Не работает.

            Комментарий

            • #7 Свернуть

              Сообщение от LionFx Посмотреть сообщение
              Нет, не работает.
              Прикольно однако... Тоже проверил скриптом - не работает. Причем даже с динамическим массивом не работает. Потом вынес объявление массива на глобальный уровень скрипта - заработало. И со статическим и с динамическим массивом заработало. Видать что-то там запереоптимизировали при создании переменных на стеке, что в рантайме такие глюки вылазят.

              Комментарий

              • #8 Свернуть

                Сообщение от ir0407 Посмотреть сообщение
                Видать что-то там запереоптимизировали при создании переменных на стеке, что в рантайме такие глюки вылазят.
                Скорее всего, для одного и того же исходного массива функция iMAOnArray не пересчитывает все данные каждый раз при вызове (при условии одинаковых настроек), а считает только новые данные. Поэтому создается от этого исходного массива, что-то вроде ссылки на такой-же массив, но с уже посчитанными данными (предположение). И iMAOnArray использует его в дальнейшем. При объявлении массива на глобальном уровне, все в порядке. А иначе исходный массив то на каждом тике пересоздается. И тут именно глюк компилятора похоже.
                Последний раз редактировалось LionFx; 14.04.2020, 15:53.

                Комментарий

                • #9 Свернуть

                  Сообщение от LionFx Посмотреть сообщение
                  0 - означает все и не имеет отношение к этому. Вывод был до этой строки, Print находится во второй строке, а iMAOnArray в третьей, посмотрите внимательней. В этом странность.


                  Вы не обратили внимание, что Print, который выводит кол-во элементов массива, стоит до iMAOnArray. И получается iMAOnArray влияет на массив раньше, нежели он его получает в обработку. Я говорю именно об этом.
                  Ты его так определи, а потом зачистишь.
                  Код:
                  static double Arr[3] = {1.0, 2.5, 3.0};
                  Черкни им в сервисдеск, может ответят чего по этому поводу.
                  Последний раз редактировалось MonyaMaker; 14.04.2020, 16:57.

                  Комментарий

                  • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
                  • #10 Свернуть

                    Сообщение от LionFx Посмотреть сообщение
                    Скорее всего, для одного и того же исходного массива функция iMAOnArray не пересчитывает все данные каждый раз при вызове (при условии одинаковых настроек), а считает только новые данные. Поэтому создается от этого исходного массива, что-то вроде ссылки на такой-же массив, но с уже посчитанными данными (предположение). И iMAOnArray использует его в дальнейшем. При объявлении массива на глобальном уровне, все в порядке. А иначе исходный массив то на каждом тике пересоздается.
                    А как же тогда с динамическим массивом? Он создается, но ему ни размер не поменять, ни значения не присвоить. Собсно и статический массив ведет себя так же. Создается, но не инициализируется. Отсюда и глюки.
                    И тут именно глюк компилятора похоже.
                    Нет. Это не глюк компилятора, а глюк исполняющей подсистемы MQL. Дело в том, что любые локальные переменные(если они не static) создаются и инициализируются исполняющей подсистемой MQL на стеке автоматом, тобишь на лету, в момент вызова функции. И вероятнее всего, что именно в этом механизме у них какая-то собака порылась. Причем есть четкая зависимость от того, как эта переменная используется в коде дальше.

                    Комментарий

                    working...
                    X