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

//|                                                        Arrow.mq4 |

//|                        Copyright 2018, MetaQuotes Software Corp. |

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

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

#property strict

#property version     "1.0"

#property copyright   "Roman."

#property description "Donation"

#property description "Webmoney: Z330494414179, R222585888867"

#property description " "

#property description "Thank you very much."

#property indicator_chart_window



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

//| Custom indicator initialization function                         |

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

enum enum_bInfo

  {

   I1 = (int)true, // Show Info

   I2 = (int)false  // Hide Info

  };



enum enum_bUp

  {

   U1 = (int)true, // Hide on Top

   U2 = (int)false  // Draw on Back

  };



extern string ID_Chart = "Arrow";           //Indicator ID



extern string KeyInfo = "Q";                //Key Show/Hide Info

extern enum_bInfo bInfo = I1;               //Info Show/Hide

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

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

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



input color ColorPointerLines = clrBrown;   //Color Pointer Lines

input color StartColorLinesUp = clrLime;    //Color Line Up

input color StartColorLinesDn = clrRed;     //Color Line Down

input color StartColorTextUp = clrGreen;    //Color Lable Up

input color StartColorTextDn = clrMagenta;  //Color Lable Down

input int FontSize = 12;                    //Font Size

input int LengthArrowhead = 15;             //Length of Arrowhead in Pixels

input double ArrowheadGradus = 60;          //Angle of Arrowhead in Gradus



int XCoor, YCoor;

double ArrowheadRadian;



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

//|                                                                  |

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

