Making a MQL5 indicator and wanting it to display signals only at certain times ex. 9:00 - 12:00

 

So far I have tried many things but, ether the methods found were not compatible with my code (I don't get errors, just my implied intention with what I coded dosen't work) or I sheerly didn't understand how to implement it into my code(i.e I was to stupid)

I looked at a few posts on the forum to see what other people did using things like MqlDateTime or just using the default time[] array in oncalculate.

I've also tried using TimeToString or  StringToTime. Nothing really worked for me.


I am running a for loop using i. When the conditions in the if statement are met a signal is posted.


So at the the moment I am looking for a way to implement the time issue mentioned above into this if statement of the for loop.


So something like


if(time[]>8:00 && time[]>12:00 && (all the other statements that are part of the indi...)

{

signal...

}


obv very simplified version of the code. 


Does anyone know how to do this in mql5?

Help is greatly appreciated <3

p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px 'Helvetica Neue'} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px 'Helvetica Neue'; min-height: 16.0px}
Documentation on MQL5: Constants, Enumerations and Structures / Data Structures / Date Type Structure
Documentation on MQL5: Constants, Enumerations and Structures / Data Structures / Date Type Structure
  • www.mql5.com
Date Type Structure - Data Structures - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 

Indistinctkiller:

if(time[]>8:00 && time[]>12:00 && (all the other statements that are part of the indi...)
{
  signal...
}
Does anyone know how to do this in mql5?
  1. Please edit your (original) post and use the CODE button (Alt-S)! (For large amounts of code, attach it.)
              General rules and best pratices of the Forum. - General - MQL5 programming forum 2019.05.06
              Messages Editor

  2. Don't you mean 8:00 <= time && time < 12:00 [08:00…12:00)? Right now you have (12:00…24:00)
  3. Obviously that isn't valid code.
  4. There are several ways.
    #define HR0800 28800
    #define HR1200 43200 // (12*3600)
    SECONDS now = time(time[]);
    if(now>HR0800 && now>HR1200 && (all the other statements that are part of the indi...){
    
              Find bar of the same time one day ago - MQL4 programming forum 2017.10.06

 
William Roeder:
  1. Please edit your (original) post and use the CODE button (Alt-S)! (For large amounts of code, attach it.)
              General rules and best pratices of the Forum. - General - MQL5 programming forum 2019.05.06
              Messages Editor

  2. Don't you mean 8:00 <= time && time < 12:00 [08:00…12:00)? Right now you have (12:00…24:00)
  3. Obviously that isn't valid code.
  4. There are several ways.           Find bar of the same time one day ago - MQL4 programming forum 2017.10.06

Thanks for the reply!


The code below should be in the for loop right?

SECONDS now = time(time[]);
if(now>HR0800 && now>HR1200 && (all the other statements that are part of the indi...)

and the define should be on the global scope in the beginning?

#define HR0800 28800
#define HR1200 43200 // (12*3600)

and yes thats what I mean sorry I misstyped.

 
Indistinctkiller :


An example of an indicator that displays its data in a given time range: iRVI Time Control

***
input int      Inp_RVI_ma_period = 15;       // RVI: averaging period
input bool     InpTimeControl    = true;     // Use time control
input uchar    InpStartHour      = 09;       // Start Hour
input uchar    InpStartMinute    = 00;       // Start Minute
input uchar    InpEndHour        = 23;       // End Hour
input uchar    InpEndMinute      = 01;       // End Minute
***

iRVI Time Control

 
Vladimir Karputov:

An example of an indicator that displays its data in a given time range: iRVI Time Control

Thanks for the reply.

In this case the Time control is already part of the indicator which is why, the time at which I would want the iRVI to be displayed would just need to be inserted into the iCustom function.


This is however is not what I am looking for. I programmed a custom indicator which displays arrows when certain conditions are met. It does this 24/5 and I am trying to contain it only to a certain time range instead of it running along the whole time 24 h a day. So for example I would only want it to display from 8-12. I does not use the iRVI indicator.


What might have the answer is the source code for iRVI.


edit: 

found it thanks this should work I will study it and try to implement it.

//+------------------------------------------------------------------+
//|                                            iRVI Time Control.mq5 |
//|                              Copyright © 2020, Vladimir Karputov |
//|                     https://www.mql5.com/ru/market/product/43516 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, Vladimir Karputov"
#property link      "https://www.mql5.com/ru/market/product/43516"
#property version   "1.002"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   2
//--- plot RVI
#property indicator_label1  "RVI"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDarkOrange
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Signal
#property indicator_label2  "Signal"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrRoyalBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input int      Inp_RVI_ma_period = 15;       // RVI: averaging period
input bool     InpTimeControl    = true;     // Use time control
input uchar    InpStartHour      = 09;       // Start Hour
input uchar    InpStartMinute    = 00;       // Start Minute
input uchar    InpEndHour        = 23;       // End Hour
input uchar    InpEndMinute      = 01;       // End Minute
//--- indicator buffers
double   TimeRVIBuffer[];
double   TimeSignalBuffer[];
double   RVIBuffer[];
double   SignalBuffer[];
//--
long     m_start=0,m_end=0;
int      bars_calculated=0;            // we will keep the number of values in the Stochastic Oscillator indicator
int      handle_iRVI;                  // variable for storing the handle of the iRVI indicator
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,TimeRVIBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,TimeSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,RVIBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,SignalBuffer,INDICATOR_CALCULATIONS);
//---
   if(InpTimeControl)
     {
      m_start=InpStartHour*60*60+InpStartMinute*60;
      m_end=InpEndHour*60*60+InpEndMinute*60;
     }
//--- the 0.0 (empty) value will mot participate in drawing
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,3);
//--- name for DataWindow and indicator subwindow label
   string time="";
   if(InpTimeControl)
      time=StringFormat(" (%02d:%02d-%02d:%02d)",InpStartHour,InpStartMinute,InpEndHour,InpEndMinute);

   IndicatorSetString(INDICATOR_SHORTNAME,"RVI("+string(Inp_RVI_ma_period)+")"+time);
   PlotIndexSetString(0,PLOT_LABEL,"RVI("+string(Inp_RVI_ma_period)+")");
   PlotIndexSetString(1,PLOT_LABEL,"Signal("+string(Inp_RVI_ma_period)+")");
//--- create handle of the indicator iRVI
   handle_iRVI=iRVI(Symbol(),Period(),Inp_RVI_ma_period);
//--- if the handle is not created
   if(handle_iRVI==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iRVI indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- number of values copied from the iRVI indicator
   int values_to_copy;
//--- determine the number of values calculated in the indicator
   int calculated=BarsCalculated(handle_iRVI);
   if(calculated<=0)
     {
      PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
      return(0);
     }
//--- if it is the first start of calculation of the indicator or if the number of values in the iRVI indicator changed
//---or if it is necessary to calculated the indicator for two or more bars (it means something has changed in the price history)
   if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
     {
      //--- if the RVIBuffer array is greater than the number of values in the iRVI indicator for symbol/period, then we don't copy everything
      //--- otherwise, we copy less than the size of indicator buffers
      if(calculated>rates_total)
         values_to_copy=rates_total;
      else
         values_to_copy=calculated;
     }
   else
     {
      //--- it means that it's not the first time of the indicator calculation, and since the last call of OnCalculate()
      //--- for calculation not more than one bar is added
      values_to_copy=(rates_total-prev_calculated)+1;
     }
//--- fill the arrays with values of the iRVI indicator
//--- if FillArrayFromBuffer returns false, it means the information is nor ready yet, quit operation
   if(!FillArrayFromBuffer(RVIBuffer,SignalBuffer,handle_iRVI,values_to_copy))
      return(0);
//--- memorize the number of values in the Relative Vigor Index indicator
   bars_calculated=calculated;
//--- main loop
   int limit=prev_calculated-1;
   if(prev_calculated==0)
      limit=0;

   for(int i=limit; i<rates_total; i++)
     {
      if(InpTimeControl)
        {
         MqlDateTime STime;
         TimeToStruct(time[i],STime);
         if((STime.hour*60*60+STime.min*60)<m_start || (STime.hour*60*60+STime.min*60)>=m_end)
           {
            TimeRVIBuffer[i]=EMPTY_VALUE;
            TimeSignalBuffer[i]=EMPTY_VALUE;
            continue;
           }
        }
      TimeRVIBuffer[i]=RVIBuffer[i];
      TimeSignalBuffer[i]=SignalBuffer[i];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Filling indicator buffers from the iRVI indicator                |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &rvi_buffer[],     // indicator buffer of Relative Vigor Index values
                         double &signal_buffer[],  // indicator buffer of the signal line
                         int ind_handle,           // handle of the iRVI indicator
                         int amount                // number of copied values
                        )
  {
//--- reset error code
   ResetLastError();
//--- fill a part of the iRVIBuffer array with values from the indicator buffer that has 0 index
   if(CopyBuffer(ind_handle,0,0,amount,rvi_buffer)<0)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("Failed to copy data from the iRVI indicator, error code %d",GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
//--- fill a part of the SignalBuffer array with values from the indicator buffer that has index 1
   if(CopyBuffer(ind_handle,1,0,amount,signal_buffer)<0)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("Failed to copy data from the iRVI indicator, error code %d",GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
//--- everything is fine
   return(true);
  }