TestHours4E

Author: Copyright 2019, Vladradon
Price Data Components
Series array that contains open time of each barSeries array that contains open prices of each barSeries array that contains close prices for each barSeries array that contains the highest prices of each barSeries array that contains the lowest prices of each bar
Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
TestHours4E
ÿþ//+------------------------------------------------------------------+

//|                                                       TestHours4 |

//|                                        Copyright 2019, Vladradon |

//|                                                fxradon@gmail.com |

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

#property copyright "Copyright 2019, Vladradon"

#property link      "fxradon@gmail.com"

#property version   "4.00"

#property strict

#property indicator_separate_window

#property indicator_buffers 2

#property indicator_level1 0



extern bool Autoday=false;

extern ENUM_DAY_OF_WEEK WeekDay=1;

extern int Days=365;

extern bool HighLow=false;

extern bool SummUpDown=false;

extern bool Average=false;

extern int  AutoZoom=50;

extern color UpColor=clrDodgerBlue;

extern color DownColor=clrRed;

extern color BorderColor=clrWhite;

extern color TextColor=clrWhite;

extern color ButtonsColor=clrIndigo;



double HoursUp[];

double HoursDown[];

double HoursP=0,HoursM=0;

int P=0,M=0;

datetime Top=0;

int DayWeek=8;

double Zoom=1;

bool LastAverage=false;

bool LastHighLow=false;

bool LastSummUpDown=false;

bool LastAutoday=false;

string day="";

bool First=true;

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

//| Custom indicator initialization function                         |

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

int OnInit()

  {

//--- indicator buffers mapping

   SetIndexBuffer(0,HoursUp);

   SetIndexStyle(0,DRAW_NONE);

   SetIndexBuffer(1,HoursDown);

   SetIndexStyle(1,DRAW_NONE);

//---

   IndicatorDigits(0);

   if(Days<5)

      Days=5;



   First=true;

//---

   return(INIT_SUCCEEDED);

  }

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

//|                                                                  |

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

