Please consider which section is most appropriate — https://www.mql5.com/en/forum/172166/page6#comment_49114893
I have created a logging file, called logging.mqh. Along with the class logic, I have also added the following code...
The 2 reasons for doing this are...
- So I can compile the file stand alone without errors.
- I don't have to create the input type for each new EA that wants to use the logging code.
I #include this file into my EA, and when I run the EA I set the log level and everything works as expected.
I also have a custom indicator that includes the logging file.
I call my custom indicator from the EA using iCustom() and pass in the Logging_Level as a parameter.
If I run the EA and change the logging level to Info, the logging level is set correctly for the EA, but the logging level for the custom indicator is still set to the default level of Warn. I thought that passing in the logging level parameter would override (initialize) the default logging level in the custom indicator in the same way that it does when starting the EA and use the value passed to the indicator, but this is not the case.
I could move the input variable into the EA itself, or I could also use a global variable for passing the logging level around, but before I go down that route, is there another simple solution that I may be overlooking?
Here is a snippet of the EA...
#include <Logging.mqh> int OnInit() { LogError(StringFormat("EA Log Level: %s", EnumToString(Logging_Level))); }
Here is a snippet of the indicator...
#include <Logging.mqh> int OnInit() { LogError(StringFormat("Indicator Log Level: %s", EnumToString(Logging_Level))); }
And here is the call to the custom indicator from the EA...
int handle = iCustom(symbol, PERIOD_M1, "IndicatorTest", Logging_Level);
As you can see, both files are identical (apart from the text message), and they both include the logging class that contains the input statement.
It may be that this will not genuinely work, but I thought that it would!
Here is a snippet of the EA...
Here is a snippet of the indicator...
And here is the call to the custom indicator from the EA...
As you can see, both files are identical (apart from the text message), and they both include the logging class that contains the input statement.
It may be that this will not genuinely work, but I thought that it would!
Here is a snippet of the EA...
Here is a snippet of the indicator...
And here is the call to the custom indicator from the EA...
As you can see, both files are identical (apart from the text message), and they both include the logging class that contains the input statement.
It may be that this will not genuinely work, but I thought that it would!
I have created the following demo project.
EA code
#property strict #include "Logging.mqh" int OnInit() { PrintFormat("EA Log Level: %s", EnumToString(Logging_Level)); if (iCustom(_Symbol, PERIOD_M1, "Indicator", Logging_Level) == INVALID_HANDLE) { Print("Failed to load indicator"); } return (GetLastError()); } void OnDeinit(const int reason) { }
Indicator code
#property indicator_chart_window #property indicator_buffers 0 #property indicator_plots 0 #include "Logging.mqh" int OnInit() { PrintFormat("Indicator Log Level: %s", EnumToString(Logging_Level)); return (GetLastError()); } void OnDeinit(const int reason) { } int OnCalculate (const int rates_total, // size of price[] array const int prev_calculated, // number of bars, calculated at previous call const int begin, // data begin index const double& price[]) // array for calculation { return (rates_total); }
Shared logging code
enum LogLevel { Error, Warn, Info }; input group "Debugging Options" input LogLevel Logging_Level = Warn;
When I run the ea and change the logging level to Info, the ea shows the correct logging level, but the indicator does not. See following output:
2024.01.23 09:33:08.318 EA (GBPUSD,H1) EA Log Level: Info 2024.01.23 09:33:08.332 Indicator (GBPUSD,M1) Indicator Log Level: Warn
I have created the following demo project.
EA code
Indicator code
Shared logging code
When I run the ea and change the logging level to Info, the ea shows the correct logging level, but the indicator does not. See following output:
OK, I have now got to the bottom of the issue, and unless told otherwise, I'll assume this is a bug. The cause of the problem is the following...
input group "Debugging Options"
If I remove the input group then it works as expected. So it would appear that the group is also being passed as a parameter (I have proved this!).
I have checked the documentation and I can't see anything in there relating to the use of group with an indicator.
Note: This only affects indicators and not expert advisors!
Can anyone please confirm that this is indeed an issue (I am using MT5 V5.00 build 4150).
I have created the following demo project.
EA code
#property strict #include "Logging.mqh"
Indicator code
#property indicator_chart_window #property indicator_buffers 0 #property indicator_plots 0 #include "Logging.mqh"
Shared logging code
When I run the ea and change the logging level to Info, the ea shows the correct logging level, but the indicator does not. See following output:
Why are you using 2 copies of the include file?
The quotes indicate that this file should be taken from the same folder where the advisor/indicator is located.
If both the advisor and the indicator are compiled, this means that you have 2 copies of the header file. One copy is located in the same folder where the advisor is, and the second copy is located in the same folder where the indicator.
Including Files (#include)
If the file name is enclosed in quotation marks, the search is made in the current directory (which contains the main source file). The standard directory is not included in the search.
Use angle brackets to include the same header file in both the expert and the indicator
Including Files (#include)
The preprocessor replaces the line #include <file_name> with the content of the file file_name.mqh. Angle brackets indicate that the file_name.mqh file will be taken from the standard directory (usually it is terminal_installation_directory\MQL5\Include). The current directory is not included in the search.
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
I have created a logging file, called logging.mqh. Along with the class logic, I have also added the following code...
The 2 reasons for doing this are...
I #include this file into my EA, and when I run the EA I set the log level and everything works as expected.
I also have a custom indicator that includes the logging file.
I call my custom indicator from the EA using iCustom() and pass in the Logging_Level as a parameter.
If I run the EA and change the logging level to Info, the logging level is set correctly for the EA, but the logging level for the custom indicator is still set to the default level of Warn. I thought that passing in the logging level parameter would override (initialize) the default logging level in the custom indicator in the same way that it does when starting the EA and use the value passed to the indicator, but this is not the case.
I could move the input variable into the EA itself, or I could also use a global variable for passing the logging level around, but before I go down that route, is there another simple solution that I may be overlooking?