3MACross_AlertWarnSigOnlyNoShift_v1

Author:
Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screenIt sends emailsIt plays sound alerts
1 Views
0 Downloads
0 Favorites
3MACross_AlertWarnSigOnlyNoShift_v1
//+------------------------------------------------------------------+
//|                                  MA_Cross_3MACross_AlertWarnSig  |
//|                                             2008forextsd mladen  |
//|                 Copyright © 1999-2007, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.ru  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
//----
#property indicator_chart_window
#property indicator_buffers 4
//----
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Yellow
#property indicator_color4 Gold
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1
#property indicator_width4 1
//----
extern int FasterMA   =5;
extern int FasterMode =1; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma
extern int MediumMA    =13;
extern int MediumMode =1; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma
extern int SlowerMA    =34;
extern int SlowerMode =1; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma
extern bool crossesOnCurrent=true;
extern bool alertsOn        =true;
extern bool alertsMessage   =true;
extern bool alertsSound     =false;
extern bool alertsEmail     =false;
extern string   MA_Shift ="all MA_Shift = 0";
extern string   MA_Mode="SMA0 EMA1 SMMA2 LWMA3";
//----
double CrossUp[];
double CrossDown[];
double CrossWUp[];
double CrossWDown[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   SetIndexBuffer(0, CrossUp);    SetIndexStyle(0, DRAW_ARROW); SetIndexArrow(0, 233);
   SetIndexBuffer(1, CrossDown);  SetIndexStyle(1, DRAW_ARROW); SetIndexArrow(1, 234);
   SetIndexBuffer(2, CrossWUp);   SetIndexStyle(2, DRAW_ARROW); SetIndexArrow(2, 233);
   SetIndexBuffer(3, CrossWDown); SetIndexStyle(3, DRAW_ARROW); SetIndexArrow(3, 234);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int    i;
   double fasterMAnow, fasterMAprevious, fasterMAafter;
   double mediumMAnow, mediumMAprevious, mediumMAafter;
   double slowerMAnow, slowerMAprevious, slowerMAafter;
//----
   int counted_bars = IndicatorCounted();
   if(counted_bars < 0)  return(-1);
   if(counted_bars > 0)   counted_bars--;
   int limit = Bars - counted_bars;
   if(counted_bars==0) limit-=1+9;
//----
   for(i=limit; i >=0; i--)
     {
      double Range=0.0;
      for(int counter=i ;counter<=i+9;counter++) Range+=MathAbs(High[counter]-Low[counter]);
      Range/=10;
//----
      fasterMAnow     =iMA(NULL, 0, FasterMA, 0,FasterMode, PRICE_CLOSE, i);
      fasterMAprevious=iMA(NULL, 0, FasterMA, 0,FasterMode, PRICE_CLOSE, i+1);
      mediumMAnow     =iMA(NULL, 0, MediumMA, 0,MediumMode, PRICE_CLOSE, i);
      mediumMAprevious=iMA(NULL, 0, MediumMA, 0,MediumMode, PRICE_CLOSE, i+1);
      slowerMAnow     =iMA(NULL, 0, SlowerMA, 0,SlowerMode, PRICE_CLOSE, i);
      slowerMAprevious=iMA(NULL, 0, SlowerMA, 0,SlowerMode, PRICE_CLOSE, i+1);
      //avoid current bar if not allowed to check crosses on current (i==0)
      if (crossesOnCurrent==false && i==0) continue;
//----
      int    crossID=0;
      double curr;
      double prev;
      double point;
      while(true)
        {
         curr=fasterMAnow      - mediumMAnow;
         prev=fasterMAprevious - mediumMAprevious;
         point=(fasterMAnow      + fasterMAprevious)/2;
         if (curr*prev<=0) { crossID=1; break; }
         curr=fasterMAnow      - slowerMAnow;
         prev=fasterMAprevious - slowerMAprevious;
         if (curr*prev<=0) { crossID=2; break; }
         curr=mediumMAnow      - slowerMAnow;
         prev=mediumMAprevious - slowerMAprevious;
         point=(mediumMAnow      + mediumMAprevious)/2;
         if (curr*prev<=0) { crossID=3; break; }
         break;
        }
      //    the interesting thing is the direction of the crossing
      //    which MA is the primary and which one the secondary
      //    if you do not know that you can not determine the "direction"
      //    of the cross
      CrossUp[i]   =EMPTY_VALUE;
      CrossDown[i] =EMPTY_VALUE;
      CrossWUp[i]  =EMPTY_VALUE;
      CrossWDown[i]=EMPTY_VALUE;
      if (crossID>0)
        {
         if (alertsOn)
            if ((i==0 && crossesOnCurrent==true) || (i==1 && crossesOnCurrent==false))
              {
               switch(crossID)
                 {
                  case 1:
                     if(curr>0) doAlert(" 3MACross: Fast MA crossed Medium MA UP");
                     else       doAlert(" 3MACross: Fast MA crossed Medium MA DOWN");
                     break;
                  case 2:
                     if(curr>0) doAlert(" 3MACross: Fast MA crossed Slow MA UP");
                     else       doAlert(" 3MACross: Fast MA crossed Slow MA DOWN");
                     break;
                  case 3:
                     if(curr>0) doAlert(" 3MACross: Medium MA crossed Slow MA UP");
                     else       doAlert(" 3MACross: Medium MA crossed Slow MA DOWN");
                     break;
                 }
              }
         //----
         if (i==0)
           {
            if (curr>0)
               CrossWUp[i]  =point - Range*0.5;
            else  CrossWDown[i]=point + Range*0.5;
           }
         else
           {
            if (curr>0)
               CrossUp[i]  =point - Range*0.5;
            else  CrossDown[i]=point + Range*0.5;
           }
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void doAlert(string doWhat)
  {
   static string   previousAlert="nothing";
   static datetime previousTime;
   string message;
//----
     if (previousAlert!=doWhat || previousTime!=Time[0]) 
     {
      previousAlert =doWhat;
      previousTime  =Time[0];
      //        if time needed :
      //        message =  StringConcatenate(Symbol()," at ",TimeToStr(TimeLocal(),TIME_SECONDS)," @",Bid," ", doWhat);
      message= StringConcatenate(Symbol()," at ",Bid," ", doWhat);
      if (alertsMessage) Alert(message);
      if (alertsEmail)   SendMail(StringConcatenate(Symbol()," 3MACross:"," M",Period()),message);
      if (alertsSound)   PlaySound("alert2.wav");
     }
  }
//+------------------------------------------------------------------+

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