void OnDeinit(const int reason)

  {

   for(int HourDay=0; HourDay<24; HourDay++)

     {

      if(ObjectFind(0,"H"+DoubleToStr(HourDay,0)+_Symbol)>=0)

         ObjectDelete("H"+DoubleToStr(HourDay,0)+_Symbol);

      if(ObjectFind(0,"L"+DoubleToStr(HourDay,0)+_Symbol)>=0)

         ObjectDelete("L"+DoubleToStr(HourDay,0)+_Symbol);

      if(ObjectFind(0,"Hour"+DoubleToStr(HourDay,0)+_Symbol)>=0)

         ObjectDelete("Hour"+DoubleToStr(HourDay,0)+_Symbol);

      if(ObjectFind(0,"Hd"+DoubleToStr(HourDay,0)+_Symbol)>=0)

         ObjectDelete("Hd"+DoubleToStr(HourDay,0)+_Symbol);

      if(ObjectFind(0,"Ld"+DoubleToStr(HourDay,0)+_Symbol)>=0)

         ObjectDelete("Ld"+DoubleToStr(HourDay,0)+_Symbol);

     }

   if(ObjectFind(0,"Autoday"+_Symbol)>=0)

      ObjectDelete("Autoday"+_Symbol);

   if(ObjectFind(0,"HighLow"+_Symbol)>=0)

      ObjectDelete("HighLow"+_Symbol);

   if(ObjectFind(0,"SummUpDown"+_Symbol)>=0)

      ObjectDelete("SummUpDown"+_Symbol);

   if(ObjectFind(0,"Average"+_Symbol)>=0)

      ObjectDelete("Average"+_Symbol);

   if(ObjectFind(0,"Spread"+_Symbol)>=0)

      ObjectDelete("Spread"+_Symbol);

   if(ObjectFind(0,"ClOp"+_Symbol)>=0)

      ObjectDelete("ClOp"+_Symbol);

   if(ObjectFind(0,"ClOpSpr"+_Symbol)>=0)

      ObjectDelete("ClOpSpr"+_Symbol);

  }

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

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

  {

//---

   if(Top!=iTime(_Symbol,PERIOD_H1,0) || LastAutoday!=ObjectGetInteger(0,"Autoday"+_Symbol,OBJPROP_STATE,0) ||

      LastHighLow!=ObjectGetInteger(0,"HighLow"+_Symbol,OBJPROP_STATE) || LastSummUpDown!=ObjectGetInteger(0,"SummUpDown"+_Symbol,OBJPROP_STATE,0) ||

      LastAverage!=ObjectGetInteger(0,"Average"+_Symbol,OBJPROP_STATE))

     {

      for(int HourDay=0; HourDay<24; HourDay++)

        {

         if(ObjectFind(0,"H"+DoubleToStr(HourDay,0)+_Symbol)>=0)

            ObjectDelete("H"+DoubleToStr(HourDay,0)+_Symbol);

         if(ObjectFind(0,"L"+DoubleToStr(HourDay,0)+_Symbol)>=0)

            ObjectDelete("L"+DoubleToStr(HourDay,0)+_Symbol);

         if(ObjectFind(0,"Hour"+DoubleToStr(HourDay,0)+_Symbol)>=0)

            ObjectDelete("Hour"+DoubleToStr(HourDay,0)+_Symbol);

         if(ObjectFind(0,"Hd"+DoubleToStr(HourDay,0)+_Symbol)>=0)

            ObjectDelete("Hd"+DoubleToStr(HourDay,0)+_Symbol);

         if(ObjectFind(0,"Ld"+DoubleToStr(HourDay,0)+_Symbol)>=0)

            ObjectDelete("Ld"+DoubleToStr(HourDay,0)+_Symbol);

        }



      Top=iTime(_Symbol,PERIOD_H1,0);

      ArrayInitialize(HoursUp,0);

      ArrayInitialize(HoursDown,0);

      HoursP=0;

      HoursM=0;

      P=0;

      M=0;

      First=true;

     }



      LastAutoday=ObjectGetInteger(0,"Autoday"+_Symbol,OBJPROP_STATE);

      LastHighLow=ObjectGetInteger(0,"HighLow"+_Symbol,OBJPROP_STATE);

      LastSummUpDown=ObjectGetInteger(0,"SummUpDown"+_Symbol,OBJPROP_STATE);

      LastAverage=ObjectGetInteger(0,"Average"+_Symbol,OBJPROP_STATE);



      Spread();

      if(!First) return(rates_total);

      if(First) First=false;



      if(LastAutoday)

         DayWeek=DayOfWeek();

      else

         DayWeek=WeekDay;

      if(DayWeek<0 || DayWeek>6)

        {

         Print("Wrong day of week!");

         return(0);

        }

      day=Daynow(DayWeek);

      IndicatorShortName("Test hours "+DoubleToStr(Days,0)+" days | "+day+" |");

      Buttons();

      

      for(int HourDay=0; HourDay<24; HourDay++)

        {

         HoursP=0;

         HoursM=0;

         P=0;

         M=0;

         for(int i=Days; i>0; i--)

            for(int j=0; j<24; j++)

              {

               if(TimeDayOfWeek(iTime(_Symbol,PERIOD_H1,i*24+j))==DayWeek && TimeHour(iTime(_Symbol,PERIOD_H1,i*24+j))==HourDay)

                 {

                  if(iClose(_Symbol,PERIOD_H1,i*24+j)-iOpen(_Symbol,PERIOD_H1,i*24+j)>0)

                    {

                     if(!LastHighLow)

                        HoursP+=NormalizeDouble((iClose(_Symbol,PERIOD_H1,i*24+j)-iOpen(_Symbol,PERIOD_H1,i*24+j))/_Point,0);

                     else

                        HoursP+=NormalizeDouble((iHigh(_Symbol,PERIOD_H1,i*24+j)-iOpen(_Symbol,PERIOD_H1,i*24+j))/_Point,0);

                     P++;

                    }

                  if(iClose(_Symbol,PERIOD_H1,i*24+j)-iOpen(_Symbol,PERIOD_H1,i*24+j)<0)

                    {

                     if(!LastHighLow)

                        HoursM+=NormalizeDouble((iClose(_Symbol,PERIOD_H1,i*24+j)-iOpen(_Symbol,PERIOD_H1,i*24+j))/_Point,0);

                     else

                        HoursM+=NormalizeDouble((iLow(_Symbol,PERIOD_H1,i*24+j)-iOpen(_Symbol,PERIOD_H1,i*24+j))/_Point,0);

                     M++;

                    }

                 }

              }

         if(HoursP>0 && P>0)

            if(LastAverage)

               HoursP=NormalizeDouble(HoursP/P, 2);

         if(HoursM<0 && M>0)

            if(LastAverage)

               HoursM=NormalizeDouble(HoursM/M, 2);

         if(LastSummUpDown)

           {

            if(HoursP+HoursM>0)

               HoursUp[HourDay]=HoursP+HoursM;

            if(HoursP+HoursM<0)

               HoursDown[HourDay]=HoursP+HoursM;

           }

         else

           {

            if(HoursP>0)

               HoursUp[HourDay]=HoursP;

            if(HoursM<0)

               HoursDown[HourDay]=HoursM;

           }

        }

      if(AutoZoom<=50)

         AutoZoom=50;

      Zoom=(HoursUp[ArrayMaximum(HoursUp,WHOLE_ARRAY,0)]+MathAbs(HoursDown[ArrayMinimum(HoursDown,WHOLE_ARRAY,0)]))/AutoZoom;

      int Shift=(int)(HoursUp[ArrayMaximum(HoursUp,WHOLE_ARRAY,0)]/Zoom);

      for(int HourDay=0; HourDay<24; HourDay++)

        {

         if((int)HoursUp[HourDay]>0)

            Draw(HourDay,HoursUp[HourDay],UpColor,Shift);

         if((int)HoursDown[HourDay]<0)

            Draw(HourDay,HoursDown[HourDay],DownColor,Shift);

         Hours(HourDay);

        }

     

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

   return(rates_total);

  }

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

