Profile Mult

Author: Roman.
0 Views
0 Downloads
0 Favorites
Profile Mult
ÿþ//+------------------------------------------------------------------+

//|                                                     Futprint.mq4 |

//|                        Copyright 2018, MetaQuotes Software Corp. |

//|                                             https://www.mql5.com |

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

#property strict

#property version     "1.0"

#property copyright   "Roman."



#property description "If you like the indicator, you can thank the author"

#property description "Webmoney: Z330494414179, R222585888867"

#property description " "

#property description "Thank you very much."

#property indicator_chart_window



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

//| Custom indicator initialization function                         |

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

enum PColor

  {

   C1=0,// Mono Color

   C2=1,// Gauss Bell Color

   C3=2 // Rate Color

  };



enum enum_ShowLabelReDraw

  {

   S1=1, // Draw Label "Re Draw"

   S2=2, // Draw Label "Re Draw" with Time Frame

   S3=3, // Draw Only Time Frame

   S4=4  // Hide Update Label

  };



enum enum_bUp

  {

   U1=1, // Draw on Back

   U2=2  // Hide on Top

  };



extern string ID_Chart="Mult";//Indicator unique ID

extern ENUM_TIMEFRAMES IO = PERIOD_W1; //Draw Period

extern string Key_UpDnTF = "E;W"; // Key Up/Down TimeFrame



input string KeyTop="A";  //Key Change Draw Top/Back

extern enum_bUp bUp = U1; //Draw on Top/Back



extern enum_ShowLabelReDraw ShowLabelReDraw = S2;//Show/Hide Update Label

extern uint   Time_Redraw_Label = 20;//Time to Show Update Label in MilliSeconds



extern PColor Color = C2;  //Color Scheme

input string KeyRoll="Q";  //Key Change Color Scheme



extern color MainClr = clrTomato;  //Main/68 %/First Color



extern color Rate1 = clrYellow;   //95 %/Second Color



extern color Rate2 = clrAqua;   //5%/Third color



extern color Rate3 = clrGray; //Fourth color



extern string sRateDiv = "100;200;300"; //First,Second,Third Rate Factor



extern int iTimer = 150;  //Timer in MilliSeconds



input string KeyFix="Z"; //Key Change Fix 1:1

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

//|                                                                  |

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

int RateDiv1,RateDiv2,RateDiv3;

string KeyUpTF, KeyDnTF;

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

//|                                                                  |

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

int OnInit()

  {

   KeyUpTF = StringSubstr(Key_UpDnTF, 0, 1);

   KeyDnTF = StringSubstr(Key_UpDnTF, 2, 1);

   sRateDiv=StringTrimLeft(StringTrimRight(sRateDiv));

   if(StringSubstr(sRateDiv,StringLen(sRateDiv)-1,1)!=";")

      sRateDiv=StringConcatenate(sRateDiv,";");



   int s=0,i=StringFind(sRateDiv,";",s);



   string current;

   while(i>0)

     {

      current=StringSubstr(sRateDiv,s,i-s);

      if(RateDiv1==0)

         RateDiv1=(int)StringToInteger(current);

      else

         if(RateDiv2==0)

            RateDiv2=(int)StringToInteger(current);

         else

            if(RateDiv3==0)

               RateDiv3=(int)StringToInteger(current);

      s = i + 1;

      i = StringFind(sRateDiv,";",s);

     }



   EventSetMillisecondTimer(iTimer);

   Draw();

//---

   return(INIT_SUCCEEDED);

  }

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

//|                                                                  |

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

