Arrows_Smile

Author: Star
Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screenIt sends emailsIt plays sound alerts
0 Views
0 Downloads
0 Favorites
Arrows_Smile
ÿþ//+------------------------------------------------------------------+

//|                                                 Arrows+Smile.mq4 |

//|                                                           Star   |

//| arrowse coded acording to idea presented by Star                 |

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

#property copyright "Star"

#property link      "bdanny577@gmail.com"



#property indicator_chart_window

#property indicator_buffers 7

#property indicator_color1  White

#property indicator_color2  NavajoWhite

#property indicator_color3  PowderBlue

#property indicator_color4  White

#property indicator_color5  White

#property indicator_color6  White

#property indicator_color7  White

#property indicator_style1  STYLE_SOLID

#property indicator_width1  1

#property indicator_width2  4

#property indicator_width3  4

#property indicator_width4  8

#property indicator_width5  8

#property indicator_width6  8

#property indicator_width7  8

#property strict

//

//

//

//

//



extern string TimeFrame       = "current time frame";

extern int    HalfLength      = 55;

extern int    Price           = PRICE_WEIGHTED;

extern double BandsDeviations = 2.8;

extern bool   Interpolate     = true;

extern bool   alertsOn        = false;

extern bool   alertsOnCurrent = false;

extern bool   alertsOnHighLow = false;

extern bool   alertsMessage   = false;

extern bool   alertsSound     = false;

extern bool   alertsEmail     = false;



//

//

//

//

//



double tmBuffer[];

double upBuffer[];

double dnBuffer[];

double wuBuffer[];

double wdBuffer[];

double upArrow[];

double dnArrow[];

double upArrowC[];

double dnArrowC[];



//

//

//

//

//



string IndicatorFileName;

bool   calculatingTma = false;

bool   returningBars  = false;

int    timeFrame;



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

//|                                                                  |

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

//

//

//

//



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

//|                                                                  |

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

int init()

  {

   timeFrame  = stringToTimeFrame(TimeFrame);

   HalfLength = MathMax(HalfLength,1);

   IndicatorBuffers(9);

   SetIndexBuffer(0,tmBuffer);

   SetIndexDrawBegin(0,HalfLength);

   SetIndexBuffer(1,upBuffer);

   SetIndexDrawBegin(1,HalfLength);

   SetIndexBuffer(2,dnBuffer);

   SetIndexDrawBegin(2,HalfLength);

//SetIndexBuffer(3,dnArrow);   SetIndexStyle(3,DRAW_ARROW); SetIndexArrow(3,82);

//SetIndexBuffer(4,upArrow);   SetIndexStyle(4,DRAW_ARROW); SetIndexArrow(4,82);

   SetIndexBuffer(3,dnArrow);

   SetIndexStyle(3,DRAW_ARROW);

   SetIndexArrow(3,241);

   SetIndexBuffer(4,upArrow);

   SetIndexStyle(4,DRAW_ARROW);

   SetIndexArrow(4,242);

//SetIndexBuffer(3,dnArrow);   SetIndexStyle(3,DRAW_ARROW); SetIndexArrow(3,71);

//SetIndexBuffer(4,upArrow);   SetIndexStyle(4,DRAW_ARROW); SetIndexArrow(4,72);

   SetIndexBuffer(5,dnArrowC);

   SetIndexStyle(5,DRAW_ARROW);

   SetIndexArrow(5,74);

   SetIndexBuffer(6,upArrowC);

   SetIndexStyle(6,DRAW_ARROW);

   SetIndexArrow(6,74);

//SetIndexBuffer(5,dnArrowC);   SetIndexStyle(5,DRAW_ARROW); SetIndexArrow(5,89);

//SetIndexBuffer(6,upArrowC);   SetIndexStyle(6,DRAW_ARROW); SetIndexArrow(6,89);

//SetIndexBuffer(5,dnArrowC);   SetIndexStyle(5,DRAW_ARROW); SetIndexArrow(5,91);

//SetIndexBuffer(6,upArrowC);   SetIndexStyle(6,DRAW_ARROW); SetIndexArrow(6,91);

//SetIndexBuffer(5,dnArrowC);   SetIndexStyle(5,DRAW_ARROW); SetIndexArrow(5,65);

//SetIndexBuffer(6,upArrowC);   SetIndexStyle(6,DRAW_ARROW); SetIndexArrow(6,65);

   SetIndexBuffer(7,wuBuffer);

   SetIndexBuffer(8,wdBuffer);





   if(TimeFrame=="calculateTma")

     {

      calculatingTma=true;

      return(0);

     }

   if(TimeFrame=="returnBars")

     {

      returningBars=true;

      return(0);

     }





   IndicatorFileName = WindowExpertName();

   return(0);

  }

