TH_MTF_Bar1.4_alerts

Author: Copyright � 2007, Tim Hyder.
Price Data Components
Series array that contains close prices for each bar
Indicators Used
Movement directional indexCommodity channel indexMACD HistogramMoving Average of OscillatorMomentum indicatorRelative strength indexParabolic Stop and Reverse systemStochastic oscillator
Miscellaneous
Implements a curve of type %1It plays sound alertsIt sends emails
0 Views
0 Downloads
0 Favorites
TH_MTF_Bar1.4_alerts
//+------------------------------------------------------------------+ 
//|              PowerTrend MultiTimeFrame MACD                      | 
//|                                                                  | 
//|   Copyright © 2008, Tim Hyder aka Hiachiever                     |
//|                                                                  |
//|   PO BOX 768, Hillarys, Western Australia, Australia, 6923       |
//|                                                                  |
//|   GIFTS AND DONATIONS ACCEPTED                                   | 
//|   All my indicators should be considered donationware. That is   |
//|   you are free to use them for your personal use, and are        |
//|   under no obligation to pay for them. However, if you do find   |
//|   this or any of my other indicators help you with your trading  |
//|   then any Gift or Donation as a show of appreciation is         |
//|   gratefully accepted.                                           |
//|                                                                  |
//|   Gifts or Donations also keep me motivated in producing more    |
//|   great free indicators. :-)                                     |
//|                                                                  |
//|   PayPal - hiachiever@gmail.com                                  |  
//+------------------------------------------------------------------+ 
//mod 2009fxtsd
//20090309fxtsd 1.1 obos lv
//20090311+adx  1.2
//20090314+adxdi1.3
//20090322 +sar
#property copyright "Copyright © 2007, Tim Hyder."
#property link      "http://www.the4xtrader.com"

#define vers    "20090309 1.1 //18.Feb.2008"
#define major   1
#define minor   0

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 10
#property indicator_buffers 4 
#property indicator_color1 Blue        //MACD.Above0.Up - Strong Up
#property indicator_color2 Red         //MACD.Below0.Down - Strong Down
#property indicator_color3 RoyalBlue   //MACD.Above0.Dn - Weak Up
#property indicator_color4 DarkOrange  //MACD.Below0.Up  - Weak mDn

//extern string NOTE1 = " --- TimeFrame Settings ---";
//extern string NOTETF = "Enter 0 to display current TF";
extern int TimeFrame = 0;
//extern string NOTE2 = " --- Display Settings ---";
//extern string NOTEVS = "Vertically positions indicator";
extern int     ind.Vert.Level = 1.0;
extern int     ind.Bar.Type   = 8;

//extern string NOTEMACD = " --- MACD Settings ---";
extern string BarType      = "1ADX 2ADXDI 3CCI 4MACD" ;
extern string indicators   = "5OsMA 6MOM 7RSI 8 SAR 9STO";


extern int  ADX_Period = 14; 

extern int CCI_Period = 14;
extern int RSI_Period = 13;
extern int Mom_Period = 14;

extern int Macd_Fast = 12;
extern int Macd_Slow = 26;
extern int Macd_Sig  = 9;
extern string OsmaMacdSto    = "msLineMode 0Main 1SigLn" ;
//extern string NoteMACD1a = " -- Signal Lines = (True) || Histogram = (False) -- ";
//extern bool UseSignalLines = true;

extern double SAR_Step     = 0.02;//sar ratio cl-sar)/cl obos lv +-1.0;
extern double SAR_Max      = 0.2;


extern int  STO_KPeriod      =  5;    
extern int  STO_DPeriod      =  3;    // Sensivity Factor for Fast Line
extern int  STO_Slowing      =  3;    // Sensivity Factor for Slow Line
extern int  STO_price        =  0;    // sto: 0 - Low/High or 1 - Close/Close
extern int  STO_MAmethod     =  0;    

extern bool       OBOSlvMode  = false; //overbought/sold levels
extern double     OBLv = 70;             
extern double     OSLv = 30;
extern double     ADX_Level   = 20;  
extern double     SAR_Level   = 1.0;  


