//+------------------------------------------------------------------+ //| Flag_and_Pennant.mq4 | //| Flag_and_Pennant Copyright 2015, fxborg | //| http://fxborg-labo.hateblo.jp/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, fxborg" #property link "http://fxborg-labo.hateblo.jp/" #property version "1.0" #property strict #property indicator_chart_window #property indicator_buffers 5 //--- plot Label1 #property indicator_type1 DRAW_LINE #property indicator_type2 DRAW_LINE #property indicator_type3 DRAW_LINE #property indicator_type4 DRAW_LINE #property indicator_type5 DRAW_NONE //--- #property indicator_color1 Blue #property indicator_color2 Blue #property indicator_color3 Green #property indicator_color4 Green #property indicator_color5 Gray #property indicator_label1 "Flag" #property indicator_label2 "Flag" #property indicator_label3 "Pennant" #property indicator_label4 "Pennant" #property indicator_label5 "Regression Line" //--- #property indicator_width1 2 #property indicator_width2 2 #property indicator_width3 2 #property indicator_width4 2 #property indicator_width5 1 #property indicator_style1 STYLE_SOLID #property indicator_style2 STYLE_SOLID #property indicator_style3 STYLE_SOLID #property indicator_style4 STYLE_SOLID #property indicator_style5 STYLE_SOLID //--- input parameters input int InpChannelPeriod = 14; // Channel Period input int InpSlopePeriod = 50; // Slope Period input double InpPennantPatternFacter=-10; // Pennant Pattern Facter input double InpFlagPatternFacter=5; // Flag Pattern Facter int FlagPeriod=10; int FlagMinPeriod=5; double PennantPatternFacter=InpPennantPatternFacter; double FlagPatternFacter=InpFlagPatternFacter; //--- int min_rates_total; //--- indicator buffers double FlagH_Buffer[]; double FlagL_Buffer[]; double PennantH_Buffer[]; double PennantL_Buffer[]; //---- for calc double HighesBuffer[]; double LowesBuffer[]; double MedianBuffer[]; double SlopeBuffer[]; double SigH_Buffer[]; double SigL_Buffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //---- Initialization of variables of data calculation starting point min_rates_total=1+InpSlopePeriod+1; if(InpSlopePeriodlow[k]) dmin=low[k]; if(dmax=MedianBuffer[i-j] || HighesBuffer[i]!=HighesBuffer[i-j]) { is_up_rest=false; } } bool is_down_rest=true; for(j=0;j=FlagMinPeriod-1) { //--- double angle=-1000000.0; int lower=1000000.0; for(j=from_pos-1;j>=0;j--) { int pos=i-j-1; double b=(high[i-from_pos-1]-high[pos])/((i-from_pos-1)-pos); if(angle0 && lower>low[pos])lower=pos; } //--- double arr_lo[]; ArraySetAsSeries(arr_lo,true); int chk_l=CopyLow(Symbol(),PERIOD_CURRENT,rates_total-i,(from_pos+1),arr_lo); //--- if(chk_l=PennantPatternFacter && up_angle-dn_angle0) { SigH_Buffer[i]=high[i]; if(ptn==1) { FlagH_Buffer[i-from_pos-2]=0; FlagL_Buffer[i-from_pos-2]=0; } else if(ptn==2) { PennantH_Buffer[i-from_pos-2]=0; PennantL_Buffer[i-from_pos-2]=0; } //--- for(j=from_pos;j>=0;j--) { int pos=i-j-1; if(ptn==1) FlagH_Buffer[pos]=high[i-from_pos-1]+(angle*(pos -(i-from_pos-1))); else if(ptn==2) PennantH_Buffer[pos]=high[i-from_pos-1]+(angle*(pos -(i-from_pos-1))); } //--- for(j=0;j<=from_pos;j++) { if(ptn==1) FlagL_Buffer[i-j-1]=a+b*j-diff/2; else if(ptn==2) PennantL_Buffer[i-j-1]=a+b*j-diff/2; } } } } } //+----------------------------------------------------+ //|down trend | //+----------------------------------------------------+ if(is_down_rest) { //+----------------------------------------------------+ //|exists | //+----------------------------------------------------+ if(SigL_Buffer[i-1]!=0) { SigL_Buffer[i]=SigL_Buffer[i-1]; if(PennantL_Buffer[i-2]!=0) { PennantH_Buffer[i-1]=PennantH_Buffer[i-2]*2-PennantH_Buffer[i-3]; PennantL_Buffer[i-1]=PennantL_Buffer[i-2]*2-PennantL_Buffer[i-3]; } if(FlagL_Buffer[i-2]!=0) { FlagH_Buffer[i-1]=FlagH_Buffer[i-2]*2-FlagH_Buffer[i-3]; FlagL_Buffer[i-1]=FlagL_Buffer[i-2]*2-FlagL_Buffer[i-3]; } } else { //+----------------------------------------------------+ //| detect | //+----------------------------------------------------+ double arr_lo[]; ArraySetAsSeries(arr_lo,true); //--- Get Rate info int chk_l=CopyLow(Symbol(),PERIOD_CURRENT,rates_total-i,FlagPeriod,arr_lo); if(chk_l=FlagMinPeriod-1) { int lower[]; int sz=0; //--- for(j=from_pos-1;j>=0;j--) { if(low[i-j-2]>=low[i-j-1]) { sz++; ArrayResize(lower,sz); lower[sz-1]=i-j-1; } } //--- double angle=1000000.0; for(j=from_pos-1;j>=0;j--) { int pos=i-j-1; double b=(low[i-from_pos-1]-low[pos])/((i-from_pos-1)-pos); if(angle>b)angle=b; } //--- double arr_hi[]; ArraySetAsSeries(arr_hi,true); int chk_h=CopyHigh(Symbol(),PERIOD_CURRENT,rates_total-i,(from_pos+1),arr_hi); if(chk_h=PennantPatternFacter && up_angle-dn_angle0) { SigL_Buffer[i]=low[i]; if(ptn==1) { FlagH_Buffer[i-from_pos-2]=0; FlagL_Buffer[i-from_pos-2]=0; } else if(ptn==2) { PennantH_Buffer[i-from_pos-2]=0; PennantL_Buffer[i-from_pos-2]=0; } //--- for(j=from_pos;j>=0;j--) { int pos=i-j-1; if(ptn==1) FlagL_Buffer[pos]=low[i-from_pos-1]+(angle*(pos -(i-from_pos-1))); else if(ptn==2) PennantL_Buffer[pos]=low[i-from_pos-1]+(angle*(pos -(i-from_pos-1))); } //--- for(j=0;j<=from_pos;j++) { if(ptn==1) FlagH_Buffer[i-j-1]=a+b*j+diff/2; else if(ptn==2) PennantH_Buffer[i-j-1]=a+b*j+diff/2; } } } } } } //--- return value of prev_calculated for next call return(rates_total); } //+----------------------------------------------------+ //| Regression | //+----------------------------------------------------+ bool calc_regression(double &a,double &b,int span,double &price[]) { //--- double sumy=0.0; double sumx=0.0; double sumxy=0.0; double sumx2=0.0; //--- int x; int cnt=0; for(x=0; x