void Draw()

  {

   string St = ID_Chart+" Rect ";

   ObjectsDeleteAll(0,"RectLabel" + ID_Chart);

   ObjectsDeleteAll(0,"Text" + ID_Chart);

   for(int ind = 0; ind < ObjectsTotal(); ind ++)

     {

      uint MapSrorrage[];



      string stName = ObjectName(ind);



      if(ObjectGetInteger(0, stName, OBJPROP_TYPE)!=OBJ_TREND || StringFind(stName,St) < 0)

         continue;



      string MasName = "::Maps" + string(ind) + "and" + string(ind),

             name = "RectLabel"+ID_Chart + IntegerToString(ind);



      color Color = (color)ObjectGetInteger(0,stName,OBJPROP_COLOR);



      int x, y, x0, y0;



      ChartTimePriceToXY(0, 0,

                         ObjectGetInteger(0,stName,OBJPROP_TIME2),

                         ObjectGetDouble(0,stName,OBJPROP_PRICE2),

                         x, y);



      ChartTimePriceToXY(0, 0,

                         ObjectGetInteger(0,stName,OBJPROP_TIME1),

                         ObjectGetDouble(0,stName,OBJPROP_PRICE1),

                         x0, y0);





      if(bInfo!=I2)

        {

         string tmpLabelTextName ="Text" + ID_Chart+"_"+string(ind);



         color colorText =

            ObjectGetDouble(0,stName,OBJPROP_PRICE1)>ObjectGetDouble(0,stName,OBJPROP_PRICE2)?

            StartColorTextDn:StartColorTextUp;



         ENUM_ANCHOR_POINT First, Second;

         if(ObjectGetDouble(0,stName,OBJPROP_PRICE1)>ObjectGetDouble(0,stName,OBJPROP_PRICE2))

           {

            if(ObjectGetInteger(0,stName,OBJPROP_TIME2)>ObjectGetInteger(0,stName,OBJPROP_TIME1))

              {

               First=ANCHOR_LEFT_UPPER;

               Second=ANCHOR_RIGHT_LOWER;

              }

            else

              {

               First=ANCHOR_RIGHT_UPPER;

               Second=ANCHOR_LEFT_LOWER;

              }

           }

         else

           {

            if(ObjectGetInteger(0,stName,OBJPROP_TIME2)>ObjectGetInteger(0,stName,OBJPROP_TIME1))

              {

               First=ANCHOR_LEFT_LOWER;

               Second=ANCHOR_RIGHT_UPPER;

              }

            else

              {

               First=ANCHOR_RIGHT_LOWER;

               Second=ANCHOR_LEFT_UPPER;

              }

           }

           

         TextCreate(tmpLabelTextName+"S", ObjectGetInteger(0,stName,OBJPROP_TIME2),                   // 2@5<O B>G:8 ?@82O7:8

                    ObjectGetDouble(0,stName,OBJPROP_PRICE2),                                         // F5=0 B>G:8 ?@82O7:8

                    DoubleToString(ObjectGetDouble(0,stName,OBJPROP_PRICE2),Digits)+

                    " ("+(string)MathRound(MathAbs(ObjectGetDouble(0,stName,OBJPROP_PRICE2)-

                    ObjectGetDouble(0,stName,OBJPROP_PRICE1))/Point)+")",                             // A0< B5:AB

                    "Arial", FontSize, First, colorText);

                    

         TextCreate(tmpLabelTextName+"D", ObjectGetInteger(0,stName,OBJPROP_TIME1),                   // 2@5<O B>G:8 ?@82O7:8

                    ObjectGetDouble(0,stName,OBJPROP_PRICE1),                                         // F5=0 B>G:8 ?@82O7:8

                    DoubleToString(ObjectGetDouble(0,stName,OBJPROP_PRICE1),Digits),                  // A0< B5:AB

                    "Arial", FontSize, Second, colorText);

        }



      ObjectCreate(name, OBJ_BITMAP_LABEL, 0, 0, 0);

      ObjectSetString(0, name, OBJPROP_BMPFILE, MasName);

      ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x - XCoor);

      ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y - YCoor - 2);

      ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_LEFT_UPPER);



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



      ArrayResize(MapSrorrage, 4 * XCoor * YCoor);



      if(x!=x0)

        {

         double Tangens = 0;

         double Angle = 0;

         Tangens =  double(y - y0) / double(x - x0);



         Angle = MathArctan(Tangens);

         if(ObjectGetInteger(0,stName,OBJPROP_TIME2)<ObjectGetInteger(0,stName,OBJPROP_TIME1))

           {

            Brezenhem(XCoor + (int)MathRound(((double)XCoor) * cos(Angle-ArrowheadRadian)),

                      XCoor + (int)MathRound(((double)XCoor) * sin(Angle-ArrowheadRadian)),

                      XCoor, YCoor, MapSrorrage, Color);



            Brezenhem(XCoor + (int)MathRound(((double)XCoor) * cos(Angle+ArrowheadRadian)),

                      XCoor + (int)MathRound(((double)XCoor) * sin(Angle+ArrowheadRadian)),

                      XCoor, YCoor, MapSrorrage, Color);

           }

         else

           {

            Brezenhem(XCoor - (int)MathRound(((double)XCoor) * cos(Angle-ArrowheadRadian)),

                      XCoor - (int)MathRound(((double)XCoor) * sin(Angle-ArrowheadRadian)),

                      XCoor, YCoor, MapSrorrage, Color);



            Brezenhem(XCoor - (int)MathRound(((double)XCoor) * cos(Angle+ArrowheadRadian)),

                      XCoor - (int)MathRound(((double)XCoor) * sin(Angle+ArrowheadRadian)),

                      XCoor, YCoor, MapSrorrage, Color);

           }

        }

      else

        {

         if(ObjectGetDouble(0,stName,OBJPROP_PRICE1)<ObjectGetDouble(0,stName,OBJPROP_PRICE2))

           {

            double Angle = M_PI_2;

            Brezenhem(XCoor + (int)MathRound(((double)XCoor) * cos(Angle-ArrowheadRadian)),

                      XCoor + (int)MathRound(((double)XCoor) * sin(Angle-ArrowheadRadian)),

                      XCoor, YCoor, MapSrorrage, Color);



            Brezenhem(XCoor + (int)MathRound(((double)XCoor) * cos(Angle+ArrowheadRadian)),

                      XCoor + (int)MathRound(((double)XCoor) * sin(Angle+ArrowheadRadian)),

                      XCoor, YCoor, MapSrorrage, Color);





           }

         else

           {

            double Angle = -M_PI_2;

            Brezenhem(XCoor + (int)MathRound(((double)XCoor) * cos(Angle-ArrowheadRadian)),

                      XCoor + (int)MathRound(((double)XCoor) * sin(Angle-ArrowheadRadian)),

                      XCoor, YCoor, MapSrorrage, Color);



            Brezenhem(XCoor + (int)MathRound(((double)XCoor) * cos(Angle+ArrowheadRadian)),

                      XCoor + (int)MathRound(((double)XCoor) * sin(Angle+ArrowheadRadian)),

                      XCoor, YCoor, MapSrorrage, Color);

           }

        }



      ResourceFree(MasName);

      ResourceCreate(MasName, MapSrorrage,

                     2 * XCoor,  2 * YCoor, 0, 0, 2 * YCoor, COLOR_FORMAT_ARGB_NORMALIZE);

     }

  }



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

//|                                                                  |

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

int StartDraw;

int OnInit()

  {

//--- indicator buffers mapping

   XCoor = LengthArrowhead;

   YCoor = LengthArrowhead;



   ArrowheadRadian = (ArrowheadGradus * M_PI) / 360.0f;



   StartDraw = 0;

   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);

