Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Ну и что? Осталась проблема с формированием строки.
А чем плоха условная компиляция-то ?
В зависимости от дебаг-дефайнов либо выводим сообщение, либо нет...
У меня в коде очень много макросов типа TRACE_DOUBLE5("Текущая цена: ",dCurPrice), которые разворачиваются либо в форматированный вывод значения в дебаг-версии, либо в пустое место в релиз-версии.
А чем плоха условная компиляция-то ?
В зависимости от дебаг-дефайнов либо выводим сообщение, либо нет...
У меня в коде очень много макросов типа TRACE_DOUBLE5("Текущая цена: ",dCurPrice), которые разворачиваются либо в форматированный вывод значения в дебаг-версии, либо в пустое место в релиз-версии.
Тогда уж лучше вот так
К сожалению, MQL4 позволяет задавать только 8 параметров в define, но на безрыбье и рак рыба )) Вместо неиспользуемых параметров дефайна надо что-то вставлять, например пустую строку ""
Текст формируется ДО отправки его в функцию _Print
Спасибо, Кэп )) Проблема формирования строки осталась или нет?
ОК. Разбираем ситуацию.
ТопикСтартер имеет код, в котором есть строки для печати какого-либо сообщения в Журнал
Т.е. эти строки сообщений УЖЕ сформированы в местах кода где это требуется сделать.
Наша дополнительная функция всего-лишь позволяет НЕ печатать в зависимости от выставленного флага.
Задача ведь была такая? Печатать/НеПечатать.
Не было задачи создать функцию, обрабатывающие все возможные ситуации и формирующую строку сообщения.
Тогда уж лучше вот так
К сожалению, MQL4 позволяет задавать только 8 параметров в define, но на безрыбье и рак рыба )) Вместо неиспользуемых параметров дефайна надо что-то вставлять, например пустую строку ""
Не, у меня не так.
Сперва в зависимости от дефайна происходит либо подключение DebugIncludes.mqh, либо ReleaseIncludes.mqh.
В этих файлах - описываются соответствующие макросы либо для дебаг- либо для релиз - версии.
Для релиз версии - все просто, там определения типа:
#define TRACE_DOUBLE5(strName,dValue) {};
А для дебаг:
#define TRACE_DOUBLE5(strName,dValue) PerformTrace2(strName,_EDoubleToString(dValue,5),__FUNCSIG__,__LINE__,_GetMagic());
Сама функция PerformTrace2() выполняет вывод двух строковых параметров, с указанием функции, строки и магика. Вывод - может осуществляться хоть через Print(), хоть в отдельный файл.
ОК. Разбираем ситуацию.
ТопикСтартер имеет код, в котором есть строки для печати какого-либо сообщения в Журнал
Т.е. эти строки сообщений УЖЕ сформированы в местах кода где это требуется сделать.
Наша дополнительная функция всего-лишь позволяет
НЕ печатать в зависимости от выставленного флага.
Задача ведь была такая? Печатать/НеПечатать.
Не было задачи создать функцию, обрабатывающие все возможные ситуации и формирующую строку сообщения.
Перечитал начало ветки, нигде не сказано, что надо печатать заранее подготовленные СТРОКИ сообщений. Если я пропустил это, приведите текст плз.
Задача в том, чтобы как-то отключать оператор Print, желательно средствами компилятора (это уже мое дополнение). Или сделать полноценную замену оператору Print, с его возможностями преобразования любого типа в строку, тогда легко вставить возможность разрешения/запрета печати. Рассмотрим 3 варианта, легкий, сложный и нереальный
1. Легкий. Строка формируется заранее. Не смысла вставлять в код дополнительные функции _Print, лучше использовать условную компиляцию.
2. Сложный. Можно также сделать на основе условной компиляции, но только с 8-ю аргументами, см. https://www.mql5.com/ru/forum/67363/page2#comment_2058876
3. Сложный и увы, нереальный. Сделать функцию - аналог Print. Затык в одном - в MQL4-5 невозможно передать аргумент без указания типа и потом в функции определить его тип. В некоторых языках это возможно. Например, в C# можно написать так
System.Type type = typeof(int);
Вот раздел справки, кому интересно https://msdn.microsoft.com/en-us/library/58918ffs.aspx
Не, у меня не так.
Сперва в зависимости от дефайна происходит либо подключение DebugIncludes.mqh, либо ReleaseIncludes.mqh.
В этих файлах - описываются соответствующие макросы либо для дебаг- либо для релиз - версии.
Для релиз версии - все просто, там определения типа:
#define TRACE_DOUBLE5(strName,dValue) {};
А для дебаг:
#define TRACE_DOUBLE5(strName,dValue) PerformTrace2(strName,_EDoubleToString(dValue,5),__FUNCSIG__,__LINE__,_GetMagic());
Сама функция PerformTrace2() выполняет вывод двух строковых параметров, с указанием функции, строки и магика. Вывод - может осуществляться хоть через Print(), хоть в отдельный файл.
Ну, это более продвинутый вариант, я просто на коленке код набросал. Но вопрос так и остался - в вашем случае можно вывести только строку с заранее определенными параметрами. А написать аналог полноценного Print средствами MQL невозможно.
Кстати, необязательно ставить {}; в этой строке
#define TRACE_DOUBLE5(strName,dValue) {};
>>> "При отладке советника приходится ставить много Print'ов" - т.е. сообщения сфоримрованы в коде у ТопикСтартера. Он их печатает в Журнал.
---Задача в том, чтобы как-то отключать оператор Print, желательно средствами компилятора (это уже мое дополнение).
>>> Мы не ищем лёгких путей? )))
---1. Легкий. Строка формируется заранее. Не смысла вставлять в код дополнительные функции _Print, лучше использовать условную компиляцию.
>>> Т.е. для отключения надо лазить в Эдитор??? А пользователю через флаг в настройках не проще?
2 и 3 вообще городушка на ровном месте. Зачем так усложнять?
Но вопрос так и остался - в вашем случае можно вывести только строку с заранее определенными параметрами. А написать аналог полноценного Print средствами MQL невозможно.
Да, все верно.
Но, этот когд был написан тогда, когда еще не было классов-темплейтов. Сейчас гляжу в их сторону, похоже, можно будет написать аналог Print(), где не надо будет указывать, какой тип у переменной.
С другой стороны - у меня есть макросы TRACE_DOUBLE, TRACE_DOUBLE4, TRACE_DOUBLE5 - которые используют различное округление double. Темплейт-классом уже будут сложности - скажем, если есть темплейты для string и double - то придется вещественный тип выводить полностью, без обрезки. А для округлений - пользоваться либо старыми макросами, либо дополнительно указывать величину округления (что, по сути, одно и то же)