//+------------------------------------------------------------------+ //| Counter_Trend.mq5| //| Counter Trend Copyright 2015, fxborg | //| http://fxborg-labo.hateblo.jp/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, fxborg" #property link "http://fxborg-labo.hateblo.jp/" #property version "1.0" #include #define PIP ((_Digits <= 3) ? 0.01 : 0.0001) #property indicator_chart_window #property indicator_buffers 8 #property indicator_plots 2 #property indicator_chart_window #property indicator_type1 DRAW_LINE #property indicator_type2 DRAW_LINE #property indicator_type3 DRAW_LINE #property indicator_color1 clrDodgerBlue #property indicator_color2 clrRed #property indicator_color3 clrGold #property indicator_width1 2 #property indicator_width2 2 //--- input parameters input int MaPeriod=25; // MaPeriod input ENUM_MA_METHOD MaMethod=MODE_SMMA; // Ma Method input ENUM_APPLIED_PRICE MaPriceMode=PRICE_TYPICAL; // Ma Price Mode input int InpHiLoPeriod=50; // High & Low Period input int InpCalcPeriod=35; // Line Period input double InpStdDev=1.2;// Angle StdDev //+------------------------------------------------------------------+ int FlagMinPeriod=int(InpCalcPeriod*0.3); //--- int min_rates_total; double MaBuffer[]; //--- indicator buffers double FlagH_Buffer[]; double FlagL_Buffer[]; //---- for calc double HighesBuffer[]; double LowesBuffer[]; double SigH_Buffer[]; double SigL_Buffer[]; double PriceBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //---- Initialization of variables of data calculation starting point min_rates_total=InpHiLoPeriod+5; if(InpHiLoPeriod low[k]) dmin=low[k]; if(dmax= MathMin(MathMin(close[i],close[i-1]),close[i-2])) { //+----------------------------------------------------+ //|exists | //+----------------------------------------------------+ SigH_Buffer[i]=SigH_Buffer[i-1]; if(FlagH_Buffer[i-2]!=EMPTY_VALUE && FlagH_Buffer[i-2]>=MaBuffer[i-2]) FlagH_Buffer[i-1]=FlagH_Buffer[i-2]*2-FlagH_Buffer[i-3]; } else { //+----------------------------------------------------+ //|detect pattern | //+----------------------------------------------------+ double arr_hi[]; ArraySetAsSeries(arr_hi,true); int chk_h=CopyHigh(Symbol(),PERIOD_CURRENT,rates_total-i,InpCalcPeriod,arr_hi); if(chk_h<1)continue; int from_pos=ArrayMaximum(arr_hi); //--- if(from_pos>=FlagMinPeriod-1 && high[i-from_pos-1]>=MaBuffer[i-from_pos-1]) { double angle=calc_high_Line(high,from_pos,i); if(angle!=EMPTY_VALUE) { double tmp=high[i-from_pos-1]+(angle*(from_pos-1)); if(tmp>=MaBuffer[i-1]) { SigH_Buffer[i]=high[i]; FlagH_Buffer[i-from_pos-2]=EMPTY_VALUE; for(j=from_pos;j>=0;j--) FlagH_Buffer[i-j-1]=high[i-from_pos-1]+(angle*(from_pos-j)); } } } } } //+----------------------------------------------------+ //|down trend | //+----------------------------------------------------+ if(is_down_rest) { //+----------------------------------------------------+ //|exists | //+----------------------------------------------------+ if(SigL_Buffer[i-1]!=0 && FlagL_Buffer[i-2] <= MathMax(MathMax(close[i],close[i-1]),close[i-2])) { SigL_Buffer[i]=SigL_Buffer[i-1]; if(FlagL_Buffer[i-2]!=EMPTY_VALUE && FlagL_Buffer[i-2]<=MaBuffer[i-2]) FlagL_Buffer[i-1]=FlagL_Buffer[i-2]*2-FlagL_Buffer[i-3]; } else { //+----------------------------------------------------+ //| detect | //+----------------------------------------------------+ double arr_lo[]; ArraySetAsSeries(arr_lo,true); int chk_l=CopyLow(Symbol(),PERIOD_CURRENT,rates_total-i,InpCalcPeriod,arr_lo); if(chk_l<1)continue; int from_pos=ArrayMinimum(arr_lo); //--- if(from_pos>=FlagMinPeriod-1 && low[i-from_pos-1]<=MaBuffer[i-from_pos-1]) { double angle=calc_low_line(low,from_pos,i); if(angle!=EMPTY_VALUE) { double tmp=low[i-from_pos-1]+(angle*(from_pos-1)); if(tmp=0;j--) FlagL_Buffer[i-j-1]=low[i-from_pos-1]+(angle*(from_pos-j)); } } } } } } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ double calc_high_Line(const double &high[],const int from_pos,const int i) { //--- double result=EMPTY_VALUE; int j; int cnt=from_pos; double angles[][2]; ArrayResize(angles,cnt); int n=0; for(j=from_pos-1;j>=0;j--) { int pos=i-j-1; angles[n][0]=(high[i-from_pos-1]-high[pos])/((i-from_pos-1)-pos); angles[n][1]=pos; n++; } //--- ArraySort(angles); //--- calc mean double sum=0.0; for(j=0; j=0;j--) { int pos=i-j-1; angles[n][0]=(low[i-from_pos-1]-low[pos])/((i-from_pos-1)-pos); angles[n][1]=pos; n++; } //--- ArraySort(angles); //--- calc mean double sum=0.0; for(j=0; j=0;j--) if(angles[j][0]>=mean-StdDev) result=angles[j][0]; return result; } //+------------------------------------------------------------------+