Ошибки, баги, вопросы - страница 2016

 
fxsaber:


return(prev_calculated + CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer) + Replace(Buffer));

Таких конструкций нужно избегать.  Порядок выполнения операндов в C++ не регламентирован, поэтому всё на усмотрение конкретного компилятора.  Исключение - операторы && и ||, где операнды всегда выполняются слева направо.

 
Alexey Navoykov:

Таких конструкций нужно избегать.  Порядок выполнения операндов в C++ не регламентирован, поэтому всё на усмотрение конкретного компилятора.  Исключение - операторы && и ||, где операнды всегда выполняются слева направо.

Ну так мы же в MQL!

 
fxsaber:

Ну так мы же в MQL!

В документации нигде не сказано о каком-то конкретном порядке. Поэтому они могут его поменять по собственному усмотрению в любой момент.

Я уже однажды обращался в сервис-деск для прояснения этого вопроса.

 

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

Списки наложенных объектов - Дополнительные возможности - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
Списки наложенных объектов - Дополнительные возможности - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
  • www.metatrader5.com
У каждого графика можно посмотреть списки наложенных объектов: индикаторов, аналитических объектов и советников. Там же можно можно редактировать их свойства и удалять их с графика. Список индикаторов Индикаторы сгруппированы на наложенные на основное окно графика и на те, что открыты в отдельных окнах. Выберите индикатор и нажмите "Свойства...
 
Aleksandr Teleguz:

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

IndicatorParameters (+ IndicatorRelease)

Документация по MQL5: Доступ к таймсериям и индикаторам / IndicatorParameters
Документация по MQL5: Доступ к таймсериям и индикаторам / IndicatorParameters
  • www.mql5.com
//| Script program start function                                    |                          +                                    p,                                                                        parameters[p].integer_value,                                    parameters[p].double_value...
 
Alexey Navoykov:

В документации нигде не сказано о каком-то конкретном порядке. Поэтому они могут его поменять по собственному усмотрению в любой момент.

Не заморачиваюсь по этому поводу. Очень многое там не описано

Навскиду

  • Сортировка торговых исторических записей по времени в MT4/5.
  • Возможность инициализации глобальной/статической переменной функцией - относительно недавно появилась.
  • Задание препроцессорных директив в одну строку - скоро отключат, правда.
  • Выполнение операндов слева направо.
  • OrderSend в 99% случаев синхронизирован с торговым окружением.
  • ChartApplyTemplate асинхронен.
  • и очень много всяких других  недокументированных нюансов. А ведь есть еще случаи, когда документация не соответствует реальности. И это не баг, а редка фича, о которой просто не упоминается.

Прецедент был - отказ от кастинга, но там причина была.

Поэтому что-то не использовать лишь потому, что не описано - сомнительное решение.


Думаю, такой код не вызвал бы у программеров сомнений

int Replace( double &Array[], int );

return(prev_calculated + Replace(Buffer, CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer)));

Однако, это как-то некрасиво. Логично писать MyCopyBuffer, но доходчиво показать в коротком коде, что это нужно для обхода бага - опять же некрасиво. Поэтому использование недокументированного приоритета выполнения операндов - самое то, чтобы показать, что это временное решение.

 
Alexey Navoykov:

Порядок выполнения операндов в C++ не регламентирован, поэтому всё на усмотрение конкретного компилятора.

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

#ifdef __MQL__
class A { public:
        A *operator +( A* ) { return NULL; }
};
template<typename T>
T f( int i ) { Print( __FUNCTION__, ":", i ); return NULL; }
void OnStart()
{
        int i = f<int>(1) + f<int>(2) + f<int>(3); //слева направо 1-2-3
        A  *a = f<A* >(1) + f<A* >(2) + f<A* >(3); //справа налево 3-2-1
}

#endif

Если его строго регламентировать - то в одном из 2-х случаев будет потеряна эффективность
 
A100:

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

Если его строго регламентировать - то в одном из 2-х случаев будет потеряна эффективность

Отличный пример!

Не могу понять, почему при выполнении возникает ошибка "invalid pointer access". Вроде, все чисто должно быть. Win7x64.

 
fxsaber:

Не могу понять, почему при выполнении возникает ошибка "invalid pointer access". Вроде, все чисто должно быть. Win7x64.

32bit рулит. Для 64bit нужны лишние телодвижения:

class A { public:
        A *operator +( A *a ) { return a; }
};
static A a;
int f( int i ) { Print( __FUNCTION__, ":", i ); return 0;  }
A  *g( int i ) { Print( __FUNCTION__, ":", i ); return &a; }
void OnStart()
{
        int i = f(1) + f(2) + f(3); //слева направо 1-2-3
        A  *a = g(1) + g(2) + g(3); //справа налево 3-2-1
}
 
A100:

32bit рулит. Для 64 - нужны лишние телодвижения 

Похоже, оптимизатор мудрствует.