void OnTimer()

  {

   if(ShowLabelReDraw!=S4)

     {

      uint star = GetTickCount();

      uint IO_=IO;

      if(IO_ != PERIOD_CURRENT)

      if(IO_ <= (uint)Period()) IO_ = Period();

      

      Draw();

      string Message;

      switch(ShowLabelReDraw)

        {

         case S1:

            Message = "Re Draw";

            break;

         case S2:

            Message = "Re Draw ";

            switch(IO_)

              {

               case PERIOD_CURRENT:

                  Message += "Current";

                  break;

               case PERIOD_M1:

                  Message += "M1";

                  break;

               case PERIOD_M5:

                  Message += "M5";

                  break;

               case PERIOD_M15:

                  Message += "M15";

                  break;

               case PERIOD_M30:

                  Message += "M30";

                  break;

               case PERIOD_H1:

                  Message += "H1";

                  break;

               case PERIOD_H4:

                  Message += "H4";

                  break;

               case PERIOD_D1:

                  Message += "Daily";

                  break;

               case PERIOD_W1:

                  Message += "Weekly";

                  break;

               case PERIOD_MN1:

                  Message += "Monthly";

                  break;

              }

            break;

         case S3:

            Message = "";

            switch(IO_)

              {

               case PERIOD_CURRENT:

                  Message += "Current";

                  break;

               case PERIOD_M1:

                  Message += "M1";

                  break;

               case PERIOD_M5:

                  Message += "M5";

                  break;

               case PERIOD_M15:

                  Message += "M15";

                  break;

               case PERIOD_M30:

                  Message += "M30";

                  break;

               case PERIOD_H1:

                  Message += "H1";

                  break;

               case PERIOD_H4:

                  Message += "H4";

                  break;

               case PERIOD_D1:

                  Message += "Daily";

                  break;

               case PERIOD_W1:

                  Message += "Weekly";

                  break;

               case PERIOD_MN1:

                  Message += "Monthly";

                  break;

              }

            break;

        }

      if(GetTickCount() - star>Time_Redraw_Label)

         OutText("Redraw"+ID_Chart, Message,

                 (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0)/2,

                 (int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0)/2,

                 clrTomato,23);

      else

         ObjectDelete(0,"Redraw"+ID_Chart);

     }

   else

      Draw();

  }

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

//|                                                                  |

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

int DrawHigh[], DrawLow[], DrawT[], IndexS[];

void Draw()

  {

   if(IO <= Period())

      Draws();

   else

      DrawS();

  }



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

//|                                                                  |

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