//---

   return(INIT_SUCCEEDED);

  }



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

//|                                                                  |

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

void OnDeinit(const int reason)

  {

   EventKillTimer();

   ObjectsDeleteAll(0,"RectLabel"+ID_Chart);

  }

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

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

  {

//---

   Draw();

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

   return(rates_total);

  }



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

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

  }

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

int u = 0, kd = 1;

ulong ui;

double lprice;

datetime ltime;



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

//|                                                                  |

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

void OnChartEvent(const int id,

                  const long &lparam,

                  const double &dparam,

                  const string &sparam)

  {

   if(id==CHARTEVENT_CHART_CHANGE ||

      id==CHARTEVENT_OBJECT_CHANGE ||

      id==CHARTEVENT_OBJECT_DRAG )

      Draw();



   if(id==CHARTEVENT_MOUSE_MOVE)

     {

      int xlast=(int)lparam, ylast=(int)dparam;

      if(StartDraw>1)

        {

         datetime dt=0;

         double   price=0;

         int x=(int)lparam;

         int y=(int)dparam;

         int window=0;

         if(ChartXYToTimePrice(0,x,y,window,dt,price))

           {

            ObjectDelete(0,ID_Chart+" R Line");

            ObjectCreate(0,ID_Chart+" R Line",OBJ_HLINE,window,dt,price);

            ObjectSetInteger(0,ID_Chart+" R Line",OBJPROP_COLOR,ColorPointerLines);

            ObjectSetString(0,ID_Chart+" R Line",OBJPROP_TOOLTIP,DoubleToString(price,Digits));

            ObjectSetInteger(0,ID_Chart+" R Line",OBJPROP_SELECTABLE,false);

            ObjectSetInteger(0,ID_Chart+" R Line",OBJPROP_SELECTED,false);

            ObjectSetInteger(0,ID_Chart+" R Line",OBJPROP_STYLE,STYLE_DOT);

            ObjectDelete(0,ID_Chart+" P Line");

            ObjectCreate(0,ID_Chart+" P Line",OBJ_VLINE,window,dt,price);

            ObjectSetInteger(0,ID_Chart+" P Line",OBJPROP_COLOR,ColorPointerLines);

            ObjectSetString(0,ID_Chart+" P Line",OBJPROP_TOOLTIP,DoubleToString(price,Digits));

            ObjectSetInteger(0,ID_Chart+" P Line",OBJPROP_SELECTED,false);

            ObjectSetInteger(0,ID_Chart+" P Line",OBJPROP_STYLE,STYLE_DOT);

            LineCreate(0, ID_Chart+" Rect "+(string)kd, 0, ltime, lprice, dt, price);

            //ObjectDelete(0,ID_Chart+" Info");



            ChartRedraw(0);

            Draw();

           }

        }

     }



   if(id==CHARTEVENT_CLICK)

     {

      if(StartDraw>1)

        {

         StartDraw=0;

         ObjectDelete(0,ID_Chart+" R Line");

         ObjectDelete(0,ID_Chart+" P Line");

         ObjectDelete(0,ID_Chart+" H Line");

         ObjectDelete(0,ID_Chart+" V Line");

         //    ObjectDelete(0,ID_Chart+" Info");

         kd ++;

         return;

        }



      u++;

      if(!(GetMicrosecondCount() - 400000 < ui))

         u = 1;



      if(u == 1)

        {

         ui = GetMicrosecondCount();

         return;

        }



      if(u < 2)

         return;



      u = 0;



      datetime dt=0;

      double   price=0;

      int window=0;

      if(ChartXYToTimePrice(0,(int)lparam,(int)dparam,window,dt,price))

        {

         ObjectDelete(0,ID_Chart+" H Line");

         ObjectDelete(0,ID_Chart+" V Line");

         ObjectCreate(0,ID_Chart+" H Line",OBJ_HLINE,window,dt,price);

         ObjectCreate(0,ID_Chart+" V Line",OBJ_VLINE,window,dt,price);

         ObjectSetInteger(0,ID_Chart+" V Line",OBJPROP_COLOR,ColorPointerLines);

         ObjectSetString(0,ID_Chart+" V Line",OBJPROP_TOOLTIP,DoubleToString(price,Digits));

         ObjectSetInteger(0,ID_Chart+" V Line",OBJPROP_SELECTED,false);

         ObjectSetInteger(0,ID_Chart+" V Line",OBJPROP_STYLE,STYLE_DOT);

         ObjectSetInteger(0,ID_Chart+" H Line",OBJPROP_COLOR,ColorPointerLines);

         ObjectSetString(0,ID_Chart+" H Line",OBJPROP_TOOLTIP,DoubleToString(price,Digits));

         ObjectSetInteger(0,ID_Chart+" H Line",OBJPROP_SELECTED,false);

         ObjectSetInteger(0,ID_Chart+" H Line",OBJPROP_STYLE,STYLE_DOT);

         ChartRedraw(0);

         StartDraw=2;

         lprice=price;

         ltime=dt;

        }

     }



   if(id==CHARTEVENT_OBJECT_CLICK)

      u = 0;



   if(id==CHARTEVENT_KEYDOWN)

     {

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

        {

         bInfo=bInfo!=I1?I1:I2;

         Draw();

        }



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

        {

         bUp=bUp!=U1?U1:U2;

         Draw();

        }



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

        {

         bool tmp;

         ChartScaleFix11Get(tmp);

         ChartScaleFix11Set(!tmp);

         Draw();

        }

     }

  }



