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

 
Да и так нормально:
#ifdef __MQL5__
  #define MACRO unsigned\
int
#endif

Даже Стилизатор понимает, что #define не нужно трогать

Было:

void OnStart()
{
        if(1);
#define MACRO1 unsigned\
int
else
   ;
}

Стало:

void OnStart()
{
   if(1);
#define MACRO1 unsigned\
int
   else
      ;
}
 

Большая просьба к разработчикам.
В тестере на графике Balance/Equity очень не хватает самой цены тестируемого периода, синхронизированной по трейдам.
Было бы очень полезно при анализе слабых и сильных мест в стратегии. Пусть будет очень бледной, едва заметной. Это ведь совсем не сложно реализовать. 
Например так:


 
44ex #:

Спасибо за ответ!

Да, я уже посмотрел файлы СБ, и в том и дело, что в CheckGroup.mqh массив m_rows 
еще при создании группы принудительно урезается до числа видимых в окне чек-боксов
(строка 106, метод CCheckGroup::Create(...) - ArrayResize(m_rows,m_total_view);,
а при скроллинге на графике в каждый момент присутствуют только объекты,
соответствующие видимым чек-боксам.
Поэтому при обращении за пределы окна гарантированно получим out of range.

Просто думал, что полностью понять их алгоритм не могу, поэтому надеялся,
что где-то моя ошибка...

Но вот воспроизвел этот эффект и в советнике Controls.mq5 из раздела примеров
в стандартной поставке терминала, из папки:
...\MQL5\Experts\Examples\Controls

Там если во включаемом файле ControlsDialog.mqh в методе CControlsDialog::CreateCheckGroup(void)
дополнить код, и создать не 5, а 8 чек-боксов
и затем выбрать програмно шестой, то после компиляции - тот же out of range

Выходит, все же баг?
Что печально...

Для приватного m_total_view нет метода, возвращающего его значение. Значит, нужно либо исправлять сам класс в СБ (и делать это с каждым обновлением терминала), либо скопировать класс себе под другим именем и там поправить - сделать контроль видимых чекбоксов при попытке поставить галку на невидимом

 
44ex #:
Столкнулся с непонятной особенностью CChekGroup.

Если создать группу чек-боксов, например, из 20 items,
которая не помещается целиком в окошко на панели CAppDialog,
то естественным образом возникает полоса прокрутки,
и все корректно работает при действиях мышкой.

Однако если програмно поставить галку в боксе, который
находится за пределами окна, то это вызывает ошибку на этапе исполнения:

array out of range in 'CheckGroup.mqh' (222,17)

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

m_check_group.Check(i,1<<i); где i - номер бокса

Подскажите, плиз, в чем может быть дело?

Можете предоставить минимальный код, воспроизводящий описанный баг? Чтобы можно было скомпилировать и запустить.

 
Я предполагаю, что в коде Dialog.mqh есть ошибка. Проблема была описана здесь https://www.mql5.com/en/forum/449129
Dialog takes always close event
Dialog takes always close event
  • 2023.06.16
  • www.mql5.com
Hi, the minimal example shown here is an AppDialog with a Button which should create a separate Dialog with a second Button...
 
A100 #:

А что мешает...

A100 #:
Да и так нормально:

Я вел речь не про обходные костыли, а про появление дополнительных потенциальных ошибок практически на ровном месте (нет примера пользы).

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 3550: улучшения и исправления

Slava, 2023.02.15 09:10

Не все фичи C++ реализованы. Некоторые реализованы с ошибкой.

Но в данном случае, с высоты 30-летнего опыта программирования на C++, я бы сказал: "не надо так делать". Это - путь к трудноуловимым ошибкам.



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

 
fxsaber #:

Я вел речь не про обходные костыли, а про появление дополнительных потенциальных ошибок практически на ровном месте (нет примера пользы).

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

Польза очевидна: 99% пользователей изучивших Документацию MQL (а не только избранный круг посвященных), а также все пользователи C\C++ будут одинаково понимать совместимый код

Польза многократна: код написанный C\C++ в будет работать и в MQL и наоборот

У меня нет требования, чтобы все возможности C++ были реализованы в MQL, но те, которые реализованы, а тем более описаны в MQL Документации - должны работать без ошибок

Если Вы считаете, что ошибки нет, то докажите это конкретным примером, а не общими рассуждениями

Действую не по стандартам чужого языка, а строго по Документации MQL: разбиваю длинный макрос обратным слешем на несколько строк - как это указано в Документации именно MQL: Если запись директивы получается слишком большой, то её можно разбить на несколько строк с помощью обратного слеша '\', в таком случае следующая строка будет считаться продолжением записи директивы.

#define MACRO qwertyuiop    asdfghjkl       zxcvbnm
#define MACRO qwertyuiop\    asdfg\hjkl       zxcvbnm

Результат:

#define MACRO qwertyuiop\
    asdfg\
hjkl       zxcvbnm

Что может быть проще для понимания?

Это не компилятор делает - это Вы сами должны разбить длинный макрос на несколько строк

Действуйте строго по Документации и тогда не будет никаких, даже потенциальных ошибок

 
Artyom Trishkin #:

Можете предоставить минимальный код, воспроизводящий описанный баг? Чтобы можно было скомпилировать и запустить.

Проще всего из моего предыдущего поста - файлы Controls.mq5 и включаемый в него ControlsDialog.mqh 
уже находятся на вашем компе, в папке терминала
...\MQL5\Experts\Examples\Controls

Открыть ControlsDialog.mqh и в строке 355 в операторе for заменить 5 на 8
и после оператора for добавить 2 строки:

//--- fill out with strings
   for(int i=0;i<8;i++)         // строка 355
      if(!m_check_group.AddItem("Item "+IntegerToString(i),1<<i))
         return(false);
   m_check_group.Check(0,1<<0); // ставит галку в первом видимом чек-боксе
   m_check_group.Check(6,1<<6); // !!! вызывает out of range
//--- succeed

Скомпилировать Controls.mq5 и кинуть на график.

И еще, самое важное в исправлении этого бага - не просто избежать попадания на невидимый бокс,
а чтобы галки без проблем програмно ставились в невидимых боксах!

Только тогда панель будет работать функционально полно:

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

То есть должна быть возможность програмно ставить галки в скролируемых списках на всю глубину. 

А иначе можно обойтись без панели, просто входными параметрами.

 
A100 #:

Действую не по стандартам чужого языка, а строго по Документации MQL: разбиваю длинный макрос обратным слешем на несколько строк - как это указано в Документации именно MQL: Если запись директивы получается слишком большой, то её можно разбить на несколько строк с помощью обратного слеша '\', в таком случае следующая строка будет считаться продолжением записи директивы.

Использую обратный слеш повсеместно (пример). Опыт есть, так сказать.


Сейчас можно взять любой чужой макрос, скопировать его и сдвинуть на любое количество пробелов. И его суть не изменится.

Вы же предлагаете ради "совместимости" с говно-практиками кодинга изменить это поведение. Когда скопировал макрос, разместил его, как удобно согласно своему стилю, а он перестал работать. И создал трудноуловимую ошибку, который найти крайне сложно.


В общем, вижу в этом больше вреда, чем пользы. Больше не вижу смысла говорить по этой теме.

 
fxsaber #:

Использую обратный слеш повсеместно (пример). Опыт есть, так сказать.


Сейчас можно взять любой чужой макрос, скопировать его и сдвинуть на любое количество пробелов. И его суть не изменится.

Вы же предлагаете ради "совместимости" с говно-практиками кодинга изменить это поведение. Когда скопировал макрос, разместил его, как удобно согласно своему стилю, а он перестал работать. И создал трудноуловимую ошибку, который найти крайне сложно.


В общем, вижу в этом больше вреда, чем пользы. Больше не вижу смысла говорить по этой теме.

А не нужно бездумно сдвигать. В Python например каждый сдвиг - смысловой и может кардинально изменить выполнение программы. Наверное не дураки это придумали, и с MQL его интегрировали