int deinit() { return(0); }



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

//|                                                                  |

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

//

//

//

//

//



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

//|                                                                  |

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

int start()

  {

   if(!TimeOK("2020.06.30 23:59"))

      return(0);

   int counted_bars=IndicatorCounted();

   int i,limit;



   if(counted_bars<0)

      return(-1);

   if(counted_bars>0)

      counted_bars--;

   limit=MathMin(Bars-1,Bars-counted_bars+HalfLength);

//Print("counted_bars=", counted_bars);

//Print("limit=", limit);

   if(returningBars)

     {

      tmBuffer[0] = limit;

      return(0);

     }

   if(calculatingTma)

     {

      calculateTma(limit);

      return(0);

     }

   if(timeFrame > Period())

      limit = MathMax(limit,MathMin(Bars-1,iCustom(NULL,timeFrame,IndicatorFileName,"returnBars",0,0)*timeFrame/Period()));



//

//

//

//

//



   for(i = limit; i >= 0; i--)

     {

      int      shift1 = iBarShift(NULL,timeFrame,Time[i]);

      datetime time1  = iTime(NULL,timeFrame,shift1);



      //

      //

      //

      //

      //



      tmBuffer[i] = iCustom(NULL,timeFrame,IndicatorFileName,"calculateTma",HalfLength,Price,BandsDeviations,0,shift1);

      upBuffer[i] = iCustom(NULL,timeFrame,IndicatorFileName,"calculateTma",HalfLength,Price,BandsDeviations,1,shift1);

      dnBuffer[i] = iCustom(NULL,timeFrame,IndicatorFileName,"calculateTma",HalfLength,Price,BandsDeviations,2,shift1);



      upArrow[i] = EMPTY_VALUE;

      dnArrow[i] = EMPTY_VALUE;

      upArrowC[i] = EMPTY_VALUE;

      dnArrowC[i] = EMPTY_VALUE;

      if(High[i+1]>upBuffer[i+1] && Close[i+1]>Open[i+1] && Close[i]<Open[i] && tmBuffer[i]<tmBuffer[i+1])

        {

         //SetIndexArrow(4,226);

         upArrow[i] = High[i];

        }

      else

         if(High[i+1]>upBuffer[i+1] && Close[i+1]>Open[i+1] && Close[i]<Open[i])

           {

            //SetIndexArrow(4,91);

            upArrowC[i] = High[i];

           }

      if(Low[i+1]<dnBuffer[i+1] && Close[i+1]<Open[i+1] && Close[i]>Open[i] && tmBuffer[i]>tmBuffer[i+1])

        {

         //SetIndexArrow(3,225);

         dnArrow[i] = Low[i];

        }

      else

         if(Low[i+1]<dnBuffer[i+1] && Close[i+1]<Open[i+1] && Close[i]>Open[i])

           {

            //SetIndexArrow(3,91);

            dnArrowC[i] = Low[i];

           }

      if(timeFrame <= Period() || shift1==iBarShift(NULL,timeFrame,Time[i-1]))

         continue;

      if(!Interpolate)

         continue;



      //

      //

      //

      //

      //

      int n = 1;

      for(n = 1; i+n < Bars && Time[i+n] >= time1; n++) continue;

      double factor = 1.0 / n;

      for(int k = 1; k < n; k++)

        {

         tmBuffer[i+k] = k*factor*tmBuffer[i+n] + (1.0-k*factor)*tmBuffer[i];

         upBuffer[i+k] = k*factor*upBuffer[i+n] + (1.0-k*factor)*upBuffer[i];

         dnBuffer[i+k] = k*factor*dnBuffer[i+n] + (1.0-k*factor)*dnBuffer[i];

        }

     }



//

//

//

//

//



   if(alertsOn)

     {

      int forBar = 0;

      if(alertsOnCurrent)

         forBar = 0;

      else

         forBar = 1;

      if(alertsOnHighLow)

        {

         if(High[forBar] > upBuffer[forBar] && High[forBar+1] < upBuffer[forBar+1])

            doAlert("high penetrated upper bar");

         if(Low[forBar]  < dnBuffer[forBar] && Low[forBar+1]  > dnBuffer[forBar+1])

            doAlert("low penetrated lower bar");

        }

      else

        {

         if(Close[forBar] > upBuffer[forBar] && Close[forBar+1] < upBuffer[forBar+1])

            doAlert("close penetrated upper bar");

         if(Close[forBar] < dnBuffer[forBar] && Close[forBar+1] > dnBuffer[forBar+1])

            doAlert("close penetrated lower bar");

        }

     }



   return(0);

  }



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

