Skyscraper_Fix_HTF_Signal

Author: Copyright © 2018, Nikolay Kositsin
Price Data Components
Miscellaneous
It plays sound alerts
0 Views
0 Downloads
0 Favorites
Skyscraper_Fix_HTF_Signal
ÿþ//+------------------------------------------------------------------+ 

//|                                    Skyscraper_Fix_HTF_Signal.mq5 | 

//|                               Copyright © 2018, Nikolay Kositsin | 

//|                              Khabarovsk,   farria@mail.redcom.ru | 

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

#property copyright "Copyright © 2018, Nikolay Kositsin"

#property link "farria@mail.redcom.ru" 

//---- =><5@ 25@A88 8=48:0B>@0

#property version   "1.60"

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

//|  0@0<5B@K >B@8A>2:8 8=48:0B>@0                |

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

//---- >B@8A>2:0 8=48:0B>@0 2 3;02=>< >:=5

#property indicator_chart_window 

#property indicator_buffers 0

#property indicator_plots   0

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

//|  >1JO2;5=85 :>=AB0=B                           |

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

#define INDICATOR_NAME      "Skyscraper_Fix"    // <O 8=48:0B>@0

#define RESET               0                   // >=AB0=B0 4;O 2>72@0B0 B5@<8=0;C :><0=4K =0 ?5@5AG5B 8=48:0B>@0

#define NAMES_SYMBOLS_FONT  "Georgia"           // (@8DB 4;O =0720=8O 8=48:0B>@0

#define SIGNAL_SYMBOLS_FONT "Wingdings 3"       // (@8DB 4;O A8<2>;0 2E>40 2 ?>78F8N

#define TREND_SYMBOLS_FONT  "Wingdings 3"       // (@8DB 4;O A8<2>;0 B@5=40

#define UP_SIGNAL_SYMBOL    "6"                 // !8<2>; 4;O >B:@K20=8O long

#define DN_SIGNAL_SYMBOL    "8"                 // !8<2>; 4;O >B:@K20=8O short

#define UP_TREND_SYMBOL     "2"                 // !8<2>; 4;O @0ABCI53> B@5=40

#define DN_TREND_SYMBOL     "2"                 // !8<2>; 4;O ?040NI53> B@5=40

#define BUY_SOUND           "alert.wav"         // 2C:>2>9 D09; 4;O 2E>40 2 long

#define SELL_SOUND          "alert.wav"         // 2C:>2>9 D09; 4;O 2E>40 2 short

#define BUY_ALERT_TEXT      "!83=0; =0 ?>:C?:C" // "5:AB 0;5@B0 4;O 2E>40 2 long

#define SELL_ALERT_TEXT     "!83=0; =0 ?@>406C" // "5:AB 0;5@B0 4;O 2E>40 2 short

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

//| 5@5G8A;5=85 4;O 8=48:0F88 A@010BK20=8O C@>2=O |

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

enum ENUM_ALERT_MODE // "8? :>=AB0=BK

  {

   OnlySound,   // B>;L:> 72C:

   OnlyAlert    // B>;L:> 0;5@B

  };

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

//| 1JO2;5=85 ?5@5G8A;5=89                        |

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

enum Method

  {

   MODE_HighLow,  //High/Low

   MODE_Close     //Close

  };

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

//|  E>4=K5 ?0@0<5B@K 8=48:0B>@0                  |

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

input string Symbol_="";                               // $8=0=A>2K9 0:B82

input ENUM_TIMEFRAMES Timeframe=PERIOD_H6;             // "09<D@59< 8=48:0B>@0 4;O @0AG5B0 8=48:0B>@0

input uint    Length=10;                               // 5@8>4 ATR

input double  Kv=0.9;                                  // $0:B>@ GC2AB28B5;L=>AB8 8=48:0B>@0

input double  Percentage=0;                            // @81;865=85 A@54=59 ;8=88 : ;8=8O< M:AB@5<C<>2

input Method  HighLow=MODE_HighLow;                    //  0AGQB 8=48:0B>@0 ?> High/Low 8;8 Close

//---- =0AB@>9:8 287C0;L=>3> >B>1@065=8O 8=48:0B>@0

input uint SignalBar=0;                                // ><5@ 10@0 4;O ?>;CG5=8O A83=0;0 (0 - B5:CI89 10@)

input string Symbols_Sirname=INDICATOR_NAME"_Label_";  // 0720=85 4;O <5B>: 8=48:0B>@0

