This is the question I was asked recently: how to get data from the iBearsPower indicator?
Before showing the code, I’ll start with the main points of working with indicators in MQL5 Expert Advisors:
Step 1: at the global program level, we declare a variable - the handle of the iBearsPower indicator will be stored in this variable.
Step 2: in OnInit () we create the iBearsPower indicator and write the handle to the variable. Note: the indicator is created ONCE in OnInit ().
Step 3: in OnTick () we get data from the indicator
An example is in CodeBase in the code MySystem .
Step 1:
double ExtStopLoss=0.0; double ExtTakeProfit=0.0; int handle_iBullsPower; // variable for storing the handle of the iBullsPower indicator int handle_iBearsPower; // variable for storing the handle of the iBearsPower indicator double m_adjusted_point; // point value adjusted for 3 or 5 points //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit()
Step 2:
} //--- create handle of the indicator iBearsPower handle_iBearsPower=iBearsPower(m_symbol.Name(),Period(),Inp_ma_period); //--- if the handle is not created if(handle_iBearsPower==INVALID_HANDLE) { //--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iBearsPower indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(Period()), GetLastError()); //--- the indicator is stopped early return(INIT_FAILED); } //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason)
Step 3:
double bulls[]; ArraySetAsSeries(bulls,true); double bears[]; ArraySetAsSeries(bears,true); if(!iBullsPowerGetArray(InpBarCurrent,2,bulls) || !iBearsPowerGetArray(InpBarCurrent,2,bears)) { PrevBars=0; return; }
Function iBearsPowerGetArray: is used CopyBuffer
//+------------------------------------------------------------------+ //| Get value of buffers for the iBearsPower in the array | //+------------------------------------------------------------------+ bool iBearsPowerGetArray(const int start_pos,const int count,double &arr_buffer[]) { //--- bool result=true; if(!ArrayIsDynamic(arr_buffer)) { Print("This a no dynamic array!"); return(false); } ArrayFree(arr_buffer); int buffer_num=0; // indicator buffer number //--- reset error code ResetLastError(); //--- fill a part of the iBearsPower array with values from the indicator buffer that has 0 index int copied=CopyBuffer(handle_iBearsPower,buffer_num,start_pos,count,arr_buffer); if(copied!=count) { //--- if the copying fails, tell the error code PrintFormat("Failed to copy data from the iBearsPower indicator, error code %d",GetLastError()); //--- quit with zero result - it means that the indicator is considered as not calculated return(false); } return(result); }
How to receive data from indicators from several symbols.
Everything is very simple! First you need to specify the names of the characters in the input parameters. It remains to create handles of indicators on these symbols.
So, the Expert Advisor receives data from the current symbol and from one more symbol ( Symbol 1 ), the averaging period is set in the Bulls Power parameter:
//--- input parameters input string InpSybmol_1 = "USDJPY" ; // Symbol 1 (non-existent symbol -> parameter is disabled) input int Inp_BullsPower_ma_period = 5 ; // Bulls Power : averaging period
In the field of global program variables, we create two variables - handles of Bulls Power indicators will be stored in them:
//--- int handle_iBullsPower_current ; // variable for storing the handle of the iBullsPower indicator int handle_iBullsPower_symbol_1 ; // variable for storing the handle of the iBullsPower indicator int m_digits_symbol_1;
m_digits_symbol_1 is an auxiliary variable, it stores the number of decimal places for Symbol 1 .
Creating handles is combined with checking a symbol: if a symbol exists, then we create a handle:
//+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit () { //--- handle_iBullsPower_symbol_1= INVALID_HANDLE ; m_digits_symbol_1= 0 ; if (m_symbol.Name(InpSybmol_1)) // sets symbol name { m_digits_symbol_1=m_symbol. Digits (); CreateBullsPower(handle_iBullsPower_symbol_1,m_symbol.Name(), Period (),Inp_BullsPower_ma_period); } handle_iBullsPower_current= INVALID_HANDLE ; if (m_symbol.Name( Symbol ())) // sets symbol name CreateBullsPower(handle_iBullsPower_current,m_symbol.Name(), Period (),Inp_BullsPower_ma_period); //--- return ( INIT_SUCCEEDED ); }
Handles are created in the CreateBullsPower function:
//+------------------------------------------------------------------+ //| Create Bulls Power | //+------------------------------------------------------------------+ bool CreateBullsPower( int &handle, // handle of the indicator const string symbol, // symbol name ENUM_TIMEFRAMES timeframe, // timeframe int ma_period // averaging period ) { handle= INVALID_HANDLE ; //--- create handle of the indicator iBullsPower handle= iBullsPower (symbol,timeframe,ma_period); //--- if the handle is not created if (handle== INVALID_HANDLE ) { //--- tell about the failure and output the error code PrintFormat ( "Failed to create handle of the iBullsPower indicator for the symbol %s/%s, error code %d" , symbol, EnumToString (timeframe), GetLastError ()); //--- the indicator is stopped early return ( false ); } //--- return ( true ); }
It remains to receive data from the indicator in OnTick () (we obtain data using the iGetArray function)
//+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick () { //--- string text= "" ; double value[]; ArraySetAsSeries (value, true ); int buffer= 0 ,start_pos= 0 ,count= 2 ; if (handle_iBullsPower_current!= INVALID_HANDLE ) if (iGetArray(handle_iBullsPower_current,buffer,start_pos,count,value)) { text=text+ "\n" +m_symbol.Name(); for ( int i= 0 ;i<count;i++) { text=text+ " #" + IntegerToString (i)+ "+: " + DoubleToString (value[i],m_symbol. Digits ()+ 1 )+ "; " ; } } if (handle_iBullsPower_symbol_1!= INVALID_HANDLE ) if (iGetArray(handle_iBullsPower_symbol_1,buffer,start_pos,count,value)) { text=text+ "\n" +InpSybmol_1; for ( int i= 0 ;i<count;i++) { text=text+ " #" + IntegerToString (i)+ "+: " + DoubleToString (value[i],m_digits_symbol_1+ 1 )+ "; " ; } } Comment (text); }
Total:
Is it possible moving the handle part in OnInit() section into OnTick() section ?
Handle MUST be created ONLY ONCE. The most convenient place to create a handle is OnInit ().
An example of working with the ZigZag indicator
Code: ZigZag Example.mq5
Pay attention to the extremum search algorithm: if the value in the indicator buffer is not equal to "0.0" and not equal to "PLOT_EMPTY_VALUE" - it means that We have detected an extremum.
The extremum search goes to " ZigZag: how many candles to check back " bars.
Algorithm of work standard: ONCE in OnInit () we create an indicator.
//--- int handle_iCustom; // variable for storing the handle of the iCustom indicator //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- create handle of the indicator iCustom handle_iCustom=iCustom(Symbol(),Period(),"Examples\\ZigZag",InpDepth,InpDeviation,InptBackstep); //--- if the handle is not created if(handle_iCustom==INVALID_HANDLE) { //--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iCustom indicator for the symbol %s/%s, error code %d", Symbol(), EnumToString(Period()), GetLastError()); //--- the indicator is stopped early return(INIT_FAILED); } //--- return(INIT_SUCCEEDED); }
Next in OnTick (), we make a copy of the indicator data, while using the indicator handle.
//+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { static long counter=0; counter++; if(counter>=15) counter=0; else return; //--- double ZigzagBuffer[]; ArraySetAsSeries(ZigzagBuffer,true); int start_pos=0,count=InpCandlesCheck+1; if(!iGetArray(handle_iCustom,0,start_pos,count,ZigzagBuffer)) return; string text=""; for(int i=0;i<count;i++) { if(ZigzagBuffer[i]!=PLOT_EMPTY_VALUE && ZigzagBuffer[i]!=0.0) text=text+"\n"+IntegerToString(i)+": "+DoubleToString(ZigzagBuffer[i],Digits()); } Comment(text); }
The function by which the data is copied indicator:
//+------------------------------------------------------------------+ //| Get value of buffers | //+------------------------------------------------------------------+ double iGetArray(const int handle,const int buffer,const int start_pos,const int count,double &arr_buffer[]) { bool result=true; if(!ArrayIsDynamic(arr_buffer)) { Print("This a no dynamic array!"); return(false); } ArrayFree(arr_buffer); //--- reset error code ResetLastError(); //--- fill a part of the iBands array with values from the indicator buffer int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer); if(copied!=count) { //--- if the copying fails, tell the error code PrintFormat("Failed to copy data from the indicator, error code %d",GetLastError()); //--- quit with zero result - it means that the indicator is considered as not calculated return(false); } return(result); }
Result of work:
An example of working with an OBJ_HLINE graphic object.
Advisor OBJ_HLINE follows price has two parameters: Indent up - indent up from the current price and Indent down - indent down from the top line:
Advisor's work animation:
thanks.
void OnTick() { scanTicks(); } bool NewBar(void) { bool iNewBar=false; static double currPeriodProgress=0; double lastPeriodProgress=MathMod(TimeCurrent(),PeriodSeconds()); if(lastPeriodProgress<currPeriodProgress) iNewBar=true; currPeriodProgress=lastPeriodProgress; return(iNewBar); } void scanTicks() { NewBar(); double waktuSekarang; if(NewBar()==true) { waktuSekarang=MathMod(TimeCurrent(),PeriodSeconds()); } MqlTick tick_array[]; int copied=CopyTicks(_Symbol,tick_array,COPY_TICKS_ALL,0,1); // Latest loop for(int i=copied-1; i>=0;i--) { MqlTick tick = tick_array[i]; //debug Print("Bid : ", tick.bid, " Ask : ", tick.ask, " Array ", i); } }
Example:
//+------------------------------------------------------------------+ //| Temp.mq5 | //| Copyright © 2019, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2019, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.00" //+------------------------------------------------------------------+ //| Enum Copy Ticks Flags | //+------------------------------------------------------------------+ enum ENUM_COPY_TICKS_FLAGS { info=0, // COPY_TICKS_INFO trade=1, // COPY_TICKS_TRADE all=2, // COPY_TICKS_ALL }; //--- input parameters input ENUM_COPY_TICKS_FLAGS InpFlags = trade; // The Copy Ticks Flags: input uint InpCount = 10; // The number of ticks that you want to receive //--- datetime ExtPrevBars=0; // "0" -> D'1970.01.01 00:00'; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- we work only at the time of the birth of new bar datetime time_0=iTime(Symbol(),Period(),0); if(time_0==ExtPrevBars) return; ExtPrevBars=time_0; //--- MqlTick tick_array[]; // Tick receiving array //--- Measuring start time before receiving the ticks uint start=GetTickCount(); //--- Requesting the tick history since 1970.01.01 00:00.001 (parameter from=1 ms) int received=CopyTicks(Symbol(),tick_array,InpFlags,(ulong)(TimeCurrent()+60),InpCount); if(received!=-1) { //--- Showing information about the number of ticks and spent time PrintFormat("%s: received %d ticks in %d ms",Symbol(),received,GetTickCount()-start); //--- If the tick history is synchronized, the error code is equal to zero if(GetLastError()==0) { int limit=(received>10)?10:received; for(int i=0;i<limit;i++) Print("Bid : ",tick_array[i].bid," Ask : ",tick_array[i].ask," Array ",i); } else PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d", _Symbol,received,GetTickCount()-start,_LastError); } } //+------------------------------------------------------------------+
Result:
2019.08.18 09:29:02.686 2019.03.11 02:00:00 EURUSD: received 9 ticks in 0 ms 2019.08.18 09:29:02.686 2019.03.11 02:00:00 Bid : 1.12343 Ask : 1.1236 Array 0 2019.08.18 09:29:02.686 2019.03.11 02:00:00 Bid : 1.12344 Ask : 1.12361 Array 1 2019.08.18 09:29:02.686 2019.03.11 02:00:00 Bid : 1.12342 Ask : 1.12359 Array 2 2019.08.18 09:29:02.686 2019.03.11 02:00:00 Bid : 1.12343 Ask : 1.1236 Array 3 2019.08.18 09:29:02.686 2019.03.11 02:00:00 Bid : 1.12341 Ask : 1.12358 Array 4 2019.08.18 09:29:02.686 2019.03.11 02:00:00 Bid : 1.12342 Ask : 1.12359 Array 5 2019.08.18 09:29:02.686 2019.03.11 02:00:00 Bid : 1.1234 Ask : 1.12357 Array 6 2019.08.18 09:29:02.686 2019.03.11 02:00:00 Bid : 1.12341 Ask : 1.12358 Array 7 2019.08.18 09:29:02.686 2019.03.11 02:00:00 Bid : 1.1234 Ask : 1.12357 Array 8
Do not double post!
I have deleted your duplicate post.
Do not double post!
I have deleted your duplicate post.
Nobody did a double post. I did a post transfer from one topic to another:
Forum on trading, automated trading systems and testing trading strategies
Vladimir Karputov, 2019.08.18 07:56
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
This thread discusses MQL5 code examples. There will be examples of how to get data from indicators, how to program advisors ... in general, any questions from beginner to the MQL5 language.
If you are just starting to get acquainted with the MetaTrader 5 terminal, then I can recommend the following threads:
How to Start with Metatrader 5
Where do i start from?
Use tips in the Freelance service!