void DrawS()

  {

   double H[], L[], F[];

   long V[];

   int FVB = ChartFirstVisibleBar(), VB = ChartVisibleBars(), vB = FVB - VB, iArraySize = ArraySize(DrawHigh);



   FVB = iBarShift(NULL,0,Time[FVB] - IO * 60 - 1);

   

   bool ReDraw = false;



   if(iArraySize == 0)

      ReDraw = true;

   else

      for(int i = 0; i < iArraySize; i ++)

        {

         int h,l,t;

         ChartTimePriceToXY(0,0,Time[IndexS[i]],High[IndexS[i]],t,h);

         ChartTimePriceToXY(0,0,Time[IndexS[i]],Low[IndexS[i]],t,l);

         if((DrawHigh[i] != h || DrawLow[i] != l || t != DrawT[i]) && IndexS[i] != 0)

           {

            ReDraw = true;

            break;

           }

        }



   if(ReDraw)

     {

      ObjectsDeleteAll(0,"RectLabel"+ID_Chart);

      ArrayFree(DrawT);

      ArrayFree(DrawHigh);

      ArrayFree(DrawLow);

      ArrayFree(IndexS);

     }



   ulong  star = GetMicrosecondCount(), ulong_ = iTimer * 800;

   int indexS = -1;



   for(int index = vB; index <= FVB; index ++)

     {

      if(index < 0)

         continue;



      datetime  CTime[];

      CopyTime(_Symbol,IO,Time[index],1,CTime);



      if(ArraySize(CTime)<1)

         continue;

      if(!(Time[index] >= CTime[0] && Time[index+1] < CTime[0]))

         continue;



      double Ch[], Cl[];

      CopyHigh(_Symbol,IO,Time[index],1,Ch);

      CopyLow(_Symbol,IO,Time[index],1,Cl);



      if(ulong_ < GetMicrosecondCount() - star)

         return;



      indexS ++;

      int x, y, w;



      if((indexS < ArraySize(DrawHigh) && indexS!=0)||

         CopyTickVolume(_Symbol, PERIOD_M1, Time[index], Time[index] + PeriodSeconds(IO) - 1, V) <= 0 ||

         CopyHigh(_Symbol, PERIOD_M1, Time[index], Time[index] + PeriodSeconds(IO) - 1, H) <= 0 ||

         CopyLow(_Symbol, PERIOD_M1, Time[index], Time[index] + PeriodSeconds(IO) - 1, L) <= 0)

         continue;



      ArrayFree(F);

      ArrayResize(F,(int)((Ch[0]-Cl[0])/Point)+1);



      iArraySize = ArraySize(V);

      int Size = ArraySize(F);

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

        {

         int E = (int)((L[j]-Cl[0])/Point);



         if(H[j]!=L[j])

           {

            double tmp = (H[j]-L[j])/Point, g = V[j]/tmp;

            for(int k = 0; k < (int)tmp; k++)

              {

               if(E + k < Size && E + k >= 0)

                  F[E + k] += g;

              }

           }

         else

            if(E < Size && E >= 0)

               F[E] += (double)V[j];

        }



      ChartTimePriceToXY(0,0,Time[index],High[index],x,y);

      ChartTimePriceToXY(0,0,Time[index]+PeriodSeconds(IO),High[index],w,y);



      double MaxV =  F[ArrayMaximum(F)];



      if(MaxV<1)

         continue;



      MaxV = MathAbs(w-x) > 12? (MathAbs(w-x)-3) / MaxV: MathAbs(w-x) / MaxV;



      iArraySize = ArraySize(F);

      double PrevSumm = 0, SummValue = 0;

      if(Color == C2)

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

            SummValue+=F[j];



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

        {

         int Horizontal= (int)(MaxV * F[j]);

         if(Horizontal==0)

            continue;

         ChartTimePriceToXY(0, 0, Time[index], Cl[0] + Point * j, x, y);

         string name = "RectLabel" + ID_Chart + IntegerToString(index) + "_" + IntegerToString(j);

         ObjectCreate(name,OBJ_RECTANGLE_LABEL,0,0,0);

         ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);

         ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y - 3);

         ObjectSetInteger(0,name,OBJPROP_XSIZE,Horizontal);

         ObjectSetInteger(0,name,OBJPROP_YSIZE,3);

         switch(Color)

           {

            case C1:

               ObjectSetInteger(0,name,OBJPROP_BGCOLOR,MainClr);

               break;

            case C2:

               PrevSumm += F[j];

               if(PrevSumm / SummValue < 0.025f || PrevSumm / SummValue > 0.975f)

                  ObjectSetInteger(0,name,OBJPROP_BGCOLOR,Rate2);

               else

                 {

                  if(PrevSumm / SummValue < 0.16f  || PrevSumm / SummValue > 0.84f)

                     ObjectSetInteger(0,name,OBJPROP_BGCOLOR,Rate1);

                  else

                     ObjectSetInteger(0,name,OBJPROP_BGCOLOR,MainClr);

                 }

               break;

            case C3:

               if(F[j]<RateDiv1)

                 {

                  ObjectSetInteger(0,name,OBJPROP_BGCOLOR,Rate3);

                  break;

                 }

               if(F[j]<RateDiv2)

                 {

                  ObjectSetInteger(0,name,OBJPROP_BGCOLOR,Rate2);

                  break;

                 }

               if(F[j]<RateDiv3)

                 {

                  ObjectSetInteger(0,name,OBJPROP_BGCOLOR,Rate1);

                  break;

                 }

               ObjectSetInteger(0,name,OBJPROP_BGCOLOR,MainClr);

               break;

           }

         ObjectSetInteger(0,name,OBJPROP_WIDTH,0);

         ObjectSetInteger(0,name,OBJPROP_BACK,bUp!=U2?true:false);

        }



      ArrayResize(DrawHigh,ArraySize(DrawHigh)+1);

      ArrayResize(DrawLow,ArraySize(DrawLow)+1);

      ArrayResize(IndexS,ArraySize(IndexS)+1);

      ArrayResize(DrawT,ArraySize(DrawT)+1);



      ChartTimePriceToXY(0,0,Time[index],High[index],y,x);

      ChartTimePriceToXY(0,0,Time[index],Low[index],y,w);



      DrawT[ArraySize(DrawT)-1]=y;

      DrawHigh[ArraySize(DrawHigh)-1]=x;

      DrawLow[ArraySize(DrawLow)-1]=w;

      IndexS[ArraySize(IndexS)-1]=index;

     }

  }



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

//|                                                                  |

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