extern string   MA_Method_ = "SMA0 EMA1 SMMA2 LWMA3";
extern string   note_Price = "0C 1O 2H 3L 4Md 5Tp 6WghC: Md(HL/2)4,Tp(HLC/3)5,Wgh(HLCC/4)6|sto:0LH 1CC";


extern int  msLineMode = 0;            //0main 1signal
extern int  price      = 0;          


//extern string NOTEDISPLAY = " --- Other Display options ---";
extern int MaxBars = 1000;
//extern string DISPLAYFVS1 = "FineVertShift allows Time Frame label";
//extern string DISPLAYFVS2 = "to be moved up and down";
extern double TFLabelVSadjust = -0.6;

//colour of time frame label on far right of indicator
extern color   TFTextColor    = White;
extern color   TFSameTFColor  = Lime;
extern int     TFTextFontSize = 6;

extern string NOTEALERTS = " --- Alerts ---";
extern bool AllowBoxAlerts   = false;
extern bool AllowSoundAlerts = false;
extern string LongSound =  "stops.wav"; //alert.wav
extern string ShortSound = "alert2.wav";
extern bool AllowEmailAlerts = false;
extern bool ZeroCrssOnly     = false;
extern int  alertsOnBar       = 1;


//---- buffers
double bufStrongUp[], bufWeakUp[] ;
double bufStrongDn[], bufWeakDn[];

string ShortName = "";
extern string Prefix = "TH Bar-";
int ArrowSize = 110;
int BarWidth = 0;
datetime LastTime = -1;
int TFrame, Window;
double Lv0;
//Four constants used in one of the functions below
int MACD.Above0.Up = 1 ,MACD.Above0.Dn = 2 ,MACD.Below0.Dn = 3,MACD.Below0.Up = 4;
string indName;
//---------------------------------------------------------------------------------------------------------------

void init()
{  
  IndicatorBuffers(4);
  SetIndexStyle(0, DRAW_ARROW, 0, BarWidth);
  SetIndexStyle(1, DRAW_ARROW, 0, BarWidth);
  SetIndexStyle(2, DRAW_ARROW, 0, BarWidth);
  SetIndexStyle(3, DRAW_ARROW, 0, BarWidth);
  
  SetIndexArrow(0, ArrowSize);
  SetIndexArrow(1, ArrowSize);
  SetIndexArrow(2, ArrowSize);
  SetIndexArrow(3, ArrowSize);
  
  SetIndexBuffer(0, bufStrongUp);
  SetIndexBuffer(1, bufStrongDn);
  SetIndexBuffer(2, bufWeakUp);
  SetIndexBuffer(3, bufWeakDn);
    
  SetIndexEmptyValue(0, 0.0);
  SetIndexEmptyValue(1, 0.0);
  SetIndexEmptyValue(2, 0.0);
  SetIndexEmptyValue(3, 0.0);

  SetIndexLabel(0, NULL);
  SetIndexLabel(1, NULL);
  SetIndexLabel(2, NULL);
  SetIndexLabel(3, NULL);

  IndicatorDigits(0);
 
  //Verify Time Values entered by user
  TFrame = CheckTimeFrame(TimeFrame);
  
  //---- name for DataWindow and indicator subwindow label
  //VertShift = GetNextIndicatorNo(Prefix);
  ShortName = Prefix + ind.Vert.Level;
  IndicatorShortName(ShortName);

}   

void deinit()
{
  int total = ObjectsTotal();  
  for (int i=total-1; i >= 0; i--) 
  {
    string name = ObjectName(i);
    if (StringFind(name, Prefix) == 0) ObjectDelete(name);
  }
}

