Specified_Time_Range_Candles

Author: Copyright 2018, MetaQuotes Software Corp.
Price Data Components
Series array that contains open prices of each barSeries array that contains the highest prices of each barSeries array that contains the lowest prices of each barSeries array that contains close prices for each bar
0 Views
0 Downloads
0 Favorites
Specified_Time_Range_Candles
ÿþ//+------------------------------------------------------------------+

//|                                 Specified_Time_Range_Candles.mq5 |

//|                        Copyright 2018, MetaQuotes Software Corp. |

//|                                                 https://mql5.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2018, MetaQuotes Software Corp."

#property link      "https://mql5.com"

#property version   "1.00"

#property description "Specified time range candles indicator"

#property description "Colored candles depending on specific time range."

#property indicator_chart_window

#property indicator_buffers 5

#property indicator_plots   1

//--- plot Candle

#property indicator_label1  "Open;High;Low;Close"

#property indicator_type1   DRAW_COLOR_CANDLES

#property indicator_color1  clrSeaGreen,clrOrangeRed,clrDimGray,clrDarkGray

#property indicator_style1  STYLE_SOLID

#property indicator_width1  1

//--- enums

enum ENUM_CANDLE_TYPE

  {

   CANDLE_TYPE_BULLISH,

   CANDLE_TYPE_BEARISH,

   CANDLE_TYPE_NEUTRAL,

   CANDLE_TYPE_NONE

  };

//--- input parameters

input uint              InpStartHour   =  8;          // Start hour of the trading session

input uint              InpHours       =  5;          // Session length

input ENUM_CHART_MODE   InpChartMode   =  CHART_BARS; // Chart mode

//--- indicator buffers

double            BufferCandleOpen[];

double            BufferCandleHigh[];

double            BufferCandleLow[];

double            BufferCandleClose[];

double            BufferColors[];

//--- global variables

int               start_hour;

int               hours;

bool              current_candle;

ENUM_CHART_MODE   prev_mode;

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int OnInit()

  {

//--- set global variables

   start_hour=int(InpStartHour>23 ? 23 : InpStartHour);

   int diff=24-start_hour;

   hours=int((int)InpHours>diff ? diff : InpHours);

   current_candle=true;

   prev_mode=(ENUM_CHART_MODE)ChartGetInteger(0,CHART_MODE);

   ChartSetInteger(0,CHART_MODE,InpChartMode);

   ChartRedraw();

//--- indicator buffers mapping

   SetIndexBuffer(0,BufferCandleOpen,INDICATOR_DATA);

   SetIndexBuffer(1,BufferCandleHigh,INDICATOR_DATA);

   SetIndexBuffer(2,BufferCandleLow,INDICATOR_DATA);

   SetIndexBuffer(3,BufferCandleClose,INDICATOR_DATA);

   SetIndexBuffer(4,BufferColors,INDICATOR_COLOR_INDEX);

//--- setting indicator parameters

   IndicatorSetString(INDICATOR_SHORTNAME,"Specified time range candles ("+(string)start_hour+","+(string)hours+")");

   IndicatorSetInteger(INDICATOR_DIGITS,Digits());

//--- setting buffer arrays as timeseries

   ArraySetAsSeries(BufferCandleOpen,true);

   ArraySetAsSeries(BufferCandleHigh,true);

   ArraySetAsSeries(BufferCandleLow,true);

   ArraySetAsSeries(BufferCandleClose,true);

   ArraySetAsSeries(BufferColors,true);

//---

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

   ChartSetInteger(0,CHART_MODE,prev_mode);

   ChartRedraw();

  }  

//+------------------------------------------------------------------+