void Draws()

  {

   double H[], L[], F[];

   long V[];

   int FVB = ChartFirstVisibleBar(), VB = ChartVisibleBars(), vB = FVB - VB, iArraySize = ArraySize(DrawHigh);

   bool ReDraw = false;



   if(iArraySize == 0)

      ReDraw = true;

   else

      for(int i = 0; i < iArraySize; i ++)

        {

         int h,l,t;

         ChartTimePriceToXY(0,0,Time[IndexS[i]],High[IndexS[i]],t,h);

         ChartTimePriceToXY(0,0,Time[IndexS[i]],Low[IndexS[i]],t,l);

         if((DrawHigh[i] != h || DrawLow[i] != l || t != DrawT[i]) && IndexS[i] != 0)

           {

            ReDraw = true;

            break;

           }

        }



   if(ReDraw)

     {

      ObjectsDeleteAll(0,"RectLabel"+ID_Chart);

      ArrayFree(DrawT);

      ArrayFree(DrawHigh);

      ArrayFree(DrawLow);

      ArrayFree(IndexS);

     }



   ulong  star = GetMicrosecondCount(), ulong_ = iTimer*800;

   int indexS = -1;



   for(int index = vB; index <= FVB; index ++)

     {

      if(ulong_ < GetMicrosecondCount() - star)

         return;



      indexS++;

      int x, y, w;



      if(index < 0 ||

         (indexS < ArraySize(DrawHigh) && index!=0)||

         CopyTickVolume(_Symbol, PERIOD_M1, Time[index], Time[index] + PeriodSeconds() - 1, V) <= 0 ||

         CopyHigh(_Symbol, PERIOD_M1, Time[index], Time[index] + PeriodSeconds() - 1, H) <= 0 ||

         CopyLow(_Symbol, PERIOD_M1, Time[index], Time[index] + PeriodSeconds() - 1, L) <= 0)

         continue;



      ArrayFree(F);

      ArrayResize(F,(int)((High[index]-Low[index])/Point)+1);



      iArraySize = ArraySize(V);

      int Size = ArraySize(F);

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

        {

         int E = (int)((L[j]-Low[index])/Point);



         if(H[j]!=L[j])

           {

            double tmp = (H[j]-L[j])/Point, g = V[j]/tmp;

            for(int k = 0; k < (int)tmp; k++)

              {

               if(E + k < Size && E + k >= 0)

                  F[E + k] += g;

              }

           }

         else

            F[E] += (double)V[j];

        }



      ChartTimePriceToXY(0,0,Time[index],High[index],x,y);

      ChartTimePriceToXY(0,0,Time[index+1],High[index],w,y);



      double MaxV =  F[ArrayMaximum(F)];



      if(MaxV<1)

         continue;



      MaxV = MathAbs(w-x) / MaxV;



      iArraySize = ArraySize(F);

      double PrevSumm = 0, SummValue = 0;

      if(Color == C2)

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

            SummValue+=F[j];



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

        {

         int Horizontal= (int)(MaxV * F[j]);

         if(Horizontal==0)

            continue;

         ChartTimePriceToXY(0, 0, Time[index], Low[index] + Point * j, x, y);

         string name = "RectLabel" + ID_Chart + IntegerToString(index) + "_" + IntegerToString(j);

         ObjectCreate(name,OBJ_RECTANGLE_LABEL,0,0,0);

         ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);

         ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y - 3);

         ObjectSetInteger(0,name,OBJPROP_XSIZE,Horizontal);

         ObjectSetInteger(0,name,OBJPROP_YSIZE,3);



         switch(Color)

           {

            case C1:

               ObjectSetInteger(0,name,OBJPROP_BGCOLOR,MainClr);

               break;

            case C2:

               PrevSumm += F[j];

               if(PrevSumm / SummValue < 0.025f || PrevSumm / SummValue > 0.975f)

                  ObjectSetInteger(0,name,OBJPROP_BGCOLOR,Rate2);

               else

                 {

                  if(PrevSumm / SummValue < 0.16f  || PrevSumm / SummValue > 0.84f)

                     ObjectSetInteger(0,name,OBJPROP_BGCOLOR,Rate1);

                  else

                     ObjectSetInteger(0,name,OBJPROP_BGCOLOR,MainClr);

                 }

               break;

            case C3:

               if(F[j]<RateDiv1)

                 {

                  ObjectSetInteger(0,name,OBJPROP_BGCOLOR,Rate3);

                  break;

                 }

               if(F[j]<RateDiv2)

                 {

                  ObjectSetInteger(0,name,OBJPROP_BGCOLOR,Rate2);

                  break;

                 }

               if(F[j]<RateDiv3)

                 {

                  ObjectSetInteger(0,name,OBJPROP_BGCOLOR,Rate1);

                  break;

                 }

               ObjectSetInteger(0,name,OBJPROP_BGCOLOR,MainClr);

               break;

           }

         ObjectSetInteger(0,name,OBJPROP_WIDTH,0);

         ObjectSetInteger(0,name,OBJPROP_BACK,bUp!=U2?true:false);

        }



      ArrayResize(DrawHigh,ArraySize(DrawHigh)+1);

      ArrayResize(DrawLow,ArraySize(DrawLow)+1);

      ArrayResize(IndexS,ArraySize(IndexS)+1);

      ArrayResize(DrawT,ArraySize(DrawT)+1);



      ChartTimePriceToXY(0,0,Time[index],High[index],y,x);

      ChartTimePriceToXY(0,0,Time[index],Low[index],y,w);



      DrawT[ArraySize(DrawT)-1]=y;

      DrawHigh[ArraySize(DrawHigh)-1]=x;

      DrawLow[ArraySize(DrawLow)-1]=w;

      IndexS[ArraySize(IndexS)-1]=index;

     }

  }



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

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

  {

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

   if(IsTesting())

      Draw();

   return(rates_total);

  }

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