void start()
{ 
   int i,tf,x,y=0;
   datetime TimeArray[];
   int MD;

   Window = WindowFind(ShortName);
   //This indicator is designed to display mutliple TFs in 1 indicator Window
   //When suqsequent indicators are dropped on the same Window
   //as a previous one WindowFind returns -1 ie can't find it.
   //This loop is to loop through the windows and find the window reference
   //The purpose behind all of this is to fix the problem of the TF labels
   //not being displayed for indicator 2,3,4 etc because of the Window reference
   if (Window == -1) 
   {
      for (i=0; i<20; i++)
      {
         x = WindowFind(Prefix + i);  
         if (x > 0)
         {
            Window = x;
            break;
         }
      }
   }   

   int counted_bars=IndicatorCounted();
   //---- check for possible errors
   if (counted_bars < 0) return(-1);
   //---- the last counted bar will be recounted
   if (counted_bars > 0) counted_bars--;
   int limit = Bars - counted_bars;
       limit = MathMax(limit,TimeFrame/Period());
       limit = MathMin(limit, MaxBars);

  //-------------------------------1----------------------------------------   
  
   // Plot defined time frame on to current time frame
   ArrayCopySeries(TimeArray,MODE_TIME,Symbol(),TimeFrame); 
   
   for(i=0,y=0;i<limit;i++)
   {
      if (Time[i]<TimeArray[y]) y++;

      /***********************************************************   
         Add your main indicator loop below.  You can reference an existing
         function with its name or an indicator with its iName  or iCustom.
         Rule 1:  Add extern inputs above for all neccesary values   
         Rule 2:  Use 'TFrame' for the indicator time frame
         Rule 3:  Use 'y' for your indicator's shift value
       **********************************************************/  
      MD = GetMACD(TFrame,y);

      bufStrongUp[i] = 0.0;
      bufWeakUp[i]   = 0.0;
      bufStrongDn[i] = 0.0;
      bufWeakDn[i]   = 0.0;

      if       (MD == MACD.Above0.Up) bufStrongUp[i]  = ind.Vert.Level;
      else if  (MD == MACD.Above0.Dn) bufWeakUp[i]    = ind.Vert.Level;
      else if  (MD == MACD.Below0.Dn) bufStrongDn[i]  = ind.Vert.Level;
      else if  (MD == MACD.Below0.Up) bufWeakDn[i]    = ind.Vert.Level;
  }//End For Loop
  
  CreateTFLabel(TFrame);
 
  string MailSubject = "TH Bar" ;
  string msg = "TH Bar "+indName+" TF" +(TimeFrame)+" on " +Symbol()+" M"+Period()  ;
  
  int bar = alertsOnBar;
  
  if (LastTime != Time[0])
  {
    //-> Lime
    if (bufStrongUp[bar] != 0 && bufStrongUp[bar+1] == 0)
    {
      msg = msg + " (>0up) Strong Up Trend; ";
      if (AllowSoundAlerts) PlaySound(LongSound);
      if (AllowBoxAlerts) Alert(msg);
      if (AllowEmailAlerts) SendMail(MailSubject, msg);
    }

    //<- Lime
    if (bufStrongUp[bar] == 0 && bufStrongUp[bar+1] != 0 && !ZeroCrssOnly)
    {
      msg = msg + " (>0dn) week UpTrend; ";
      if (AllowSoundAlerts) PlaySound(LongSound);
      if (AllowBoxAlerts) Alert(msg);
      if (AllowEmailAlerts) SendMail(MailSubject, msg);
    }

    //-> Red
    if (bufStrongDn[bar] != 0 && bufStrongDn[bar+1] == 0)
    {
      msg = msg + "  (<0dn) Strong Down Trend; ";
      if (AllowSoundAlerts) PlaySound(ShortSound);
      if (AllowBoxAlerts) Alert(msg);
      if (AllowEmailAlerts) SendMail(MailSubject, msg);
    }

    //<- Red
    if (bufStrongDn[bar] == 0 && bufStrongDn[bar+1] != 0 && !ZeroCrssOnly)
    {
      msg = msg +  " (<0up) week DownTrend ; ";
      if (AllowSoundAlerts) PlaySound(ShortSound);
      if (AllowBoxAlerts) Alert(msg);
      if (AllowEmailAlerts) SendMail(MailSubject, msg);
    }
    
    LastTime = Time[0];
  }
   

  return(0);
}
  
  
void CreateTFLabel(int TF)
{


            switch (ind.Bar.Type)
         {
            case 1: indName = " ADX ("+ADX_Period+")"; break;
            case 2: indName = " ADXDI ("+ADX_Period+")"; break;
            case 3: indName = " CCI ("+CCI_Period+")";  break;
            case 4: indName = " MACD ("+Macd_Fast+","+Macd_Slow+","+Macd_Sig+")"; break;
            case 5: indName = " OsMA ("+Macd_Fast+","+Macd_Slow+","+Macd_Sig+")"; break;
            case 6: indName = " MOM ("+Mom_Period+")";  break;
            case 7: indName = " RSI ("+RSI_Period+")";  break;
            case 8: indName = " SAR ("+DoubleToStr(SAR_Step,3)+","+DoubleToStr(SAR_Max,2)+")"; break;
            case 9: indName = " STO ("+STO_KPeriod+","+STO_DPeriod+","+STO_Slowing+")"; break;
         }


   string txt = TF2Str(TF)+indName;
   //if(UseSignalLines) txt = txt;
   double TimeDiff = Time[0]-Time[1];  
   string name = Prefix+ind.Vert.Level+"_TF_"+txt;
   color labelcolor = TFTextColor;
   string fontname = "Arial";

   //If Tf = Chart Period change TF Label colour so that it can be easily identified
   if (TF == Period())
   {
      labelcolor = TFSameTFColor;
      fontname = "Arial Bold";
      TFLabelVSadjust = -0.7;
   }
         
   if(ind.Vert.Level<TFLabelVSadjust) TFLabelVSadjust = 0; //TFLabelVS = TF Label Vertical Shift
   
   if (ObjectFind(name) == -1)
   {  
     ObjectCreate(name, OBJ_TEXT, Window, iTime(NULL,0,0)+12*TimeDiff, ind.Vert.Level-TFLabelVSadjust);
     ObjectSetText(name, txt,TFTextFontSize,fontname, labelcolor);
   }
   else
     ObjectSet(name, OBJPROP_TIME1, iTime(NULL,0,0)+12*TimeDiff);
}

