DWMChannels

Author: Copyright 2016, MetaQuotes Software Corp.
DWMChannels
Price Data Components
Series array that contains the highest prices of each barSeries array that contains the lowest prices of each bar
2 Views
0 Downloads
0 Favorites
DWMChannels
//+------------------------------------------------------------------+
//|                                                  DWMChannels.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 6
#property indicator_plots   6
//--- plot Daily High
#property indicator_label1  "Daily High"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Daily Low
#property indicator_label2  "Daily Low"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot Weekly High
#property indicator_label3  "Weekly High"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrGreen
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//--- plot Weekly Low
#property indicator_label4  "Weekly Low"
#property indicator_type4   DRAW_LINE
#property indicator_color4  clrGreen
#property indicator_style4  STYLE_SOLID
#property indicator_width4  1

//--- plot Monthly High
#property indicator_label5  "Monthly High"
#property indicator_type5   DRAW_LINE
#property indicator_color5  clrBlue
#property indicator_style5  STYLE_SOLID
#property indicator_width5  1
//--- plot Monthly Low
#property indicator_label6  "Monthly Low"
#property indicator_type6   DRAW_LINE
#property indicator_color6  clrBlue
#property indicator_style6  STYLE_SOLID
#property indicator_width6  1
//--- input parameters
//--- indicator buffers
double         DailyHighBuffer[];
double         DailyLowBuffer[];
double         WeeklyHighBuffer[];
double         WeeklyLowBuffer[];
double         MonthlyHighBuffer[];
double         MonthlyLowBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,DailyHighBuffer);
   SetIndexBuffer(1,DailyLowBuffer);
   SetIndexBuffer(2,WeeklyHighBuffer);
   SetIndexBuffer(3,WeeklyLowBuffer);
   SetIndexBuffer(4,MonthlyHighBuffer);
   SetIndexBuffer(5,MonthlyLowBuffer);

//---
   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[])
  {
   int i,limit;
//--- Get the number of bars available for the current symbol and chart period 
   int bars=Bars(Symbol(),0);
   Print("Bars = ",bars,", rates_total = ",rates_total,",  prev_calculated = ",prev_calculated);
   Print("time[0] = ",time[0]," time[rates_total-1] = ",time[rates_total-1]);
//--- last counted bar will be recounted
   limit=rates_total-prev_calculated;
   int startDayShfit=limit -1,endDayShfit=limit -1;
   int startWeekShfit=limit -1,endWeekShfit=limit -1;
   int startMonthShfit=limit -1,endMonthShfit=limit -1;
   for(i=limit-1; i>=0;i--)
     {
      datetime shiftDateTime=time[i];
      int shiftDay=TimeDay(shiftDateTime);
      int shiftWeak=TimeDayOfWeek(shiftDateTime);
      string ShiftTimeString=TimeToString(shiftDateTime,TIME_MINUTES|TIME_SECONDS);
      if(ShiftTimeString=="00:00:00")
        {
         endDayShfit=i+1;
         if(startDayShfit>endDayShfit)
            DailyChannels(startDayShfit,endDayShfit);
         startDayShfit=i;
        }
      if(ShiftTimeString=="00:00:00" && shiftWeak==5)
        {
         endWeekShfit=i+1;
         if(startWeekShfit>endWeekShfit)
            WeeklyChannels(startWeekShfit,endWeekShfit);
         startWeekShfit=i;
        }
      if(ShiftTimeString=="00:00:00" && shiftDay==1)
        {
         endMonthShfit=i+1;
         if(startMonthShfit>endMonthShfit)
            MonthlyChannels(startMonthShfit,endMonthShfit);
         startMonthShfit=i;
        }
     }
//--- return value of prev_calculated for next call 
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DailyChannels(int start,int end)
  {
   int highIndex=iHighest(NULL,NULL,MODE_HIGH,start-end+1,end);
   double highValue=iHigh(NULL,NULL,highIndex);
   int lowIndex=iLowest(NULL,NULL,MODE_LOW,start-end+1,end);
   double lowValue=iLow(NULL,NULL,lowIndex);
   for(int i=start;i>=end;i--)
     {
      DailyHighBuffer[i]= highValue;
      DailyLowBuffer[i] = lowValue;
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void WeeklyChannels(int start,int end)
  {
   int highIndex=iHighest(NULL,NULL,MODE_HIGH,start-end+1,end);
   double highValue=iHigh(NULL,NULL,highIndex);
   int lowIndex=iLowest(NULL,NULL,MODE_LOW,start-end+1,end);
   double lowValue=iLow(NULL,NULL,lowIndex);
   for(int i=start;i>=end;i--)
     {
      WeeklyHighBuffer[i]= highValue;
      WeeklyLowBuffer[i] = lowValue;
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void MonthlyChannels(int start,int end)
  {
   int highIndex=iHighest(NULL,NULL,MODE_HIGH,start-end+1,end);
   double highValue=iHigh(NULL,NULL,highIndex);
   int lowIndex=iLowest(NULL,NULL,MODE_LOW,start-end+1,end);
   double lowValue=iLow(NULL,NULL,lowIndex);
   for(int i=start;i>=end;i--)
     {
      MonthlyHighBuffer[i]=highValue;
      MonthlyLowBuffer[i]=lowValue;
     }
  }
//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---