input color UpSymol_Color=clrLimeGreen;                // &25B A8<2>;0 @>AB0

input color DnSymol_Color=clrDeepPink;                 // &25B A8<2>;0 ?045=8O

input color IndName_Color=clrDarkOrchid;               // &25B =0720=8O 8=48:0B>@0

input uint Symbols_Size=60;                            //  07<5@ A8<2>;>2 A83=0;0

input uint Font_Size=10;                               //  07<5@ H@8DB0 =0720=8O 8=48:0B>@0

input int X_1=5;                                       // !<5I5=85 =0720=8O ?> 3>@87>=B0;8

input int Y_1=-15;                                     // !<5I5=85 =0720=8O ?> 25@B8:0;8

input bool ShowIndName=true;                           // B>1@065=85 =0720=8O 8=48:0B>@0

input ENUM_BASE_CORNER  WhatCorner=CORNER_RIGHT_UPPER; // #3>; @0A?>;>65=8O

input uint X_=0;                                       // !<5I5=85 ?> 3>@87>=B0;8

input uint Y_=20;                                      // !<5I5=85 ?> 25@B8:0;8

//---- =0AB@>9:8 0;5@B>2

input ENUM_ALERT_MODE alert_mode=OnlySound;            // 0@80=B 8=48:0F88 A@010BK20=8O

input uint AlertCount=0;                               // >;8G5AB2> ?>40205<KE 0;5@B>2

input bool Push=true;                                  //  07@5H5=85 =0 ?5@540GC push-A>>1I5=89

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

//---- >1JO2;5=85 F5;>G8A;5==KE ?5@5<5==KE 4;O E5=4;>2 8=48:0B>@>2

int Skyscraper_Fix_Handle;

//---- >1JO2;5=85 F5;>G8A;5==KE ?5@5<5==KE =0G0;0 >BAG5B0 40==KE

int min_rates_total;

//---- >1JO2;5=85 F5;>G8A;5==KE ?5@5<5==KE @0A?>;>65=8O 8=45:A>2 ?> 3>@87>=B0;8 8 25@B8:0;8

uint X_0,Yn,X_1_,Y_1_;

//---- >1JO2;5=85 ?5@5<5==KE 4;O 8<5= <5B>:

string name0,name1,IndName,Symb;

//---- >1JO2;5=85 ?5@5<5==KE 4;O B5:AB0 0;5@B>2

string BuySignal,SellSignal;

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

//|  >;CG5=85 B09<D@59<0 2 2845 AB@>:8                              |

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

string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)

  {

   return(StringSubstr(EnumToString(timeframe),7,-1));

  }

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

//|  !>740=85 B5:AB>2>9 <5B:8                                        |

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

void CreateTLabel(long   chart_id,         // 845=B8D8:0B>@ 3@0D8:0

                  string name,             // 8<O >1J5:B0

                  int    nwin,             // 8=45:A >:=0

                  ENUM_BASE_CORNER corner, // ?>;>65=85 C3;0 ?@82O7:8

                  ENUM_ANCHOR_POINT point, // ?>;>65=85 B>G:8 ?@82O7:8

                  int    X,                // 48AB0=F8O 2 ?8:A5;OE ?> >A8 X >B C3;0 ?@82O7:8

                  int    Y,                // 48AB0=F8O 2 ?8:A5;OE ?> >A8 Y >B C3;0 ?@82O7:8

                  string text,             // B5:AB

                  string textTT,           // B5:AB 2A?;K20NI59 ?>4A:07:8

                  color  Color,            // F25B B5:AB0

                  string Font,             // H@8DB B5:AB0

                  int    Size)             // @07<5@ H@8DB0

  {

//----

   ObjectCreate(chart_id,name,OBJ_LABEL,0,0,0);

   ObjectSetInteger(chart_id,name,OBJPROP_CORNER,corner);

   ObjectSetInteger(chart_id,name,OBJPROP_ANCHOR,point);

   ObjectSetInteger(chart_id,name,OBJPROP_XDISTANCE,X);

   ObjectSetInteger(chart_id,name,OBJPROP_YDISTANCE,Y);

   ObjectSetString(chart_id,name,OBJPROP_TEXT,text);

   ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color);

   ObjectSetString(chart_id,name,OBJPROP_FONT,Font);

   ObjectSetInteger(chart_id,name,OBJPROP_FONTSIZE,Size);

   ObjectSetString(chart_id,name,OBJPROP_TOOLTIP,textTT);

   ObjectSetInteger(chart_id,name,OBJPROP_BACK,true); //>1J5:B =0 704=5< ?;0=5