#define drPoint(Maps,x,y,uColor) if(x >=0 && y >= 0 && x < YCoor*2  &&  y < XCoor*2) MapSrorrage[2*x*XCoor+y] = ColorToARGB(uColor);



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

//|                                                                  |

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

void Brezenhem(int y2, int x2, int y1, int x1,uint & MapSrorrage[],color uColor)

  {

   int deltaX = MathAbs(x2 - x1);

   int deltaY = MathAbs(y2 - y1);

   int signX = x1 < x2 ? 1 : -1;

   int signY = y1 < y2 ? 1 : -1;

   int error = deltaX - deltaY;

   drPoint(MapSrorrage,x2,y2,uColor);

   while(x1 != x2 || y1 != y2)

     {

      drPoint(MapSrorrage,x1,y1,uColor);

      int error2 = error * 2;

      if(error2 > -deltaY)

        {

         error -= deltaY;

         x1 += signX;

        }

      if(error2 < deltaX)

        {

         error += deltaX;

         y1 += signY;

        }

     }

  }



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

//|                                                                  |

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

bool LineCreate(const long            chart_ID=0,

                const string          name="Rectangle",

                const int             sub_window=0,

                datetime              time1=0,

                double                price1=0,

                datetime              time2=0,

                double                price2=0,

                const bool            selection=false,

                const bool            hidden=true,

                const long            z_order=0)

  {

   ResetLastError();

   if(ObjectFind(name)==-1)

      ObjectCreate(chart_ID, name, OBJ_TREND, sub_window, time1, price1, time2, price2);

   else

     {

      ObjectSetInteger(chart_ID, name, OBJPROP_TIME1, time1);

      ObjectSetInteger(chart_ID, name, OBJPROP_TIME2, time2);

      ObjectSetDouble(chart_ID, name, OBJPROP_PRICE1, price1);

      ObjectSetDouble(chart_ID, name, OBJPROP_PRICE2, price2);

     }

   ObjectSetInteger(chart_ID,name, OBJPROP_COLOR,price1 > price2?

                    StartColorLinesDn:StartColorLinesUp);



   ObjectSetInteger(chart_ID,name, OBJPROP_SELECTABLE, true);

   ObjectSetInteger(chart_ID,name, OBJPROP_SELECTED, selection);

   ObjectSetInteger(chart_ID,name, OBJPROP_HIDDEN, hidden);

   ObjectSetInteger(chart_ID,name, OBJPROP_ZORDER, z_order);

   ObjectSetInteger(chart_ID,name, OBJPROP_RAY_RIGHT, false);

   return(true);

  }



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

//| !>7405B >1J5:B ""5:AB"                                           |

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

bool TextCreate(const string            name="Text",              // 8<O >1J5:B0

                datetime                time=0,                   // 2@5<O B>G:8 ?@82O7:8

                double                  price=0,                  // F5=0 B>G:8 ?@82O7:8

                const string            text="Text",              // A0< B5:AB

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

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

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

                const color             clr=clrRed,               // F25B

                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              chart_ID=0,               // ID 3@0D8:0

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

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

  {

//--- CAB0=>28< :>>@48=0BK B>G:8 ?@82O7:8, 5A;8 >=8 =5 7040=K



   ResetLastError();

//--- A>74048< >1J5:B ""5:AB"

   if(!ObjectCreate(chart_ID,name,OBJ_TEXT,sub_window,time,price))

     {

      Print(__FUNCTION__,

            ": =5 C40;>AL A>740BL >1J5:B \""5:AB\"! >4 >H81:8 = ",GetLastError());

      return(false);

     }

//--- 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< A?>A>1 ?@82O7:8

   ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);

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

   ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);

//--- 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 >1J5:B0 <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);

  }

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

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