Author: Copyright � 2006, Forex-TSD.com
Miscellaneous
Implements a curve of type %1It plays sound alertsIt issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
gopal
//+------------------------------------------------------------------+
//|                                             IchimokuAlert_v1.mq4 |
//|                                  Copyright © 2006, Forex-TSD.com |
//|                         Written by IgorAD,igorad2003@yahoo.co.uk |   
//|            http://finance.groups.yahoo.com/group/TrendLaboratory |                                      
//+------------------------------------------------------------------+




#property copyright "Copyright © 2006, Forex-TSD.com "
#property link      "http://www.forex-tsd.com/"

#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 SandyBrown
#property indicator_color4 Thistle
#property indicator_color5 White
#property indicator_color6 SandyBrown
#property indicator_color7 Thistle
#property indicator_color8 Orange
//---- input parameters
extern int Tenkan=9;
extern int Kijun=26;
extern int Senkou=52;
extern int AlertMode=1;

// SAR
extern bool   Sound.Alert    = true ;
extern bool   Show.PriceBox  = true ;
extern int    myBoxWidth     = 3;
extern double    Step=0.001;
extern int Diff=20; //ñäâèã íà÷àëà öåïî÷êè ïî âåðòèêàëè â ïîèíòàõ
extern int ilimit =144; 

//---- buffers
double SarBuffer[];
//----
int    save_lastreverse;
bool   save_dirlong;
double save_start;
double save_last_high;
double save_last_low;
double save_ep;
double save_sar;
double save_delta;

string symbol, tChartPeriod,  tShortName ;  
int    digits, period  ; 

bool Trigger ;

int OldBars = -1 ;

///sar

//---- buffers
double Tenkan_Buffer[];
double Kijun_Buffer[];
double SpanA_Buffer[];
double SpanB_Buffer[];
double Chinkou_Buffer[];
double SpanA2_Buffer[];
double SpanB2_Buffer[];
//----
int a_begin;
bool UptrendAlert1,DntrendAlert1,UptrendAlert2,DntrendAlert2;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//AlertMode = 0 - no alert;
//AlertMode = 1 - Tenkan crosses Kijun;
//AlertMode = 2 - Chinkou crosses Price;
//AlertMode = 3 - both together.
//+------------------------------------------------------------------+

int init()
  {
//----
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Tenkan_Buffer);
   SetIndexDrawBegin(0,Tenkan-1);
   SetIndexLabel(0,"Tenkan Sen");
//----
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,Kijun_Buffer);
   SetIndexDrawBegin(1,Kijun-1);
   SetIndexLabel(1,"Kijun Sen");
//----
   a_begin=Kijun; if(a_begin<Tenkan) a_begin=Tenkan;
   SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_DOT);
   SetIndexBuffer(2,SpanA_Buffer);
   SetIndexDrawBegin(2,Kijun+a_begin-1);
   SetIndexShift(2,Kijun);
   SetIndexLabel(2,NULL);
   SetIndexStyle(5,DRAW_LINE,STYLE_DOT);
   SetIndexBuffer(5,SpanA2_Buffer);
   SetIndexDrawBegin(5,Kijun+a_begin-1);
   SetIndexShift(5,Kijun);
   SetIndexLabel(5,"Senkou Span A");
//----
   SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_DOT);
   SetIndexBuffer(3,SpanB_Buffer);
   SetIndexDrawBegin(3,Kijun+Senkou-1);
   SetIndexShift(3,Kijun);
   SetIndexLabel(3,NULL);
   SetIndexStyle(6,DRAW_LINE,STYLE_DOT);
   SetIndexBuffer(6,SpanB2_Buffer);
   SetIndexDrawBegin(6,Kijun+Senkou-1);
   SetIndexShift(6,Kijun);
   SetIndexLabel(6,"Senkou Span B");
//----
   SetIndexStyle(4,DRAW_LINE);
   SetIndexBuffer(4,Chinkou_Buffer);
   SetIndexShift(4,-Kijun);
   SetIndexLabel(4,"Chinkou Span");
//----

//sar
string symbol, tChartPeriod,  tShortName ;  
int    digits, period  ; 

bool Trigger ;

