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

 

Ошибка при выполнении:

class A {
public:
        A( int ) { Print( 1 ); }
        A( A&  ) { Print( 2 ); }
};
void OnStart()
{       
        int a = 5;
        {
                A a( a );         //(1)
        }
}

  • Результат   в MQL: 2
  • Ожидалось в MQL: 1

Фактически этот пример выполняется по правилам С++

void OnStart()
{
        int a = 5;
        {
                A a( a );         //(2)
        }
}

в то время как следующий пример работает в MQL по своим (отличным от С++) правилам

void OnStart()
{       
        int a = 5;
        {
                int a = a;         //(3)
                printf( "%d", a );
        }
}

  • Результат (3) в MQL: 5
  •                      в  С++: 0 (или случайное число)

Переменная считается объявленной или

  • с момента появления (*),        или
  • с момента завершения объявления (**)

В С++ единый (*) подход, а в MQL в случае (2) так (*), а в случае(3) так (**).  А в чем принципиальная разница между (2) и (3)?

В этом и заключается вопрос почему в MQL в одном случае переменная считается объявленной с момента появления, а в другом - с момента завершения объявления? 

 

Ошибка при компиляции:

#import "z.ex5"
#import
#define MACRO1( x )    (x) //(*)
#define MACRO2( x )    MACRO1(x)
int f( int z )
{
        return MACRO2( z ); //Error: '()' - operand expected
}

а так:

#define MACRO1( x )    x  //(**)

нормально. А какая разница между (*) и (**)?

 
Fast235:

не получается загружать историю в пустой терминал или в ранее не использованный символ

запускаю на М1, все загружается, на H1 грузится ~720 баров и все, индикатор требует гораздо меньше для работы, но загрузка дальнейших баров прекращается и индикатор не отрисовывается правильно (если задать проверку на наличие примерно баров на 900, то вообще работа индикатора прекращается),

.....

прикрутил скрипт из справки https://www.mql5.com/ru/docs/series/timeseries_access, долго не хотел его использовать из-за громоздкости. Закинул в инклудник, добавил пару строк и все отлично работает,

скрипт грамотно сделан и легко интегрируется в робота, в мультивалютнике + мультитаймфреймы просто необходим! Т.к. незагрузка и зависание не зависит от рабочих индикаторов,

тоже самое можно получить даже на стандартном MA, но из-за его особенности и т.д. многие не заметят и просто сменят график или период, и потом он дозагрузится..

Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным
Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным
  • www.mql5.com
Прежде чем ценовые данные будут доступны в терминале MetaTrader 5, их необходимо получить и обработать. Для получения данных требуется подключение к торговому серверу MetaTrader 5. Данные поступают с сервера по запросу терминала в виде экономно упакованных блоков минутных баров. Механизм обращения к серверу за данными не зависит от того, каким...
 
Добрый день !  МТ5 на Android 4.4 перестал обновляться. Невозможно даже открыть приложение. Если кто сталкивался , буду благодарен за помощь. 
Спасибо! 
 
fxsaber:

Их можно получить через Expert.mqh в OnTesterInit, т.к. советник запустится во фрейм-режиме для установки параметров.

В результате вызова EXPERT::Parameters почему-то все параметры имеют тип string. Это баг или ограничение?

 
Stanislav Korotky:

В результате вызова EXPERT::Parameters почему-то все параметры имеют тип string. Это баг или ограничение?

Лучше примером.

 
Andrey:
Добрый день !  МТ5 на Android 4.4 перестал обновляться. Невозможно даже открыть приложение. Если кто сталкивался , буду благодарен за помощь. 
Спасибо! 

Минимум - Android 5, об этом недавно писали разработчики.

 
fxsaber:

Лучше примером.

Ну пример стандартный для этого метода, типа:

    EXPERT::Parameters(0, parameters, names);
    for(int i = 0; i < ArraySize(parameters); i++)
    // здесь parameters[i].type всегда равно TYPE_STRING, вне зависимости от фактического типа параметра

Это видно и по исходнику самой библиотеки Expert.mqh.

PS. Перевел обсуждение в топик библиотеки.

 

Очередной баг с ParameterGetRange/ParameterSetRange.

Вызов ParameterSetRange не меняет флаг включения параметра в оптимизацию для последующего вызова ParameterGetRange:

// параметр "name" изначально включен в оптимизацию
// в одной части кода...
ParameterSetRange("name", false, value, start, step, stop);
...
// в другой части кода финализация проверок
ParameterGetRange("name", enabled, value, start, step, stop); // получаем enabled=true, т.е. изменения внесенные ParameterSetRange не применились
 
Stanislav Korotky:

Очередной баг с ParameterGetRange/ParameterSetRange.

Вызов ParameterSetRange не меняет флаг включения параметра в оптимизацию для последующего вызова ParameterGetRange:

Помню, что когда увлекался этой темой, было много нюансов. Что-то правильно или неправильно показывало, в зависимости от OnTester*-функции. Попробуйте в разных On-функциях вызвать.

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