//----

  }

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

//|  5@5CAB0=>2:0 B5:AB>2>9 <5B:8                                   |

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

void SetTLabel(long   chart_id,         // 845=B8D8:0B>@ 3@0D8:0

               string name,             // 8<O >1J5:B0

               int    nwin,             // 8=45:A >:=0

               ENUM_BASE_CORNER corner, // ?>;>65=85 C3;0 ?@82O7:8

               ENUM_ANCHOR_POINT point, // ?>;>65=85 B>G:8 ?@82O7:8

               int    X,                // 48AB0=F8O 2 ?8:A5;OE ?> >A8 X >B C3;0 ?@82O7:8

               int    Y,                // 48AB0=F8O 2 ?8:A5;OE ?> >A8 Y >B C3;0 ?@82O7:8

               string text,             // B5:AB

               string textTT,           // B5:AB 2A?;K20NI59 ?>4A:07:8

               color  Color,            // F25B B5:AB0

               string Font,             // H@8DB B5:AB0

               int    Size)             // @07<5@ H@8DB0

  {

//----

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

     {

      CreateTLabel(chart_id,name,nwin,corner,point,X,Y,text,textTT,Color,Font,Size);

     }

   else

     {

      ObjectSetString(chart_id,name,OBJPROP_TEXT,text);

      ObjectSetInteger(chart_id,name,OBJPROP_XDISTANCE,X);

      ObjectSetInteger(chart_id,name,OBJPROP_YDISTANCE,Y);

      ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color);

      ObjectSetInteger(chart_id,name,OBJPROP_FONTSIZE,Size);

     }

//----

  }

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

//| Custom indicator initialization function                         | 

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

int OnInit()

  {

//---- 8=8F80;870F8O ?5@5<5==KE =0G0;0 >BAG5B0 40==KE   

   int ATR_Period=15;

   min_rates_total=ATR_Period+int(Length+1);

   min_rates_total+=int(SignalBar);



//---- 8=8F80;870F8O ?5@5<5==KE

   if(Symbol_!="") Symb=Symbol_;

   else Symb=Symbol();



   X_0=X_;

   Yn=Y_+5;



   name0=Symbols_Sirname+"0";

   if(ShowIndName)

     {

      Y_1_=Yn+Y_1;

      X_1_=X_0+X_1;

      name1=Symbols_Sirname+"1";

      StringConcatenate(IndName,INDICATOR_NAME,"(",Symb," ",GetStringTimeframe(Timeframe),")");

     }



//---- ?>;CG5=85 E5=4;0 8=48:0B>@0 Skyscraper_Fix

   Skyscraper_Fix_Handle=iCustom(Symb,Timeframe,"Skyscraper_Fix",Length,Kv,Percentage,HighLow);

   if(Skyscraper_Fix_Handle==INVALID_HANDLE)

     {

      Print(" 5 C40;>AL ?>;CG8BL E5=4; 8=48:0B>@0 Skyscraper_Fix");

      return(INIT_FAILED);

     }

     

   BuySignal=IndName+": "+BUY_ALERT_TEXT;

   SellSignal=IndName+": "+SELL_ALERT_TEXT;



//---- 8=8F80;870F88 ?5@5<5==>9 4;O :>@>B:>3> 8<5=8 8=48:0B>@0

   string shortname=name1;

//--- A>740=85 8<5=8 4;O >B>1@065=8O 2 >B45;L=>< ?>4>:=5 8 2> 2A?;K20NI59 ?>4A:07:5

   IndicatorSetString(INDICATOR_SHORTNAME,shortname);

//--- >?@545;5=85 B>G=>AB8 >B>1@065=8O 7=0G5=89 8=48:0B>@0

   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);

//---- 7025@H5=85 8=8F80;870F88

   return(INIT_SUCCEEDED);

  }

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

//| Custom indicator deinitialization function                       |

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

void Deinit()

  {

//----

   if(ObjectFind(0,name0)!=-1) ObjectDelete(0,name0);

   if(ObjectFind(0,name1)!=-1) ObjectDelete(0,name1);

//----

  }

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

//| Custom indicator deinitialization function                       |

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

void OnDeinit(const int reason)

  {

//----

   Deinit();

//----

   ChartRedraw(0);

  }

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

//| Custom indicator iteration function                              | 

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

