Navigation:Home > Content >

Shi_cannel_forollchart.mq4

Time: 2011-04-11 | Download file:Shi_cannel_forollchart.mq4

#property link "http://www.forex-instruments.info"
//+------------------------------------------------------------------+
//|                                                        Канал.mq4 |
//|                                                       Langolier. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Langolier."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window 
#property indicator_buffers 6 
#property indicator_color1 Red 
double ExtMapBuffer1[]; 
double LBuffer[];
double HBuffer[];
double MBuffer[];
double CBuffer[];
double SBuffer[];
int B4,B5;

//---- input parameters 
extern int AllBars=240; 
extern int BarsForFract=0; 
int CurrentBar=0; 
double Step=0; 
int B1=-1,B2=-1; 
int UpDown=0; 
double P1=0,P2=0,PP=0; 
int i=0,AB=300,BFF=0; 
int ishift=0; 
double iprice=0; 
datetime T1,T2; 

double OldChannelWidth,OldSlopeAngle;
int alertTag;
extern int ChannelAlert=50;
extern int SlopeAlert=25;
extern bool ChannelTalk=true;
int firsttime=0;
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function | 
//+------------------------------------------------------------------+ 
int init() 
{ 
//---- indicators 
SetIndexStyle(0,DRAW_ARROW); 
SetIndexArrow(0,164); 
SetIndexBuffer(0,ExtMapBuffer1); 
SetIndexEmptyValue(0,0.0); 
   
   SetIndexBuffer(1,LBuffer);
   SetIndexBuffer(2,HBuffer);
   SetIndexBuffer(3,MBuffer);
   SetIndexBuffer(4,CBuffer);
   SetIndexBuffer(5,SBuffer);
//---- 


return(0); 
} 
//+------------------------------------------------------------------+ 
//| Custor indicator deinitialization function | 
//+------------------------------------------------------------------+ 
int deinit() 
{ 
//---- 

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

void DelObj() 
{ 
ObjectDelete("TL1"); 
ObjectDelete("TL2"); 
ObjectDelete("MIDL"); 
} 

//+------------------------------------------------------------------+ 
//| Custom indicator iteration function | 
//+------------------------------------------------------------------+ 
int start() 
{ 


int counted_bars=IndicatorCounted();
int X = (Ask-P1);
int X2 = (Bid-P2);
string symbolTxt;
string PeriodTxt;
string WhatTxt;
if (Symbol()=="EURUSD") { symbolTxt = "Euro Dollar"; }
if (Symbol()=="EURJPY") { symbolTxt = "Euro Yen "; }
if (Symbol()=="EURAUD") { symbolTxt = "Euro Aussie "; }
if (Symbol()=="EURCAD") { symbolTxt = "Euro Canadian"; }
if (Symbol()=="EURCHF") { symbolTxt = "Euro Swiss"; }
if (Symbol()=="GBPUSD") { symbolTxt = "Cable Dollar"; }
if (Symbol()=="GBPJPY") { symbolTxt = "Cable Yen "; }
if (Symbol()=="GBPCHF") { symbolTxt = "Cable Swiss"; }
if (Symbol()=="AUDUSD") { symbolTxt = "Aussie"; }
if (Symbol()=="USDCHF") { symbolTxt = "Swiss Dollar"; }
if (Symbol()=="USDCAD") { symbolTxt = "Canada"; }
if (Symbol()=="USDJPY") { symbolTxt = "Yen Dollar"; } 
if (Symbol()=="CHFJPY") { symbolTxt = "Swiss Yen "; }
if (Symbol()=="GOLD") { symbolTxt = "Gold"; }
if (Period()==1){PeriodTxt= "One minute";}
if (Period()==5){PeriodTxt= "Five minutes";} 
if (Period()==15){PeriodTxt= "Fifteen minutes"; } 
if (Period()==30){PeriodTxt= "Thirty minutes"; } 
if (Period()==60){PeriodTxt= "One hour"; } 
if (Period()==240){PeriodTxt= "Four hours";} 
if (Period()==1440){PeriodTxt= "Day";} 
if (Period()==10080){PeriodTxt= "Week";} 


//---- 
if ((AllBars==0) || (Bars0) 
BFF=BarsForFract; 
else 
{ 
switch (Period()) 
{ 
case 1: BFF=12; break; 
case 5: BFF=48; break; 
case 15: BFF=24; break; 
case 30: BFF=24; break; 
case 60: BFF=12; break; 
case 240: BFF=15; break; 
case 1440: BFF=10; break; 
case 10080: BFF=6; break; 
default: DelObj(); return(-1); break; 
X = P1;
} 
} 
CurrentBar=2; //считаем с третьего бара, чтобы фрактал "закрепился 
B1=-1; B2=-1; UpDown=0; 
while(((B1==-1) || (B2==-1)) && (CurrentBar-1) && (CurrentBar==Highest(Symbol(),Period(),MODE_HIGH,BFF*2+1,CurrentBar-BFF))) 
      { 
         if(UpDown==0) { UpDown=1; B1=CurrentBar; P1=High[B1]; } 
         else { B2=CurrentBar; P2=High[B2]; } 
      } 
   CurrentBar++; 
   } 
   if((B1==-1) || (B2==-1))
   {DelObj(); return(-1);} // Значит не нашли фракталов среди 300 баров  
   Step=(P2-P1)/(B2-B1);//Вычислили шаг, если он положительный, то канал нисходящий 
   P1=P1-B1*Step; B1=0;//переставляем цену и первый бар к нулю 
   
   //А теперь опорную точку противоположной линии канала. 
   ishift=0; iprice=0; 
   if(UpDown==1) 
   { 
   PP=Low[2]-2*Step; 
   for(i=3;i<=B2;i++) 
   { 
   if(Low[i]P1)
      {ishift=0; iprice=P1;} 
      
   if(High[1]>P1+Step)
      {ishift=1; iprice=P1+Step;} 
   
   } 
   else 
   { 
   
      PP=High[2]-2*Step; 
      for(i=3;i<=B2;i++) 
   { 
   if(High[i]>PP+Step*i)
      { PP=High[i]-i*Step;} 
   } 

   if(Low[0]PP)
      {ishift=0; iprice=PP;} 

   if(High[1]>PP+Step)
      {ishift=1; iprice=PP+Step;} 
   } 
   //Теперь переставим конечную цену и бар на АВ, чтобы линии канала рисовались подлиннее 
   P2=P1+AB*Step; 
   T1=Time[B1];
   T2=Time[AB]; 

   //Если не было пересечения канала, то 0, иначе ставим псису. 
   if(iprice!=0)
   ExtMapBuffer1[ishift]=iprice; 
   DelObj(); 

   double ChannelWidth=MathAbs(PP - P1)/Point;
   double SlopeAngle=MathFloor((-Step/Point)*100);

   if(Period()==1){
   
   ObjectCreate("M1-TL1",OBJ_TREND,0,T2,PP+Step*AB,T1,PP); 
   if(ChannelWidth >= ChannelAlert) {ObjectSet("M1-TL1",OBJPROP_COLOR,Navy);}
   else {ObjectSet("M1-TL1",OBJPROP_COLOR,Red); }
   ObjectSet("M1-TL1",OBJPROP_WIDTH,1); 
   ObjectSet("M1-TL1",OBJPROP_STYLE,STYLE_SOLID); 


   ObjectCreate("M1-TL2",OBJ_TREND,0,T2,P2,T1,P1); 
   if(ChannelWidth >= ChannelAlert) {ObjectSet("M1-TL2",OBJPROP_COLOR,Navy); }
   else{ObjectSet("M1-TL2",OBJPROP_COLOR,Red);}
   ObjectSet("M1-TL2",OBJPROP_WIDTH,1); 
   ObjectSet("M1-TL2",OBJPROP_STYLE,STYLE_SOLID); 


   ObjectCreate("M1-MIDL",OBJ_TREND,0,T2,(P2+PP+Step*AB)/2,T1,(P1+PP)/2); 
   if(ChannelWidth >= ChannelAlert && MathAbs(SlopeAngle) >= SlopeAlert) {ObjectSet("M1-MIDL",OBJPROP_COLOR,Navy); }
   else{ObjectSet("M1-MIDL",OBJPROP_COLOR,Red);}
   ObjectSet("M1-MIDL",OBJPROP_WIDTH,1); 
   ObjectSet("M1-MIDL",OBJPROP_STYLE,STYLE_DOT); 
   }
   
   if(Period()==5){
   
   ObjectCreate("M5-TL1",OBJ_TREND,0,T2,PP+Step*AB,T1,PP); 
   if(ChannelWidth >= ChannelAlert) {ObjectSet("M5-TL1",OBJPROP_COLOR,SeaGreen);}
   else {ObjectSet("M5-TL1",OBJPROP_COLOR,Red); }
   ObjectSet("M5-TL1",OBJPROP_WIDTH,1); 
   ObjectSet("M5-TL1",OBJPROP_STYLE,STYLE_SOLID); 


   ObjectCreate("M5-TL2",OBJ_TREND,0,T2,P2,T1,P1); 
   if(ChannelWidth >= ChannelAlert) {ObjectSet("M5-TL2",OBJPROP_COLOR,SeaGreen); }
   else{ObjectSet("M5-TL2",OBJPROP_COLOR,Red);}
   ObjectSet("M5-TL2",OBJPROP_WIDTH,1); 
   ObjectSet("M5-TL2",OBJPROP_STYLE,STYLE_SOLID); 


   ObjectCreate("M5-MIDL",OBJ_TREND,0,T2,(P2+PP+Step*AB)/2,T1,(P1+PP)/2); 
   if(ChannelWidth >= ChannelAlert && MathAbs(SlopeAngle) >= SlopeAlert) {ObjectSet("M5-MIDL",OBJPROP_COLOR,SeaGreen); }
   else{ObjectSet("M5-MIDL",OBJPROP_COLOR,Red);}
   ObjectSet("M5-MIDL",OBJPROP_WIDTH,1); 
   ObjectSet("M5-MIDL",OBJPROP_STYLE,STYLE_DOT); 
   }

   if(Period()==15){
   
   ObjectCreate("M15-TL1",OBJ_TREND,0,T2,PP+Step*AB,T1,PP); 
   if(ChannelWidth >= ChannelAlert) {ObjectSet("M15-TL1",OBJPROP_COLOR,DarkOrange);}
   else {ObjectSet("M15-TL1",OBJPROP_COLOR,Red); }
   ObjectSet("M15-TL1",OBJPROP_WIDTH,1); 
   ObjectSet("M15-TL1",OBJPROP_STYLE,STYLE_SOLID); 


   ObjectCreate("M15-TL2",OBJ_TREND,0,T2,P2,T1,P1); 
   if(ChannelWidth >= ChannelAlert) {ObjectSet("M15-TL2",OBJPROP_COLOR,DarkOrange); }
   else{ObjectSet("M15-TL2",OBJPROP_COLOR,Red);}
   ObjectSet("M15-TL2",OBJPROP_WIDTH,1); 
   ObjectSet("M15-TL2",OBJPROP_STYLE,STYLE_SOLID); 


   ObjectCreate("M15-MIDL",OBJ_TREND,0,T2,(P2+PP+Step*AB)/2,T1,(P1+PP)/2); 
   if(ChannelWidth >= ChannelAlert && MathAbs(SlopeAngle) >= SlopeAlert) {ObjectSet("M15-MIDL",OBJPROP_COLOR,DarkOrange); }
   else{ObjectSet("M15-MIDL",OBJPROP_COLOR,Red);}
   ObjectSet("M15-MIDL",OBJPROP_WIDTH,1); 
   ObjectSet("M15-MIDL",OBJPROP_STYLE,STYLE_DOT); 
   }

   if(Period()==30){
   
   ObjectCreate("M30-TL1",OBJ_TREND,0,T2,PP+Step*AB,T1,PP); 
   if(ChannelWidth >= ChannelAlert) {ObjectSet("M30-TL1",OBJPROP_COLOR,Bisque);}
   else {ObjectSet("M30-TL1",OBJPROP_COLOR,Red); }
   ObjectSet("M30-TL1",OBJPROP_WIDTH,1); 
   ObjectSet("M30-TL1",OBJPROP_STYLE,STYLE_SOLID); 


   ObjectCreate("M30-TL2",OBJ_TREND,0,T2,P2,T1,P1); 
   if(ChannelWidth >= ChannelAlert) {ObjectSet("M30-TL2",OBJPROP_COLOR,Bisque); }
   else{ObjectSet("M30-TL2",OBJPROP_COLOR,Red);}
   ObjectSet("M30-TL2",OBJPROP_WIDTH,1); 
   ObjectSet("M30-TL2",OBJPROP_STYLE,STYLE_SOLID); 


   ObjectCreate("M30-MIDL",OBJ_TREND,0,T2,(P2+PP+Step*AB)/2,T1,(P1+PP)/2); 
   if(ChannelWidth >= ChannelAlert && MathAbs(SlopeAngle) >= SlopeAlert) {ObjectSet("M30-MIDL",OBJPROP_COLOR,Bisque); }
   else{ObjectSet("M30-MIDL",OBJPROP_COLOR,Red);}
   ObjectSet("M30-MIDL",OBJPROP_WIDTH,1); 
   ObjectSet("M30-MIDL",OBJPROP_STYLE,STYLE_DOT); 
   }

   if(Period()==60){
   
   ObjectCreate("H1-TL1",OBJ_TREND,0,T2,PP+Step*AB,T1,PP); 
   if(ChannelWidth >= ChannelAlert) {ObjectSet("H1-TL1",OBJPROP_COLOR,Yellow);}
   else {ObjectSet("H1-TL1",OBJPROP_COLOR,Red); }
   ObjectSet("H1-TL1",OBJPROP_WIDTH,1); 
   ObjectSet("H1-TL1",OBJPROP_STYLE,STYLE_SOLID); 


   ObjectCreate("H1-TL2",OBJ_TREND,0,T2,P2,T1,P1); 
   if(ChannelWidth >= ChannelAlert) {ObjectSet("H1-TL2",OBJPROP_COLOR,Yellow); }
   else{ObjectSet("H1-TL2",OBJPROP_COLOR,Red);}
   ObjectSet("H1-TL2",OBJPROP_WIDTH,1); 
   ObjectSet("H1-TL2",OBJPROP_STYLE,STYLE_SOLID); 


   ObjectCreate("H1-MIDL",OBJ_TREND,0,T2,(P2+PP+Step*AB)/2,T1,(P1+PP)/2); 
   if(ChannelWidth >= ChannelAlert && MathAbs(SlopeAngle) >= SlopeAlert) {ObjectSet("H1-MIDL",OBJPROP_COLOR,Yellow); }
   else{ObjectSet("H1-MIDL",OBJPROP_COLOR,Red);}
   ObjectSet("H1-MIDL",OBJPROP_WIDTH,1); 
   ObjectSet("H1-MIDL",OBJPROP_STYLE,STYLE_DOT); 
   }

   if(Period()==240){
   
   ObjectCreate("H4-TL1",OBJ_CHANNEL,0,T2,PP+Step*AB,T1,PP); 
   if(ChannelWidth >= ChannelAlert) {ObjectSet("H4-TL1",OBJPROP_COLOR,LightSkyBlue);}
   else {ObjectSet("H4-TL1",OBJPROP_COLOR,Red); }
   ObjectSet("H4-TL1",OBJPROP_WIDTH,1); 
   ObjectSet("H4-TL1",OBJPROP_STYLE,STYLE_SOLID); 


   ObjectCreate("H4-TL2",OBJ_CHANNEL,0,T2,P2,T1,P1); 
   if(ChannelWidth >= ChannelAlert) {ObjectSet("H4-TL2",OBJPROP_COLOR,LightSkyBlue); }
   else{ObjectSet("H4-TL2",OBJPROP_COLOR,Red);}
   ObjectSet("H4-TL2",OBJPROP_WIDTH,1); 
   ObjectSet("H4-TL2",OBJPROP_STYLE,STYLE_SOLID); 


   ObjectCreate("H4-MIDL",OBJ_CHANNEL,0,T2,(P2+PP+Step*AB)/2,T1,(P1+PP)/2); 
   if(ChannelWidth >= ChannelAlert && MathAbs(SlopeAngle) >= SlopeAlert) {ObjectSet("H4-MIDL",OBJPROP_COLOR,LightSkyBlue); }
   else{ObjectSet("H4-MIDL",OBJPROP_COLOR,Red);}
   ObjectSet("H4-MIDL",OBJPROP_WIDTH,1); 
   ObjectSet("H4-MIDL",OBJPROP_STYLE,STYLE_DOT); 
   }

   if(Period()==1440){
   
   ObjectCreate("D1-TL1",OBJ_TREND,0,T2,PP+Step*AB,T1,PP); 
   if(ChannelWidth >= ChannelAlert) {ObjectSet("D1-TL1",OBJPROP_COLOR,Ivory);}
   else {ObjectSet("D1-TL1",OBJPROP_COLOR,Red); }
   ObjectSet("D1-TL1",OBJPROP_WIDTH,1); 
   ObjectSet("D1-TL1",OBJPROP_STYLE,STYLE_SOLID); 


   ObjectCreate("D1-TL2",OBJ_TREND,0,T2,P2,T1,P1); 
   if(ChannelWidth >= ChannelAlert) {ObjectSet("D1-TL2",OBJPROP_COLOR,Ivory); }
   else{ObjectSet("D1-TL2",OBJPROP_COLOR,Red);}
   ObjectSet("D1-TL2",OBJPROP_WIDTH,1); 
   ObjectSet("D1-TL2",OBJPROP_STYLE,STYLE_SOLID); 


   ObjectCreate("D1-MIDL",OBJ_TREND,0,T2,(P2+PP+Step*AB)/2,T1,(P1+PP)/2); 
   if(ChannelWidth >= ChannelAlert && MathAbs(SlopeAngle) >= SlopeAlert) {ObjectSet("D1-MIDL",OBJPROP_COLOR,Ivory); }
   else{ObjectSet("D1-MIDL",OBJPROP_COLOR,Red);}
   ObjectSet("D1-MIDL",OBJPROP_WIDTH,1); 
   ObjectSet("D1-MIDL",OBJPROP_STYLE,STYLE_DOT); 
   }

   if(Period()==10080){
   
   ObjectCreate("W1-TL1",OBJ_TREND,0,T2,PP+Step*AB,T1,PP); 
   if(ChannelWidth >= ChannelAlert) {ObjectSet("W1-TL1",OBJPROP_COLOR,Lime);}
   else {ObjectSet("W1-TL1",OBJPROP_COLOR,Red); }
   ObjectSet("W1-TL1",OBJPROP_WIDTH,1); 
   ObjectSet("W1-TL1",OBJPROP_STYLE,STYLE_SOLID); 


   ObjectCreate("W1-TL2",OBJ_TREND,0,T2,P2,T1,P1); 
   if(ChannelWidth >= ChannelAlert) {ObjectSet("W1-TL2",OBJPROP_COLOR,Lime); }
   else{ObjectSet("W1-TL2",OBJPROP_COLOR,Red);}
   ObjectSet("W1-TL2",OBJPROP_WIDTH,1); 
   ObjectSet("W1-TL2",OBJPROP_STYLE,STYLE_SOLID); 


   ObjectCreate("W1-MIDL",OBJ_TREND,0,T2,(P2+PP+Step*AB)/2,T1,(P1+PP)/2); 
   if(ChannelWidth >= ChannelAlert && MathAbs(SlopeAngle) >= SlopeAlert) {ObjectSet("W1-MIDL",OBJPROP_COLOR,Lime); }
   else{ObjectSet("W1-MIDL",OBJPROP_COLOR,Red);}
   ObjectSet("W1-MIDL",OBJPROP_WIDTH,1); 
   ObjectSet("W1-MIDL",OBJPROP_STYLE,STYLE_DOT); 
   }
   
   GlobalVariableSet("ST1",T2);//ST1,B4
   GlobalVariableSet("ST2",T1);//ST2,B5
   GlobalVariableSet("Bar1",B4);
   GlobalVariableSet("Bar2",B5);	
   ObjectCreate("Dot1",OBJ_ARROW,0,T1,(P1+PP)/2);
   ObjectSet("Dot1",	SYMBOL_CHECKSIGN,Gold);
//---- 
WhatTxt="Change";
if (OldChannelWidthChannelWidth) WhatTxt="is narrowing";
if (OldSlopeAngle<0 && SlopeAngle>0 )WhatTxt="Changed direction to up";
if (OldSlopeAngle>0 && SlopeAngle<0 )WhatTxt="Changed direction to down";


if(firsttime && ChannelTalk && alertTag != Time[0]&& OldChannelWidth!=ChannelWidth || OldSlopeAngle!=SlopeAngle)
{
Alert(Symbol()," ",Period(),"Shi Channel Change");
//SpeechText("chee channel"+ WhatTxt+" "+symbolTxt+" "+PeriodTxt);
alertTag = Time[0];

}




OldChannelWidth=ChannelWidth;
OldSlopeAngle=SlopeAngle;
firsttime=firsttime+1;
if (SlopeAngle<0){
Comment("\n"," ",Symbol()," - M",Period()," (Bid = ",Bid," Ask = ",Ask,")","\n"," Верхняя граница = ",PP,"\n"," Середина = ",(P1+PP)/2,"\n"," Нижняя граница = ",P1,"\n",
        " Размер канала = ", DoubleToStr(ChannelWidth,0),"\n"," Наклон = ", DoubleToStr(SlopeAngle,0));
}
if (SlopeAngle>0){
Comment("\n"," ",Symbol()," - M",Period()," (Bid = ",Bid," Ask = ",Ask,")","\n"," Верхняя граница = ",P1,"\n"," Середина = ",(P1+PP)/2,"\n"," Нижняя граница = ",PP,"\n",
        " Размер канала = ", DoubleToStr(ChannelWidth,0),"\n"," Наклон = ", DoubleToStr(SlopeAngle,0));
}

   LBuffer[B1]=P1;
   HBuffer[B1]=PP;
   MBuffer[B1]=(P1+PP)/2;
   CBuffer[B1]=ChannelWidth;
   SBuffer[B1]=SlopeAngle;
//----
return(0); 
} 
//+------------------------------------------------------------------+

Recommend