//|                                                                  |

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

//

//

//

//

//



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

//|                                                                  |

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

void calculateTma(int limit)

  {

   int i,j,k;

   double FullLength = 2.0*HalfLength+1.0;



//

//

//

//

//



   for(i=limit; i>=0; i--)

     {

      double sum  = (HalfLength+1)*iMA(NULL,0,1,0,MODE_SMA,Price,i);

      double sumw = (HalfLength+1);

      for(j=1, k=HalfLength; j<=HalfLength; j++, k--)

        {

         sum  += k*iMA(NULL,0,1,0,MODE_SMA,Price,i+j);

         sumw += k;



         if(j<=i)

           {

            sum  += k*iMA(NULL,0,1,0,MODE_SMA,Price,i-j);

            sumw += k;

           }



        }

      tmBuffer[i] = sum/sumw;



      //

      //

      //

      //

      //



      double diff = iMA(NULL,0,1,0,MODE_SMA,Price,i)-tmBuffer[i];

      if(i> (Bars-HalfLength-1))

         continue;

      if(i==(Bars-HalfLength-1))

        {

         upBuffer[i] = tmBuffer[i];

         dnBuffer[i] = tmBuffer[i];

         if(diff>=0)

           {

            wuBuffer[i] = MathPow(diff,2);

            wdBuffer[i] = 0;

           }

         else

           {

            wdBuffer[i] = MathPow(diff,2);

            wuBuffer[i] = 0;

           }

         continue;

        }



      //

      //

      //

      //

      //



      if(diff>=0)

        {

         wuBuffer[i] = (wuBuffer[i+1]*(FullLength-1)+MathPow(diff,2))/FullLength;

         wdBuffer[i] =  wdBuffer[i+1]*(FullLength-1)/FullLength;

        }

      else

        {

         wdBuffer[i] = (wdBuffer[i+1]*(FullLength-1)+MathPow(diff,2))/FullLength;

         wuBuffer[i] =  wuBuffer[i+1]*(FullLength-1)/FullLength;

        }

      upBuffer[i] = tmBuffer[i] + BandsDeviations*MathSqrt(wuBuffer[i]);

      dnBuffer[i] = tmBuffer[i] - BandsDeviations*MathSqrt(wdBuffer[i]);

     }

  }







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

//|                                                                  |

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

//

//

//

//

//



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

//|                                                                  |

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

void doAlert(string doWhat)

  {

   static string   previousAlert="";

   static datetime previousTime;

   string message;



//

//

//

//

//



   if(previousAlert!=doWhat || previousTime!=Time[0])

     {

      previousAlert = doWhat;

      previousTime  = Time[0];



      message= StringConcatenate(Symbol()," at ",TimeToStr(TimeLocal(),TIME_SECONDS)," THA : ",doWhat);

      if(alertsMessage)

         Alert(message);

      if(alertsEmail)

         SendMail(StringConcatenate(Symbol(),"TMA "),message);

      if(alertsSound)

         PlaySound("alert2.wav");

     }

  }



//

//

//

//

//



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

//|                                                                  |

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

int stringToTimeFrame(string tfs)

  {

   for(int l = StringLen(tfs)-1; l >= 0; l--)

     {

      int char2 = StringGetChar(tfs,l);

      if((char2 > 96 && char2 < 123) || (char2 > 223 && char2 < 256))

         tfs = StringSetChar(tfs, 1, char2 - 32);

      else

         if(char2 > -33 && char2 < 0)

            tfs = StringSetChar(tfs, 1, char2 + 224);

     }

   int tf=0;

   if(tfs=="M1" || tfs=="1")

      tf=PERIOD_M1;

   if(tfs=="M5" || tfs=="5")

      tf=PERIOD_M5;

   if(tfs=="M15"|| tfs=="15")

      tf=PERIOD_M15;

   if(tfs=="M30"|| tfs=="30")

      tf=PERIOD_M30;

   if(tfs=="H1" || tfs=="60")

      tf=PERIOD_H1;

   if(tfs=="H4" || tfs=="240")

      tf=PERIOD_H4;

   if(tfs=="D1" || tfs=="1440")

      tf=PERIOD_D1;

   if(tfs=="W1" || tfs=="10080")

      tf=PERIOD_W1;

   if(tfs=="MN" || tfs=="43200")

      tf=PERIOD_MN1;

   if(tf==0 || tf<Period())

      tf=Period();

   return(tf);

  }



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

bool TimeOK(string dateString)

  {

   datetime var1;

   var1=StrToTime(dateString);

   return(TimeCurrent()<=var1);

  }

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

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