string Daynow(int days=0)

  {

   string DayNow="";

   switch(days)

     {

      case 0:

         DayNow="Sunday";

         break;

      case 1:

         DayNow="Monday";

         break;

      case 2:

         DayNow="Tuesday";

         break;

      case 3:

         DayNow="Wednesday";

         break;

      case 4:

         DayNow="Thursday";

         break;

      case 5:

         DayNow="Friday";

         break;

      case 6:

         DayNow="Saturday";

         break;

      default:

         DayNow="";

         break;

     }

   return(DayNow);

  }

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

void Draw(int hour=-1,double Level=0.0,color Color=clrWhite,int Shift=0)

  {

   if(hour<0 || hour>23)

      return;

   int win=WindowFind("Test hours "+DoubleToStr(Days,0)+" days | "+day+" |");

   string Name="";

   string Name2="";

   if(Level>0)

     {

      Name="H"+DoubleToStr(hour,0)+_Symbol;

      Name2="Hd"+DoubleToStr(hour,0)+_Symbol;

     }

   if(Level<0)

     {

      Name="L"+DoubleToStr(hour,0)+_Symbol;

      Name2="Ld"+DoubleToStr(hour,0)+_Symbol;

     }

   Level/=Zoom;



   if(ObjectFind(0,Name)>=0)

      ObjectDelete(Name);



   if(!ObjectCreate(0,Name,OBJ_RECTANGLE_LABEL,win,0,0))

      Print(__FUNCTION__,": don't create "+Name+"! Error code = ",GetLastError());

   ObjectSetInteger(0,Name,OBJPROP_BORDER_TYPE,BORDER_FLAT);

   ObjectSetInteger(0,Name,OBJPROP_CORNER,CORNER_LEFT_UPPER);

   ObjectSetInteger(0,Name,OBJPROP_STYLE,STYLE_SOLID);

   ObjectSetInteger(0,Name,OBJPROP_WIDTH,1);

   ObjectSetInteger(0,Name,OBJPROP_BACK,false);

   ObjectSetInteger(0,Name,OBJPROP_SELECTABLE,false);

   ObjectSetInteger(0,Name,OBJPROP_SELECTED,false);

   ObjectSetInteger(0,Name,OBJPROP_HIDDEN,true);

   ObjectSetInteger(0,Name,OBJPROP_ZORDER,0);

   ObjectSetInteger(0,Name,OBJPROP_BGCOLOR,Color);

   ObjectSetInteger(0,Name,OBJPROP_COLOR,BorderColor);

   ObjectSetInteger(0,Name,OBJPROP_XSIZE,30);

   ObjectSetInteger(0,Name,OBJPROP_YSIZE,MathAbs((int)Level));

   ObjectSetInteger(0,Name,OBJPROP_XDISTANCE,10+hour*31);

   if(Level>0)

      ObjectSetInteger(0,Name,OBJPROP_YDISTANCE,55+Shift-(int)Level);

   if(Level<0)

      ObjectSetInteger(0,Name,OBJPROP_YDISTANCE,55+Shift);



   if(ObjectFind(0,Name2)>=0)

      ObjectDelete(Name2);

   if(!ObjectCreate(0,Name2,OBJ_LABEL,win,0,0))

      Print(__FUNCTION__,": don't create "+Name2+"! Error code = ",GetLastError());

   if(Level>0)

      ObjectSetText(Name2,DoubleToStr((int)HoursUp[hour],0),7,"Arial Bold",TextColor);

   if(Level<0)

      ObjectSetText(Name2,DoubleToStr((int)HoursDown[hour],0),7,"Arial Bold",TextColor);

   ObjectSet(Name2,OBJPROP_CORNER,CORNER_LEFT_UPPER);

   if(Level>0)

      ObjectSet(Name2,OBJPROP_XDISTANCE,12+hour*31+7-StringLen(DoubleToStr((int)HoursUp[hour],0)));

   if(Level<0)

      ObjectSet(Name2,OBJPROP_XDISTANCE,12+hour*31+7-StringLen(DoubleToStr((int)HoursDown[hour],0)));

   if(Level>0)

      ObjectSet(Name2,OBJPROP_YDISTANCE,40+Shift-(int)Level);

   if(Level<0)

      ObjectSet(Name2,OBJPROP_YDISTANCE,60+Shift-(int)Level);

  }

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