string TF2Str(int period) 
{
  switch (period) 
  {
    case PERIOD_M1:  return("M1");
    case PERIOD_M5:  return("M5");
    case PERIOD_M15: return("M15");
    case PERIOD_M30: return("M30");
    case PERIOD_H1:  return("H1");
    case PERIOD_H4:  return("H4");
    case PERIOD_D1:  return("D1");
    case PERIOD_W1:  return("W1");
    case PERIOD_MN1: return("MN");
  }
  return (Period());
} 

int CheckTimeFrame(int TimeFrame)
{
   int result;

   if (TimeFrame == 0) 
      result = Period();   
   else
   {
      switch(TimeFrame) 
      {
         case 1    : result = PERIOD_M1;  break; 
         case 5    : result = PERIOD_M5;  break;
         case 15   : result = PERIOD_M15; break;
         case 30   : result = PERIOD_M30; break;
         case 60   : result = PERIOD_H1;  break;
         case 240  : result = PERIOD_H4;  break;
         case 1440 : result = PERIOD_D1;  break;
         case 7200 : result = PERIOD_W1;  break;
         case 28800: result = PERIOD_MN1; break;
         default  : result = Period(); break; //Error so return current TF
      }
   }
   return(result);
}

int GetMACD(int TF, int shift)
{


  double      ADX  =iADX(NULL,TF,ADX_Period,price,0,shift);
  double      PADX =iADX(NULL,TF,ADX_Period,price,1,shift);
  double      NADX =iADX(NULL,TF,ADX_Period,price,2,shift);
              
  double      ADX1 =iADX(NULL,TF,ADX_Period,price,0,shift+1);
  double      PADX1=iADX(NULL,TF,ADX_Period,price,1,shift+1);
  double      NADX1=iADX(NULL,TF,ADX_Period,price,2,shift+1);

  double      ad, ad1;    if    (PADX>NADX) { ad = ADX;   ad1 = ADX1;}
                          else              { ad =-ADX;   ad1 =-ADX1;}
  
  double      d   =PADX -NADX;
  double      d1  =PADX1-NADX1;


   double      cci   =iCCI(NULL, TF, CCI_Period,price, shift);
   double      cci1  =iCCI(NULL, TF, CCI_Period,price, shift+1);
  
   double macd =  iMACD(NULL,TF,Macd_Fast,Macd_Slow,Macd_Sig,price,msLineMode,shift); 
   double macd1=  iMACD(NULL,TF,Macd_Fast,Macd_Slow,Macd_Sig,price,msLineMode,shift+1);    
   double osma =  iOsMA(NULL,TF,Macd_Fast,Macd_Slow,Macd_Sig,price,shift); 
   double osma1=  iOsMA(NULL,TF,Macd_Fast,Macd_Slow,Macd_Sig,price,shift+1);    
   
   double  mom    =iMomentum(NULL,TF,Mom_Period,price,shift);
   double  mom1   =iMomentum(NULL,TF,Mom_Period,price,shift+1);

   double   rsi   =iRSI(NULL, TF, RSI_Period,price, shift); 
   double   rsi1  =iRSI(NULL, TF, RSI_Period,price, shift+1); 
 
   double   close  =iClose(NULL,TF,shift);
   double   close1 =iClose(NULL,TF,shift+1);
   double   open   =iOpen (NULL,TF,shift);
   double   high   =iHigh (NULL,TF,shift);
   double   low    =iLow  (NULL,TF,shift);
 
   double sar  =iSAR(NULL, TF, SAR_Step,SAR_Max,shift);
   double sar1 =iSAR(NULL, TF, SAR_Step,SAR_Max,shift+1);
         if(sar!=0)
   double sarat=(close-sar)/close*100;
         if(sar1!=0)
   double sarat1=(close1-sar1)/close1*100;

 
   double stoch  = iStochastic(NULL,TF,STO_KPeriod,STO_DPeriod,STO_Slowing,STO_MAmethod,STO_price ,msLineMode,shift);
   double stoch1 = iStochastic(NULL,TF,STO_KPeriod,STO_DPeriod,STO_Slowing,STO_MAmethod,STO_price ,msLineMode,shift+1);

   double  MACDM,   MACDSIG;      


      switch(ind.Bar.Type) 
      {
         case 1:  MACDM=ad;    MACDSIG=ad1;     Lv0=0;   OBLv= ADX_Level;  OSLv= -ADX_Level;    
                                                            break;
         case 2:  MACDM=d;     MACDSIG=d1;      Lv0=0;   OBLv= ADX_Level;  OSLv= -ADX_Level; 
                                                            break;
         case 3:  MACDM=cci;   MACDSIG=cci1;    Lv0=0;      break; 
         case 4:  MACDM=macd;  MACDSIG=macd1;   Lv0=0;      break; 
         case 5:  MACDM=osma;  MACDSIG=osma1;   Lv0=0;      break; 
         case 6:  MACDM=mom;   MACDSIG=mom1;    Lv0=100;    break;
         case 7:  MACDM=rsi;   MACDSIG=rsi1;    Lv0=50;     break; 
         case 8:  MACDM=sarat; MACDSIG=sarat1;  Lv0=0;  OBLv= SAR_Level;  OSLv= -SAR_Level;
                                                            break;
         case 9:  MACDM=stoch; MACDSIG=stoch1;  Lv0=50;     break;
                                                         

      }
//extern string BarType = "1adx 2adxdi 3cci 4macd 5osma 6mom 7rsi 8sar 9sto "; 



      if (MACDM>Lv0)//if close>sar...if cl>sar
      {
         if (OBOSlvMode) MACDSIG=OBLv; 
         if (MACDM>MACDSIG)   return(MACD.Above0.Up); 
         else                 return(MACD.Above0.Dn);  
      }
      else //if close<=sar ...close<=sar 
      {
         if (OBOSlvMode) MACDSIG=OSLv;
         if (MACDM<MACDSIG)   return(MACD.Below0.Dn);
         else                 return(MACD.Below0.Up);
      }


}

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