int OnCalculate(const int rates_total,    // :>;8G5AB2> 8AB>@88 2 10@0E =0 B5:CI5< B8:5

                const int prev_calculated,// :>;8G5AB2> 8AB>@88 2 10@0E =0 ?@54K4CI5< B8:5

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

  {

//---- ?@>25@:0 :>;8G5AB20 10@>2 =0 4>AB0B>G=>ABL 4;O @0AG5B0

   if(BarsCalculated(Skyscraper_Fix_Handle)<min_rates_total) return(RESET);

   if(BarsCalculated(Skyscraper_Fix_Handle)<Bars(Symb,Timeframe)) return(prev_calculated);



//---- >1JO2;5=85 ;>:0;L=KE ?5@5<5==KE

   int trend=0;

   double Sign[2];

   color Color0=clrNONE;

   string SignSymbol;

   bool signal=false;

   static uint buycount,sellcount;

   static bool RePush;



//---- @0AG5BK =5>1E>48<>3> :>;8G5AB20 :>?8@C5<KE 40==KE 4;O DC=:F88 CopyBuffer

   if(prev_calculated>rates_total || prev_calculated<=0)// ?@>25@:0 =0 ?5@2K9 AB0@B @0AG5B0 8=48:0B>@0

     {

      buycount=0;

      sellcount=0;

     }

   else

     {

      if(prev_calculated==rates_total && SignalBar && (!buycount || !sellcount)) return(rates_total);

     }



//---- :>?8@C5< 2=>2L ?>O282H85AO 40==K5 2 <0AA82  

   if(CopyBuffer(Skyscraper_Fix_Handle,5,SignalBar,2,Sign)<=0) return(prev_calculated);



   if(Sign[1]==0)

     {

      trend=+1;

      if(Sign[0]==1) signal=true;

     }



   if(Sign[1]==1)

     {

      trend=-1;

      if(Sign[0]==0) signal=true;

     }



//---- AB028< AG5BG8:8 0;5@B>2 2 8AE>4=>5 ?>;>65=85   

   if(prev_calculated!=rates_total && AlertCount && signal)

     {

      buycount=AlertCount;

      sellcount=AlertCount;

     }



//---- ?>;CG8< A83=0;K 4;O ?>:C?:8

   if(trend>0)

     {

      Color0=UpSymol_Color;



      if(signal)

        {

         SignSymbol=UP_SIGNAL_SYMBOL;

         if(Push && SignalBar && prev_calculated!=rates_total) RePush=true;        

         if(RePush) if(SendNotification(BuySignal)) RePush=false;



         if(buycount && SignalBar)

           {

            switch(alert_mode)

              {

               case OnlyAlert: Alert(BuySignal); break;

               case OnlySound: PlaySound(BUY_SOUND); break;

              }



            buycount--;

           }

        }

      else SignSymbol=UP_TREND_SYMBOL;

     }



//---- ?>;CG8< A83=0;K 4;O ?@>4068

   if(trend<0)

     {

      Color0=DnSymol_Color;



      if(signal)

        {

         SignSymbol=DN_SIGNAL_SYMBOL;

         if(Push && SignalBar && prev_calculated!=rates_total) RePush=true;        

         if(RePush) if(SendNotification(SellSignal)) RePush=false;



         if(sellcount && SignalBar)

           {

            switch(alert_mode)

              {

               case OnlyAlert: Alert(SellSignal); break;

               case OnlySound: PlaySound(SELL_SOUND); break;

              }



            sellcount--;

           }



        }

      else SignSymbol=DN_TREND_SYMBOL;

     }

     

//---- >B>1@078< A83=0;K =0 3@0D8:5

   if(trend)

     {

      if(ShowIndName)

         SetTLabel(0,name1,0,WhatCorner,ENUM_ANCHOR_POINT(2*WhatCorner),X_1_,Y_1_,IndName,IndName,IndName_Color,NAMES_SYMBOLS_FONT,Font_Size);

      if(signal) SetTLabel(0,name0,0,WhatCorner,ENUM_ANCHOR_POINT(2*WhatCorner),X_0,Yn,SignSymbol,IndName,Color0,SIGNAL_SYMBOLS_FONT,Symbols_Size);

      else SetTLabel(0,name0,0,WhatCorner,ENUM_ANCHOR_POINT(2*WhatCorner),X_0,Yn,SignSymbol,IndName,Color0,TREND_SYMBOLS_FONT,Symbols_Size);

     }

   else Deinit();

//----

   ChartRedraw(0);

   return(rates_total);

  }

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

Comments