void OnDeinit(const int reason)

  {

   EventKillTimer();

   ObjectsDeleteAll(0,"RectLabel"+ID_Chart);

   ObjectDelete(0,"Redraw"+ID_Chart);

  }

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



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

//| $C=:F8O ?>;CG05B =><5@ ?5@2>3> 2848<>3> 10@0 =0 3@0D8:5.         |

//| =45:A0F8O :0: 2 B09<A5@88, ?>A;54=85 10@K 8<5NB <5=LH85 8=45:AK.|

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

int ChartFirstVisibleBar(const long chart_ID=0)

  {

//--- ?>43>B>28< ?5@5<5==CN 4;O ?>;CG5=8O 7=0G5=8O A2>9AB20

   long result=-1;

//--- A1@>A8< 7=0G5=85 >H81:8

   ResetLastError();

//--- ?>;CG8< 7=0G5=85 A2>9AB20

   if(!ChartGetInteger(chart_ID,CHART_FIRST_VISIBLE_BAR,0,result))

     {

      //--- 2K2545< A>>1I5=85 >1 >H81:5 2 6C@=0; "-:A?5@BK"

      Print(__FUNCTION__+", Error Code = ",GetLastError());

     }

//--- 25@=5< 7=0G5=85 A2>9AB20 3@0D8:0

   return((int)result);

  }

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

//| $C=:F8O ?>;CG05B :>;8G5AB2> 10@>2, :>B>@K5 >B>1@060NBAO (2848<K )|

//| 2 >:=5 3@0D8:0.                                                  |

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

int ChartVisibleBars(const long chart_ID=0)

  {

//--- ?>43>B>28< ?5@5<5==CN 4;O ?>;CG5=8O 7=0G5=8O A2>9AB20

   long result=-1;

//--- A1@>A8< 7=0G5=85 >H81:8

   ResetLastError();

//--- ?>;CG8< 7=0G5=85 A2>9AB20

   if(!ChartGetInteger(chart_ID,CHART_VISIBLE_BARS,0,result))

     {

      //--- 2K2545< A>>1I5=85 >1 >H81:5 2 6C@=0; "-:A?5@BK"

      Print(__FUNCTION__+", Error Code = ",GetLastError());

     }

//--- 25@=5< 7=0G5=85 A2>9AB20 3@0D8:0

   return((int)result);

  }

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