int OldBars = -1 ;


   period       = Period() ;     
   tChartPeriod =  TimeFrameToString(period) ;
   symbol       =  Symbol() ;
   digits       =  Digits ;   

   tShortName = "wl3"+ symbol + tChartPeriod  ;  
//---- indicators
   IndicatorDigits(Digits+1);
//----
   SetIndexStyle(7,DRAW_ARROW);
   SetIndexArrow(7,159);
   SetIndexBuffer(7,SarBuffer);


//sar


   return(0);
  }

//sar
  
  int deinit()
{
   ObjectDelete(tShortName+"01"); 
 
         
   return(0);
}


void SaveLastReverse(int last,int dir,double start,double low,double high,double ep,double sar)
  {
   save_lastreverse=last;
   save_dirlong=dir;
   save_start=start;
   save_last_low=low;
   save_last_high=high;
   save_ep=ep;
   save_sar=sar;
  }

//sar
  
  
//+------------------------------------------------------------------+
//| Ichimoku Kinko Hyo                                               |
//+------------------------------------------------------------------+
int start()
  {
   int    i,ii,k;
   int    counted_bars=IndicatorCounted();
   double high,low,price;
//----
   if(Bars<=Tenkan || Bars<=Kijun || Bars<=Senkou) return(0);
//---- initial zero
   if(counted_bars<1)
     {
      for(i=1;i<=Tenkan;i++)    Tenkan_Buffer[Bars-i]=0;
      for(i=1;i<=Kijun;i++)     Kijun_Buffer[Bars-i]=0;
      for(i=1;i<=a_begin;i++) { SpanA_Buffer[Bars-i]=0; SpanA2_Buffer[Bars-i]=0; }
      for(i=1;i<=Senkou;i++)  { SpanB_Buffer[Bars-i]=0; SpanB2_Buffer[Bars-i]=0; }
     }
//---- Tenkan Sen
   i=Bars-Tenkan;
   if(counted_bars>Tenkan) i=Bars-counted_bars-1;
   while(i>=0)
     {
      high=High[i]; low=Low[i]; k=i-1+Tenkan;
      while(k>=i)
        {
         price=High[k];
         if(high<price) high=price;
         price=Low[k];
         if(low>price)  low=price;
         k--;
        }
      Tenkan_Buffer[i]=(high+low)/2;
      i--;
     }
//---- Kijun Sen
   i=Bars-Kijun;
   if(counted_bars>Kijun) i=Bars-counted_bars-1;
   while(i>=0)
     {
      high=High[i]; low=Low[i]; k=i-1+Kijun;
      while(k>=i)
        {
         price=High[k];
         if(high<price) high=price;
         price=Low[k];
         if(low>price)  low=price;
         k--;
        }
      Kijun_Buffer[i]=(high+low)/2;
      i--;
     }
//---- Senkou Span A
   i=Bars-a_begin+1;
   if(counted_bars>a_begin-1) i=Bars-counted_bars-1;
   while(i>=0)
     {
      price=(Kijun_Buffer[i]+Tenkan_Buffer[i])/2;
      SpanA_Buffer[i]=price;
      SpanA2_Buffer[i]=price;
      i--;
     }
//---- Senkou Span B
   i=Bars-Senkou;
   if(counted_bars>Senkou) i=Bars-counted_bars-1;
   while(i>=0)
     {
      high=High[i]; low=Low[i]; k=i-1+Senkou;
      while(k>=i)
        {
         price=High[k];
         if(high<price) high=price;
         price=Low[k];
         if(low>price)  low=price;
         k--;
        }
      price=(high+low)/2;
      SpanB_Buffer[i]=price;
      SpanB2_Buffer[i]=price;
      i--;
     }
//---- Chinkou Span
   i=Bars-1;
   if(counted_bars>1) i=Bars-counted_bars-1;
   while(i>=0) { Chinkou_Buffer[i]=Close[i]; i--; }
//----
   
   if (AlertMode == 1 || AlertMode == 3)
   {
   string Message1 = Symbol()+" M"+Period()+":Tenkan crosses Kijun";
   
   if ( Tenkan_Buffer[0]>Kijun_Buffer[0] && Tenkan_Buffer[1]<Kijun_Buffer[1])
   PlaySound("alert.wav");
   
   if ( Tenkan_Buffer[0]<Kijun_Buffer[0] && Tenkan_Buffer[1]>Kijun_Buffer[1])
   PlaySound("alert.wav");
   if ( Tenkan_Buffer[1]>Kijun_Buffer[1] && Tenkan_Buffer[2]<Kijun_Buffer[2] && !UptrendAlert1)
   {Alert(Message1+"Signal for BUY"); UptrendAlert1 = true; DntrendAlert1 = false;} 
   if ( Tenkan_Buffer[1]<Kijun_Buffer[1] && Tenkan_Buffer[2]>Kijun_Buffer[2] && !DntrendAlert1)
   {Alert(Message1+"Signal for SELL"); UptrendAlert1 = false; DntrendAlert1 = true;} 
   }
   if (AlertMode == 2 || AlertMode == 3)
   {
   string Message2 = Symbol()+" M"+Period()+":Chinkou (White) crosses Price";
   if ( Close[0]>Close[0+Kijun] && Close[1]<Close[1+Kijun])
   PlaySound("alert2.wav");
   if ( Close[0]<Close[0+Kijun] && Close[1]>Close[1+Kijun])
   PlaySound("alert2.wav");
   if ( Close[1]>Close[1+Kijun] && Close[2]<Close[2+Kijun] && !UptrendAlert2)
   {Alert(Message2+":Signal for BUY"); DntrendAlert2 = false; UptrendAlert2 = true;} 
   if ( Close[1]<Close[1+Kijun] && Close[2]>Close[2+Kijun] && !DntrendAlert2)
   {Alert(Message2+":Signal for SELL"); DntrendAlert2 = true; UptrendAlert2 = false;} 
   }
   
   
      if( Bars != OldBars ) { Trigger = True ; }

   static bool first=false;
   bool   dirlong;
   double start,last_high,last_low;
   double ep,sar,price_low,price_high,pricesar;
  // int    counted_bars=IndicatorCounted();
      int limit=ilimit;
//      SetIndexDrawBegin(0,Bars-limit); 
//      SetIndexDrawBegin(1,Bars-limit); 
//----
   if(Bars<3) return(0);
   dirlong=true;
   start=Step;
//--------------------------------------------+
   ii=Bars-2;
   while(ii>=0)
     {
      price_low=Low[ii];
      price_high=High[ii];
      pricesar=SarBuffer[ii+1];//òåêóùàÿ öåíà ðàâíà SarBuffer ïðåäûäóùåãî áàðà
      //sar ðàâåí öåíà ïðåäûäóùåãî áàðà ïëþñ øàã óìíîæèòü íà 
      //(ñòàðàÿ öåíà ìèíóñ çíà÷åíèå SarBuffer ïðåäûäóùåãî áàðà)
      sar=pricesar+start*(ep-pricesar);
//----
      if(dirlong)
        {
         start+=Step;
         if(sar>price_low)
           {
            SaveLastReverse(ii,true,start,price_low,last_high,ep,sar);
            start=Step; 
            dirlong=false; 
            ep=price_low;
            last_low=price_low;
            SarBuffer[ii]=last_high-Diff*Point;
            if (SarBuffer[ii]<High[ii]&&SarBuffer[ii]>=Low[ii]) 
                SarBuffer[ii]=High[ii]+Point;
            if (SarBuffer[ii]<Low[i]) SarBuffer[ii]=Low[ii]-Point;
            ii--;
            continue;
           }
         if(ep<price_high) { last_high=price_high; ep=price_high; }
        }
//----
      else
        {
         start+=Step;
         if(sar<price_high)
           {
            SaveLastReverse(ii,false,start,last_low,price_high,ep,sar);
            start=Step; 
            dirlong=true; 
            ep=price_high;
            last_high=price_high;
            SarBuffer[ii]=last_low+Diff*Point;
            if (SarBuffer[ii]>Low[i]&&SarBuffer[ii]<=High[ii]) 
                SarBuffer[ii]=Low[ii]-Point;
            if (SarBuffer[ii]>High[ii]) SarBuffer[ii]=High[ii]+Point;
            ii--;
            continue;
           }
         if(ep>price_low) { last_low=price_low; ep=price_low; }
        }
      SarBuffer[ii]=sar;
      ii--;
     }
     
    
//----
//+--------- TRO MODIFICATION ---------------------------------------+  

 //  Print ("Buffer 0 : " + Tenkan_Buffer[0]) ;
 //  Print ("Buffer 1 : " + Kijun_Buffer[1]);
 // Print ("Price is : " + Close[0]);      
 //  Print (SarBuffer[0]);
   
   /// for BUY

      if ( Trigger &&  Sound.Alert ) 
{
   
   if (Tenkan_Buffer[0] > Kijun_Buffer[1] && Close[0] > SarBuffer[0])
   {
   Trigger = False ;
  Alert(Symbol(), " ", TimeFrameToString(Period()), " Buy at ",Close[0], " with stop-loss at ", SarBuffer[0]); 
   }
   
   /// now book profit
   
   if(Close[0] < SarBuffer[0]  && Close[0] < SarBuffer[0])
   {
   Trigger = False ;
   Alert(Symbol(), " ", TimeFrameToString(Period()), " Close Long Position at ",Close[0]); 
   }
   

 // for short position
 
   if (Tenkan_Buffer[0] < Kijun_Buffer[1] && Close[0] < SarBuffer[0])
   {
Trigger = False ;
  Alert(Symbol(), " ", TimeFrameToString(Period()), " Short Sell at ",Close[0], " with stop-loss at ", SarBuffer[0]); 
   }
   
   /// now book profit
   
   if(Close[0] > SarBuffer[0]  && Close[0] > SarBuffer[0])
   {
Trigger = False ;
   Alert(Symbol(), " ", TimeFrameToString(Period()), " Close Short Position at ",Close[0]); 
   } 


}
   
/*      
      if ( Trigger &&  Sound.Alert ) 
      {
        if( Close[0] > SarBuffer[0] && Close[1] < SarBuffer[1] ) 
        {

         Trigger = False ; Alert(symbol,"  ", tChartPeriod, " Price above PSAR "+ DoubleToStr(SarBuffer[0] ,digits)); 
         }
        if( Close[0] < SarBuffer[0] && Close[1] > SarBuffer[1] ) { Trigger = False ; Alert(symbol,"  ", tChartPeriod, " Price below PSAR "+ DoubleToStr(SarBuffer[0] ,digits)); }     
      }
      
      
 */     
   if(Show.PriceBox) { DoBox() ; }
   OldBars = Bars ;   
   

   
   
   return(0);
  }
