/* * DIBSv1.0.mq4 * * Thanks to Midnite (daily_open_line.mq4) and free84 (in&out.mq4) * * Remaining bar time added by NuckingFuts **/ #property copyright "Copyright ©, free84, Midnite and NuckingFuts" #property link "www.forexfactory.com" #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 RoyalBlue #property indicator_width1 2 #property indicator_color2 RoyalBlue #property indicator_width2 2 #property indicator_color3 FireBrick #property indicator_style3 2 #property indicator_width3 1 /* External settings */ extern bool Show_IB = true; extern bool Show_Daily_Open_Line = true; extern bool Show_Remain_Bar_Time = true; extern int Timezone_Offset = 0; /* Indicator buffers */ double ib1[]; double ib2[]; double OpenBuf[]; string IndName = "DIBS v1.0"; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { IndicatorShortName(IndName); SetIndexStyle(0, DRAW_HISTOGRAM, 0); SetIndexStyle(1, DRAW_HISTOGRAM, 0); SetIndexBuffer(0, ib1); SetIndexBuffer(1, ib2); SetIndexLabel(0, "IB"); SetIndexLabel(1, "IB"); SetIndexStyle(2, DRAW_LINE); SetIndexBuffer(2, OpenBuf); SetIndexLabel(2, "OpenLine"); SetIndexEmptyValue(2, 0.0); return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { string Cmnt = IndName; if (Show_Remain_Bar_Time) Cmnt = Cmnt+"\n"+GetRemainingBarTime(); Comment(Cmnt); static datetime prevtime = 0; int shift; int shift1; int shift2; double L, L1, H, H1; if (Show_Daily_Open_Line) { int counted_bars = IndicatorCounted(); if (counted_bars > 0) counted_bars--; int last_bar = Bars - counted_bars; DrawDailyOpen(0, last_bar); } if (prevtime == Time[0]) return(0); prevtime = Time[0]; for (shift = 0; shift < Bars; shift++) { shift1 = shift; shift2 = shift + 1; H = High[shift1]; H1 = High[shift2]; L = Low[shift1]; L1 = Low[shift2]; // Check IB's if ((H <= H1) && (L >= L1)) { if (Show_IB) { ib1[shift] = High[shift]; ib2[shift] = Low[shift]; } } } return(0); } //+------------------------------------------------------------------+ //| Draw daily open line | //+------------------------------------------------------------------+ int DrawDailyOpen(int offset, int lastbar) { int shift; int tzdiffsec = Timezone_Offset * 3600; double barsper30 = 1.0*PERIOD_M30/Period(); bool ShowDailyOpenLevel = true; lastbar = MathMin(Bars-20*barsper30-1, lastbar); for (shift = lastbar; shift >= offset; shift--) { OpenBuf[shift] = 0; if (ShowDailyOpenLevel) { if (TimeDay(Time[shift]-tzdiffsec) != TimeDay(Time[shift+1]-tzdiffsec)) { OpenBuf[shift] = Open[shift]; OpenBuf[shift+1] = 0; } else { OpenBuf[shift] = OpenBuf[shift+1]; } } } return(0); } //+------------------------------------------------------------------+ // Show bar remaining time | //+------------------------------------------------------------------+ string GetRemainingBarTime() { int min, sec, hr; min = Time[0]+Period()*60-CurTime(); sec = min%60; min = (min-min%60)/60; string Com = ""; if (min > 59) { hr = min/60; min = min%60; Com = hr+" hour"; if (hr > 1) Com = Com + "s"; Com = Com+", "; } if (min > 0) { Com = Com+min + " minute"; if (min > 1 || min == 0) Com = Com + "s"; Com = Com +" and "; } Com = Com + sec + " second"; if (sec > 1) Com = Com + "s"; Com = Com +" remaining until bar close"; return(Com); } //+------------------------------------------------------------------+