Time: 2010-05-06 | Download file:K-Barishpoltz_Channel.mq4
//+------------------------------------------------------------------+ //| Barishpoltz Channel.mq4 | //| SaiborEye | //| | //+------------------------------------------------------------------+ #property copyright "SaiborEye" #property link "" /* Это пробный вариант индикатора, выполняющего построение и отображение пресловутых скользящих каналов Баришпольца. Данный релиз предназначен для прикладной оценки возможности отказа от ручного построения, выявления и коррекции слабых мест, предложения по вводу дополнительных параметров */ #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 Gold #property indicator_color2 Coral #property indicator_color3 Aquamarine //---- input parameters extern int RightLevel=3;// Отступ от правой границы графика (Номер бара, 0 - последний, не сформировавшийся) extern int BetweenPeaks=2;// Минимальное расстояние между экстремумами (количество баров) extern int MaxLength=600;// Максимальная разрешенная длина канала (количество баров) extern double PeakLevel=10.0;// Высота пика, превысив которую он имеет право называться экстремумом (пункты) //---- buffers double ExtMapBuffer1[]; double ExtMapBuffer2[]; double ExtMapBuffer3[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_SECTION); SetIndexBuffer(0,ExtMapBuffer1); SetIndexEmptyValue(0,0.0); SetIndexLabel(0,"Top Border"); SetIndexStyle(1,DRAW_SECTION); SetIndexBuffer(1,ExtMapBuffer2); SetIndexEmptyValue(1,0.0); SetIndexLabel(1,"Bottom Border"); SetIndexStyle(2,DRAW_ARROW,STYLE_SOLID,3); SetIndexBuffer(2,ExtMapBuffer3); SetIndexEmptyValue(2,0.0); SetIndexArrow(2,159); SetIndexLabel(2,"Peak"); //---- PeakLevel*=Point; return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ int CheckBorders(int X1,int X2,int X3,double Y1,double Y2,double Y3){ int x,limit; if(X1>X2)limit=X1;else limit=X2; if(Y1>Y3&&Y2>Y3){// TOP TWO for(x=0;xLow[x])return (-1); }// LINE LOOP-2 return (0); }// TOP TWO if(Y1 Low[x])return (-1); }// LINE LOOP-3 for(x=0;x Bars-2)limit=Bars-2; ArrayResize(TopPeaksPos,limit);ArrayResize(BottomPeaksPos,limit); TopPeaksIndex=0;BottomPeaksIndex=0; ArrayInitialize(ExtMapBuffer1,0.0);ArrayInitialize(ExtMapBuffer2,0.0);ArrayInitialize(ExtMapBuffer3,0.0); //---- for(pos=RightLevel;pos RightLevel&&pos =High[pos-1]&&High[pos]>=High[pos+1]){// TOP PEAKS Flag=TRUE; for(pos1=pos-1;pos1>=RightLevel;pos1--){if(High[pos1]>High[pos]){Flag=FALSE;break;} if(High[pos1]<=High[pos]-PeakLevel)break;} if(Flag)if(pos1==RightLevel-1)Flag=FALSE; if(Flag)for(pos1=pos+1;pos1 High[pos]){Flag=FALSE;break;} if(High[pos1]<=High[pos]-PeakLevel)break;} if(Flag)if(pos1==limit)Flag=FALSE; if(Flag){TopPeaksPos[TopPeaksIndex]=pos;TopPeaksIndex++;} }// TOP PEAKS //---- if(pos>RightLevel&&pos =RightLevel;pos1--){if(Low[pos1] =Low[pos]+PeakLevel)break;} if(Flag)if(pos1==RightLevel-1)Flag=FALSE; if(Flag)for(pos1=pos+1;pos1 =Low[pos]+PeakLevel)break;} if(Flag)if(pos1==limit)Flag=FALSE; if(Flag){BottomPeaksPos[BottomPeaksIndex]=pos;BottomPeaksIndex++;} }// BOTTOM PEAKS }// MAIN LOOP //---- if(BottomPeaksIndex>TopPeaksIndex)limit=BottomPeaksIndex;else limit=TopPeaksIndex; for(pos=0;pos =TopPeaksPos[pos];pos2++) if(value>Low[BottomPeaksPos[pos2]]){value=Low[BottomPeaksPos[pos2]];posminmax=pos2;} if(posminmax>-1)if(TopPeaksPos[pos1]-TopPeaksPos[pos]>BetweenPeaks)if(CheckBorders(TopPeaksPos[pos],TopPeaksPos[pos1],BottomPeaksPos[posminmax], High[TopPeaksPos[pos]],High[TopPeaksPos[pos1]],Low[BottomPeaksPos[posminmax]])==0){// DRAWING ExtMapBuffer1[0] = (0-TopPeaksPos[pos])*(High[TopPeaksPos[pos1]]-High[TopPeaksPos[pos]])/(TopPeaksPos[pos1]-TopPeaksPos[pos])+High[TopPeaksPos[pos]]; ExtMapBuffer1[TopPeaksPos[pos1]] = High[TopPeaksPos[pos1]]; ExtMapBuffer2[0] = Low[BottomPeaksPos[posminmax]]+(0-BottomPeaksPos[posminmax])* (High[TopPeaksPos[pos1]]-High[TopPeaksPos[pos]])/(TopPeaksPos[pos1]-TopPeaksPos[pos]); ExtMapBuffer2[TopPeaksPos[pos1]] = Low[BottomPeaksPos[posminmax]]+(TopPeaksPos[pos1]-BottomPeaksPos[posminmax])* (High[TopPeaksPos[pos1]]-High[TopPeaksPos[pos]])/(TopPeaksPos[pos1]-TopPeaksPos[pos]); ExtMapBuffer3[TopPeaksPos[pos]]=High[TopPeaksPos[pos]];ExtMapBuffer3[TopPeaksPos[pos1]]=High[TopPeaksPos[pos1]]; ExtMapBuffer3[BottomPeaksPos[posminmax]]=Low[BottomPeaksPos[posminmax]]; return (0); }// DRAWING }// SECOND POINT SEEK }else {// BOTTOM NEARLY for(pos1=pos;pos1 =BottomPeaksPos[pos];pos2++) if(value -1)if(BottomPeaksPos[pos1]-BottomPeaksPos[pos]>BetweenPeaks)if(CheckBorders(BottomPeaksPos[pos],BottomPeaksPos[pos1],TopPeaksPos[posminmax], Low[BottomPeaksPos[pos]],Low[BottomPeaksPos[pos1]],High[TopPeaksPos[posminmax]])==0){// DRAWING ExtMapBuffer1[0] = (0-BottomPeaksPos[pos])*(Low[BottomPeaksPos[pos1]]-Low[BottomPeaksPos[pos]])/(BottomPeaksPos[pos1]-BottomPeaksPos[pos])+Low[BottomPeaksPos[pos]]; ExtMapBuffer1[BottomPeaksPos[pos1]] = Low[BottomPeaksPos[pos1]]; ExtMapBuffer2[0] = High[TopPeaksPos[posminmax]]+(0-TopPeaksPos[posminmax])* (Low[BottomPeaksPos[pos1]]-Low[BottomPeaksPos[pos]])/(BottomPeaksPos[pos1]-BottomPeaksPos[pos]); ExtMapBuffer2[BottomPeaksPos[pos1]] = High[TopPeaksPos[posminmax]]+(BottomPeaksPos[pos1]-TopPeaksPos[posminmax])* (Low[BottomPeaksPos[pos1]]-Low[BottomPeaksPos[pos]])/(BottomPeaksPos[pos1]-BottomPeaksPos[pos]); ExtMapBuffer3[BottomPeaksPos[pos]]=Low[BottomPeaksPos[pos]];ExtMapBuffer3[BottomPeaksPos[pos1]]=Low[BottomPeaksPos[pos1]]; ExtMapBuffer3[TopPeaksPos[posminmax]]=High[TopPeaksPos[posminmax]]; return (0); }// DRAWING }// SECOND POINT SEEK }// BOTTOM NEARLY }// SEEK LOOP return(0); } //+------------------------------------------------------------------+