bool OutText(const string            name="Label",                 // 8<O <5B:8

             const string            text="Label",             // B5:AB

             const int               x=0,                      // :>>@48=0B0 ?> >A8 X

             const int               y=0,                      // :>>@48=0B0 ?> >A8 Y

             const color             clr=clrYellow,               // F25B

             const int               font_size=12,             // @07<5@ H@8DB0

             const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // C3>; 3@0D8:0 4;O ?@82O7:8

             const ENUM_ANCHOR_POINT anchor=ANCHOR_CENTER, // A?>A>1 ?@82O7:8

             const string            font="Arial",             // H@8DB

             const double            angle=0.0,                // =0:;>= B5:AB0

             const bool              back=false,               // =0 704=5< ?;0=5

             const bool              selection=false,          // 2K45;8BL 4;O ?5@5<5I5=89

             const bool              hidden=true,              // A:@KB 2 A?8A:5 >1J5:B>2

             const long              z_order=0,

             const int               sub_window=0,             // =><5@ ?>4>:=0

             const long              chart_ID=0               // ID 3@0D8:0

            )                // ?@8>@8B5B =0 =060B85 <KHLN

  {

//--- A1@>A8< 7=0G5=85 >H81:8

   ResetLastError();

//--- A>74048< B5:AB>2CN <5B:C

   if(ObjectFind(chart_ID,name)==-1)

     {

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

        {

         Print(__FUNCTION__, ": =5 C40;>AL A>740BL B5:AB>2CN <5B:C! >4 >H81:8 = ",GetLastError());

         //       return(false);

        }

     }

//--- CAB0=>28< :>>@48=0BK <5B:8

   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);

   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);

//--- CAB0=>28< C3>; 3@0D8:0, >B=>A8B5;L=> :>B>@>3> 1C4CB >?@545;OBLAO :>>@48=0BK B>G:8

   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);

//--- CAB0=>28< B5:AB

   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);

//--- CAB0=>28< H@8DB B5:AB0

   ObjectSetString(chart_ID,name,OBJPROP_FONT,font);

//--- CAB0=>28< @07<5@ H@8DB0

   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);

//--- CAB0=>28< C3>; =0:;>=0 B5:AB0

   ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);

//--- CAB0=>28< A?>A>1 ?@82O7:8

   ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);

//--- CAB0=>28< F25B

   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);

//--- >B>1@078< =0 ?5@54=5< (false) 8;8 704=5< (true) ?;0=5

   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);

//--- 2:;NG8< (true) 8;8 >B:;NG8< (false) @568< ?5@5<5I5=8O <5B:8 <KHLN

   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);

   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);

//--- A:@>5< (true) 8;8 >B>1@078< (false) 8<O 3@0D8G5A:>3> >1J5:B0 2 A?8A:5 >1J5:B>2

   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);

//--- CAB0=>28< ?@8>@8B5B =0 ?>;CG5=85 A>1KB8O =060B8O <KH8 =0 3@0D8:5

   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);

//--- CA?5H=>5 2K?>;=5=85

   return(true);

  }

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