void Hours(int hour=-1)

  {

   if(hour<0 || hour>23)

      return;

   int win=WindowFind("Test hours "+DoubleToStr(Days,0)+" days | "+day+" |");

   string Name="Hour"+DoubleToStr(hour,0)+_Symbol;

   if(ObjectFind(0,Name)>=0)

      ObjectDelete(Name);

   if(!ObjectCreate(0,Name,OBJ_LABEL,win,0,0))

      Print(__FUNCTION__,": don't create "+Name+"! Error code = ",GetLastError());

   ObjectSetText(Name,DoubleToStr(hour,0)+"h",9,"Arial Bold",TextColor);

   if((int)HoursUp[hour]+(int)HoursDown[hour]>0)

      ObjectSetText(Name,DoubleToStr(hour,0)+"h",9,"Arial Bold",UpColor);

   if((int)HoursUp[hour]+(int)HoursDown[hour]<0)

      ObjectSetText(Name,DoubleToStr(hour,0)+"h",9,"Arial Bold",DownColor);

   ObjectSet(Name,OBJPROP_CORNER,CORNER_LEFT_UPPER);

   if(StringLen(DoubleToStr(hour,0))<2)

      ObjectSet(Name,OBJPROP_XDISTANCE,17+hour*31);

   if(StringLen(DoubleToStr(hour,0))>1)

      ObjectSet(Name,OBJPROP_XDISTANCE,13+hour*31);

   ObjectSet(Name,OBJPROP_YDISTANCE,20);

  }

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

void Spread()

  {

   int win=WindowFind("Test hours "+DoubleToStr(Days,0)+" days | "+day+" |");

   if(ObjectFind(0,"ClOp"+_Symbol)<0)

     {

      if(!ObjectCreate(0,"ClOp"+_Symbol,OBJ_LABEL,win,0,0))

         Print(__FUNCTION__,": don't create ClOp! Error code = ",GetLastError());

      ObjectSet("ClOp"+_Symbol,OBJPROP_CORNER,CORNER_LEFT_UPPER);

      ObjectSet("ClOp"+_Symbol,OBJPROP_XDISTANCE,15+24*31);

      ObjectSet("ClOp"+_Symbol,OBJPROP_YDISTANCE,85);

     }

   color Label=clrWhite;

   if((int)((Close[0]-Open[0])/_Point)>0)

      Label=clrDodgerBlue;

   if((int)((Close[0]-Open[0])/_Point)<0)

      Label=clrRed;

   ObjectSetText("ClOp"+_Symbol,"Close-Open: "+DoubleToStr((int)((Close[0]-Open[0])/_Point),0)+"p",8,"Arial Bold",Label);

//---

   if(ObjectFind(0,"Spread"+_Symbol)<0)

     {

      if(!ObjectCreate(0,"Spread"+_Symbol,OBJ_LABEL,win,0,0))

         Print(__FUNCTION__,": don't create Spread! Error code = ",GetLastError());

      ObjectSet("Spread"+_Symbol,OBJPROP_CORNER,CORNER_LEFT_UPPER);

      ObjectSet("Spread"+_Symbol,OBJPROP_XDISTANCE,15+24*31);

      ObjectSet("Spread"+_Symbol,OBJPROP_YDISTANCE,97);

     }

   ObjectSetText("Spread"+_Symbol,"Spread: "+DoubleToStr((int)MarketInfo(_Symbol,MODE_SPREAD),0)+"p",8,"Arial Bold",TextColor);

//---

   if(ObjectFind(0,"ClOpSpr"+_Symbol)<0)

     {

      if(!ObjectCreate(0,"ClOpSpr"+_Symbol,OBJ_LABEL,win,0,0))

         Print(__FUNCTION__,": don't create ClOpSpr! Error code = ",GetLastError());

      ObjectSet("ClOpSpr"+_Symbol,OBJPROP_CORNER,CORNER_LEFT_UPPER);

      ObjectSet("ClOpSpr"+_Symbol,OBJPROP_XDISTANCE,15+24*31);

      ObjectSet("ClOpSpr"+_Symbol,OBJPROP_YDISTANCE,109);

     }

   ObjectSetText("ClOpSpr"+_Symbol,"",8,"Arial Bold",clrNONE);

   if((int)((Close[0]-Open[0])/_Point)-(int)MarketInfo(_Symbol,MODE_SPREAD)>0)

     {

      Label=clrDodgerBlue;

      ObjectSetText("ClOpSpr"+_Symbol,"BUY: "+DoubleToStr((int)((Close[0]-Open[0])/_Point)-(int)MarketInfo(_Symbol,MODE_SPREAD),0)+"p",8,"Arial Bold",Label);

     }

   if((int)(-(Close[0]-Open[0])/_Point)-(int)MarketInfo(_Symbol,MODE_SPREAD)>0)

     {

      Label=clrRed;

      ObjectSetText("ClOpSpr"+_Symbol,"SELL: "+DoubleToStr((int)(-(Close[0]-Open[0])/_Point)-(int)MarketInfo(_Symbol,MODE_SPREAD),0)+"p",8,"Arial Bold",Label);

     }

  }

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