//+------------------------------------------------------------------+

void DoBox()    
{


       if (ObjectFind(tShortName+"01") != 0)
      {
          ObjectCreate(tShortName+"01",OBJ_ARROW,0,Time[0],SarBuffer[0]);
          ObjectSet(tShortName+"01",OBJPROP_ARROWCODE,SYMBOL_RIGHTPRICE);
          ObjectSet(tShortName+"01",OBJPROP_COLOR,indicator_color8);  
          ObjectSet(tShortName+"01",OBJPROP_WIDTH,myBoxWidth);  
      } 
      else
      {
         ObjectMove(tShortName+"01",0,Time[0],SarBuffer[0]);
         ObjectSet(tShortName+"01",OBJPROP_COLOR,indicator_color8);  
      }
 


      

                
   return(0);
}


//+--------- TRO MODIFICATION ---------------------------------------+  

string TimeFrameToString(int tf)
{
   string tfs;
   switch(tf) {
      case PERIOD_M1:  tfs="M1"  ; break;
      case PERIOD_M5:  tfs="M5"  ; break;
      case PERIOD_M15: tfs="M15" ; break;
      case PERIOD_M30: tfs="M30" ; break;
      case PERIOD_H1:  tfs="H1"  ; break;
      case PERIOD_H4:  tfs="H4"  ; break;
      case PERIOD_D1:  tfs="D1"  ; break;
      case PERIOD_W1:  tfs="W1"  ; break;
      case PERIOD_MN1: tfs="MN";
   }
   return(tfs);
}

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