One way to do it is to read iCustom once per bar, example :
static datetime mybarcheck = EMPTY_VALUE;
if(Time[0]!=mybarcheck)
{
//read i custom here, and use value
mybarcheck = Time[0];
}
Other way is to read indicator at every X tick, code is similar.
Next one is to check iCustom on every new minute. For that purpose you can use Minute() function instead of Time[0] variable, and code is the same.
But the best option is to ask author of the indicator to fix lagging indicator and make it work faster :)
Thanks Bart. I will speak with the author.
I am looking to use PipFinite's Trend Laser indicator. This indicator has multiple buffers. Reading them one by one is so slow that I can only test one day's data in 8 hours!
Is there a way to read all the buffers into some sort of an array and then process that array instead of calling iCustom multiple times?
Short answer : No.
Only if you have the source code you can implement some other ways. But usually it's not needed, and the indicator just need to be improved as Bartlomiej said.
Array pointer via iCustom() parameters???? Since when????
One cannot define arrays as input parameters for an Indicator. The only time, this rule can be "broken" in iCustom() is only in MQL5 when you pass a handle to another indicator for the OnCalulation() event handler for Applied Price instead of OHLC values.
At least since 2006 and build 225. Just because there is no such command or official documentation doesn't mean it's not possible. Just look into the old DLL source code distributed by Metaquotes to get a glimpse of how to get an array pointer. And I never said to pass arrays as input parameters. Just read carefully.
The last parameter to my iCustom() calls is always an array pointer.
See also https://github.com/rosasurfer/mt4-expander/blob/master/header/struct/xtrade/ExecutionContext.h
OK! So it apparently can be done (on MT4), but I would not recommend anyone use it and even less for a newbie like the OP.
It is unorthodox, undocumented, requires DLL calls, requires altering the Custom Indicator as well, and offers no guarantee of it working in the future.
It will also not work on the MQL Virtual Hosting nor will it work for Market products!
Yes, it's a possible solution, but only for a very "niche" and sophisticated requirement for advanced coders.
OK! So it apparently can be done (on MT4), but I would not recommend anyone use it and even less for a newbie like the OP.
It is unorthodox, undocumented, requires DLL calls, requires altering the Custom Indicator as well, and offers no guarantee of it working in the future.
It will also not work on the MQL Virtual Hosting nor will it work for Market products!
Yes, it's a possible solution, but only for a very "niche" and sophisticated requirement for advanced coders.
When it comes to MT4, there was even an article about passing arrays between indicators.
As a partial workaround for MT5 one could mention the second variant of OnCalculate handler:
int OnCalculate(const int rates_total, // size of the price[] array const int prev_calculated, // bars handled on a previous call const int begin, // where the significant data start from const double& data[] // array to calculate );
An indicator with such handler can be applied on another indicator and receive its buffer's elements as entire array in the data parameter.
Actually, I did touch that subject but only briefly:
Forum on trading, automated trading systems and testing trading strategies
Can you read all buffers instead of reading them one by one using iCustom() ?
Fernando Carreiro, 2017.09.22 20:32
Array pointer via iCustom() parameters???? Since when????
One cannot define arrays as input parameters for an Indicator. The only time, this rule can be "broken" in iCustom() is only in MQL5 when you pass a handle to another indicator for the OnCalulation() event handler for Applied Price instead of OHLC values.
Actually, I did touch that subject but only briefly:
Sorry, I don't understand this wording: "pass a handle to another indicator for the OnCalulation() event handler for Applied Price instead of OHLC values". Where and how to pass a handle? How do you obtain the handle?
It is the exact same thing that you just expressed in your own post except done in code instead of visually on the chart.
I've never used it myself, but there was a thread recently discussing it. I will try doing a search to see if I can find it and reference it here.
EDIT: Here is the quote from the documentation:
To receive values of a custom indicator from other mql5 programs, the iCustom() function is used, which returns the indicator handle for subsequent operations. You can also specify the appropriate price[] array or the handle of another indicator. This parameter should be transmitted last in the list of input variables of the custom indicator.
When you call a custom indicator from mql5-program,
the Applied_Price parameter or a handle of another indicator should be
passed last, after all input variables of the custom indicator.
// Instead of an Applied Price, you can pass an Indicator Handle! int handle_customMA=iCustom(Symbol(),PERIOD_CURRENT, "Custom Moving Average", 13, 0, MODE_EMA, PRICE_TYPICAL);
- 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 am looking to use PipFinite's Trend Laser indicator. This indicator has multiple buffers. Reading them one by one is so slow that I can only test one day's data in 8 hours!
Is there a way to read all the buffers into some sort of an array and then process that array instead of calling iCustom multiple times?