//| 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[])

  {

//--- #AB0=>2:0 <0AA82>2 1CD5@>2 :0: B09<A5@89

   ArraySetAsSeries(open,true);

   ArraySetAsSeries(high,true);

   ArraySetAsSeries(low,true);

   ArraySetAsSeries(close,true);

   ArraySetAsSeries(time,true);

//--- @>25@:0 :>;8G5AB20 4>ABC?=KE 10@>2

   if(rates_total<fmax(hours,4)) return 0;

//--- @>25@:0 8 @0AGQB :>;8G5AB20 ?@>AG8BK205<KE 10@>2

   int limit=rates_total-prev_calculated;

   if(limit>1)

     {

      limit=rates_total-1;

      ArrayInitialize(BufferCandleOpen,EMPTY_VALUE);

      ArrayInitialize(BufferCandleHigh,EMPTY_VALUE);

      ArrayInitialize(BufferCandleLow,EMPTY_VALUE);

      ArrayInitialize(BufferCandleClose,EMPTY_VALUE);

      ArrayInitialize(BufferColors,3);

     }



//---  0AGQB 8=48:0B>@0

   for(int i=limit; i>=0 && !IsStopped(); i--)

     {

      BufferCandleOpen[i]=BufferCandleHigh[i]=BufferCandleLow[i]=BufferCandleClose[i]=EMPTY_VALUE;



      ENUM_CANDLE_TYPE type=CandleType(i,open,close,time);

      BufferColors[i]=3;

      if(type==CANDLE_TYPE_BULLISH)

        {

         BufferCandleOpen[i]=iOpen(NULL,PERIOD_CURRENT,i);

         BufferCandleHigh[i]=iHigh(NULL,PERIOD_CURRENT,i);

         BufferCandleLow[i]=iLow(NULL,PERIOD_CURRENT,i);

         BufferCandleClose[i]=iClose(NULL,PERIOD_CURRENT,i);

         BufferColors[i]=0;

        }

      else if(type==CANDLE_TYPE_BEARISH)

        {

         BufferCandleOpen[i]=iOpen(NULL,PERIOD_CURRENT,i);

         BufferCandleHigh[i]=iHigh(NULL,PERIOD_CURRENT,i);

         BufferCandleLow[i]=iLow(NULL,PERIOD_CURRENT,i);

         BufferCandleClose[i]=iClose(NULL,PERIOD_CURRENT,i);

         BufferColors[i]=1;

        }

      else if(type==CANDLE_TYPE_NEUTRAL)

        {

         BufferCandleOpen[i]=iOpen(NULL,PERIOD_CURRENT,i);

         BufferCandleHigh[i]=iHigh(NULL,PERIOD_CURRENT,i);

         BufferCandleLow[i]=iLow(NULL,PERIOD_CURRENT,i);

         BufferCandleClose[i]=iClose(NULL,PERIOD_CURRENT,i);

         BufferColors[i]=2;

        }

     }



//--- return value of prev_calculated for next call

   return(rates_total);

  }

//+------------------------------------------------------------------+

//| >72@0I05B B8? A25G8                                             |

//+------------------------------------------------------------------+

ENUM_CANDLE_TYPE CandleType(int shift,const double &open[],const double &close[],const datetime &time[])

  {

   int total=start_hour+hours;

   for(int j=start_hour; j<total; j++)

     {

      int hour=(j==24 ? 0 : j>24 ? j-24 : j);

      if(TimeHour(time[shift])==hour || (current_candle && shift==0))

         return(close[shift] > open[shift] ? CANDLE_TYPE_BULLISH : close[shift] < open[shift] ? CANDLE_TYPE_BEARISH : CANDLE_TYPE_NEUTRAL);

     }

   return(CANDLE_TYPE_NONE);

  }

//+------------------------------------------------------------------+

//| >72@0I05B G0A C:070==>3> 2@5<5=8                                |

//+------------------------------------------------------------------+

int TimeHour(const datetime time)

  {

   MqlDateTime tm;

   if(!TimeToStruct(time,tm)) return WRONG_VALUE;

   return tm.hour;

  }

//+------------------------------------------------------------------+

Comments