void Buttons()

  {

   int win=WindowFind("Test hours "+DoubleToStr(Days,0)+" days | "+day+" |");

   if(ObjectFind(0,"Autoday"+_Symbol)<0)

      ButtonCreate(0,"Autoday"+_Symbol,win,15+24*31,20,60,15,CORNER_LEFT_UPPER,"Auto day","Arial Bold",8,TextColor,ButtonsColor,clrNONE,

                   Autoday,false,false,true,0);



   if(ObjectFind(0,"HighLow"+_Symbol)<0)

      ButtonCreate(0,"HighLow"+_Symbol,win,15+24*31,36,60,15,CORNER_LEFT_UPPER,"High & Low","Arial Bold",8,TextColor,ButtonsColor,clrNONE,

                   HighLow,false,false,true,0);



   if(ObjectFind(0,"SummUpDown"+_Symbol)<0)

      ButtonCreate(0,"SummUpDown"+_Symbol,win,15+24*31,52,60,15,CORNER_LEFT_UPPER,"Up+Down","Arial Bold",8,TextColor,ButtonsColor,clrNONE,

                   SummUpDown,false,false,true,0);



   if(ObjectFind(0,"Average"+_Symbol)<0)

      ButtonCreate(0,"Average"+_Symbol,win,15+24*31,68,60,15,CORNER_LEFT_UPPER,"Average","Arial Bold",8,TextColor,ButtonsColor,clrNONE,

                   Average,false,false,true,0);

  }

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

bool ButtonCreate(const long              chart_ID=0,               

                  const string            name="Button",            

                  const int               sub_window=0,             

                  const int               x=0,                      

                  const int               y=0,                      

                  const int               width=50,                 

                  const int               height=18,                

                  const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, 

                  const string            text="Button",            

                  const string            font="Arial",             

                  const int               font_size=10,             

                  const color             clr=clrBlack,             

                  const color             back_clr=C'236,233,216',  

                  const color             border_clr=clrNONE,       

                  const bool              state=false,              

                  const bool              back=false,               

                  const bool              selection=false,          

                  const bool              hidden=true,              

                  const long              z_order=0)                

  {

   ResetLastError();

   if(!ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0))

     {

      Print(__FUNCTION__,": don't create button! Error code = ",GetLastError());

      return(false);

     }

   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);

   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);

   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);

   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);

   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);

   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);

   ObjectSetString(chart_ID,name,OBJPROP_FONT,font);

   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);

   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);

   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);

   ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);

   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);

   ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);

   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);

   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);

   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);

   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);

   return(true);

  }

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

bool ButtonDelete(const long   chart_ID=0,    // ID 3@0D8:0

                  const string name="Button") // 8<O :=>?:8

  {

   ResetLastError();

   if(!ObjectDelete(chart_ID,name))

     {

      Print(__FUNCTION__,": don't delete button! Error code = ",GetLastError());

      return(false);

     }

   return(true);

  }

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

Comments