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);
}





Sample



image not available


Analysis



Market Information Used:

Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains close prices for each bar
Series array that contains open time of each bar


Indicator Curves created:

Implements a curve of type DRAW_LINE

Implements a curve of type DRAW_HISTOGRAM
Implements a curve of type DRAW_ARROW

Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features:

It plays sound alerts
It issuies visual alerts to the screen