void OnChartEvent(const int id,

                  const long &lparam,

                  const double &dparam,

                  const string &sparam)

  {

//---

   if(id==CHARTEVENT_KEYDOWN)

     {



      if((int)lparam==StringGetChar(KeyDnTF,0))

        {

         IO = IO!= PERIOD_CURRENT ? IO: (ENUM_TIMEFRAMES)Period();

         switch(IO)

           {

            case PERIOD_M5:

            if(Period()<=(int)PERIOD_M1)

               IO = PERIOD_M1;

               else IO = (ENUM_TIMEFRAMES)Period();

               break;

            case PERIOD_M15:

            if(Period()<=PERIOD_M5)            

               IO = PERIOD_M5;

               else IO = (ENUM_TIMEFRAMES)Period();               

               break;

            case PERIOD_M30:

            if(Period()<=(int)PERIOD_M15)             

               IO = PERIOD_M15;

               else IO = (ENUM_TIMEFRAMES)Period();               

               break;

            case PERIOD_H1:

            if(Period()<=(int)PERIOD_M30)               

               IO = PERIOD_M30;

               else IO = (ENUM_TIMEFRAMES)Period();                 

               break;

            case PERIOD_H4:

            if(Period()<=(int)PERIOD_H1)            

               IO = PERIOD_H1;

               else IO = (ENUM_TIMEFRAMES)Period();                 

               break;

            case PERIOD_D1:

            if(Period()<=(int)PERIOD_H4)             

               IO = PERIOD_H4;

               else IO = (ENUM_TIMEFRAMES)Period();                 

               break;

            case PERIOD_W1:

            if(Period()<=(int)PERIOD_D1)             

               IO = PERIOD_D1;

               else IO = (ENUM_TIMEFRAMES)Period();                 

               break;

            case PERIOD_MN1:

            if(Period()<=(int)PERIOD_W1)             

               IO = PERIOD_W1;

               else IO = (ENUM_TIMEFRAMES)Period();                 

               break;

           }

         ArrayFree(DrawT);

         ArrayFree(DrawHigh);

         ArrayFree(DrawLow);

         ArrayFree(IndexS);

        }

      if((int)lparam==StringGetChar(KeyUpTF,0))

        {

         IO = IO!= PERIOD_CURRENT ? IO: (ENUM_TIMEFRAMES)Period();

         switch(IO)

           {

            case PERIOD_M1:

               IO = PERIOD_M15;

               break;

            case PERIOD_M15:

               IO = PERIOD_M30;

               break;

            case PERIOD_M30:

               IO = PERIOD_H1;

               break;

            case PERIOD_H1:

               IO = PERIOD_H4;

               break;

            case PERIOD_H4:

               IO = PERIOD_D1;

               break;

            case PERIOD_D1:

               IO = PERIOD_W1;

               break;

            case PERIOD_W1:

               IO = PERIOD_MN1;

               break;

           }

         ArrayFree(DrawT);

         ArrayFree(DrawHigh);

         ArrayFree(DrawLow);

         ArrayFree(IndexS);

        }







      if((int)lparam==StringGetChar(KeyRoll,0))

        {

         switch(Color)

           {

            case C1:

               Color = C2;

               break;

            case C2:

               Color = C3;

               break;

            case C3:

               Color = C1;

               break;

           };

         ArrayFree(DrawT);

         ArrayFree(DrawHigh);

         ArrayFree(DrawLow);

         ArrayFree(IndexS);

        }

      if((int)lparam==StringGetChar(KeyTop,0))

        {

         bUp=bUp!=U1?U1:U2;

         ArrayFree(DrawT);

         ArrayFree(DrawHigh);

         ArrayFree(DrawLow);

         ArrayFree(IndexS);

        }

      if((int)lparam==StringGetChar(KeyFix,0))

        {

         bool tmp;

         ChartScaleFix11Get(tmp);

         ChartScaleFix11Set(!tmp);

         ArrayFree(DrawT);

         ArrayFree(DrawHigh);

         ArrayFree(DrawLow);

         ArrayFree(IndexS);

        }

     }

  }

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

bool ChartScaleFix11Get(bool &result,const long chart_ID=0)

  {

//--- ?>43>B>28< ?5@5<5==CN 4;O ?>;CG5=8O 7=0G5=8O A2>9AB20

   long value;

//--- A1@>A8< 7=0G5=85 >H81:8

   ResetLastError();

//--- ?>;CG8< 7=0G5=85 A2>9AB20

   if(!ChartGetInteger(chart_ID,CHART_SCALEFIX,0,value))

     {

      //--- 2K2545< A>>1I5=85 >1 >H81:5 2 6C@=0; "-:A?5@BK"

      Print(__FUNCTION__+", Error Code = ",GetLastError());

      return(false);

     }

//--- 70?><=8< 2 ?5@5<5==CN 7=0G5=85 A2>9AB20 3@0D8:0

   result=value;

//--- CA?5H=>5 2K?>;=5=85

   return(true);

  }

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

//| $C=:F8O 2:;NG05B/2K:;NG05B @568< <0AHB010 "1:1"                  |

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

bool ChartScaleFix11Set(const bool value,const long chart_ID=0)

  {

//--- A1@>A8< 7=0G5=85 >H81:8

   ResetLastError();

//--- CAB0=>28< 7=0G5=85 A2>9AB20

   if(!ChartSetInteger(chart_ID,CHART_SCALEFIX,0,value))

     {

      //--- 2K2545< A>>1I5=85 >1 >H81:5 2 6C@=0; "-:A?5@BK"

      Print(__FUNCTION__+", Error Code = ",GetLastError());

      return(false);

     }

//--- CA?5H=>5 2K?>;=5=85

   return(true);

  }

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



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



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

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 ---