//+------------------------------------------------------------------+ //| FractalsAlert.mq4 | //| Copyright © 2005-2014, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //| https://www.mql5.com/en/users/3rjfx | //+------------------------------------------------------------------+ #property copyright "2005-2014, MetaQuotes Software Corp." #property link "http://www.mql4.com" #property link "https://www.mql5.com/en/users/3rjfx" #property version "1.00" #property description "FractalsAlert is base of the Indicator Fractals with Alert" #property description "Added Alert and modify by Roberto Jacobs 3rjfx @ 2018/12/12" #property strict #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Red #property indicator_color2 Blue #property indicator_width1 2 #property indicator_width2 2 //--- enum YN { No, Yes }; //-- //---- input parameters input YN alerts = Yes; // Display Alerts / Messages (Yes) or (No) input YN EmailAlert = No; // Email Alert (Yes) or (No) input YN displayinfo = Yes; // Display Trade Info //-- //---- buffers double ExtUpFractalsBuffer[]; double ExtDownFractalsBuffer[]; //-- datetime fbartime, pbartime, cbartime; int i,cur,prv; int cmnt,pmnt, fbar,pvb; string posisi, sigpos, msgText; //---------// //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicator buffers mapping SetIndexBuffer(0,ExtUpFractalsBuffer); SetIndexBuffer(1,ExtDownFractalsBuffer); //---- drawing settings SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,119); SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,119); //---- SetIndexEmptyValue(0,0.0); SetIndexEmptyValue(1,0.0); //---- name for DataWindow SetIndexLabel(0,"Fractal Up"); SetIndexLabel(1,"Fractal Down"); //---- initialization done return(0); } //---------// //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- TODO: add your code here Comment(""); ObjectsDeleteAll(); GlobalVariablesDeleteAll(); //---- return(0); } //---------// //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- int nCountedBars; bool bFound; double dCurrent; cur=0; nCountedBars=prev_calculated; ArraySetAsSeries(high,true); ArraySetAsSeries(low,true); ArraySetAsSeries(time,true); //-- //---- last counted bar will be recounted if(nCountedBars<=2) i=rates_total-nCountedBars-3; if(nCountedBars>2) i=rates_total-nCountedBars+2; //-- //----Up and Down Fractals while(i>=2) { //----Fractals up bFound=false; dCurrent=high[i]; if(dCurrent>high[i+1] && dCurrent>high[i+2] && dCurrent>high[i-1] && dCurrent>high[i-2]) { bFound=true; ExtUpFractalsBuffer[i]=dCurrent; cur=-1; cbartime=time[i]; fbar=iBarShift(_Symbol,0,cbartime,false); } //----6 bars Fractal if(!bFound && (Bars-i-1)>=3) { if(dCurrent==high[i+1] && dCurrent>high[i+2] && dCurrent>high[i+3] && dCurrent>high[i-1] && dCurrent>high[i-2]) { bFound=true; ExtUpFractalsBuffer[i]=dCurrent; cur=-1; cbartime=time[i]; fbar=iBarShift(_Symbol,0,cbartime,false); } } //----7 bars Fractal if(!bFound && (Bars-i-1)>=4) { if(dCurrent>=high[i+1] && dCurrent==high[i+2] && dCurrent>high[i+3] && dCurrent>high[i+4] && dCurrent>high[i-1] && dCurrent>high[i-2]) { bFound=true; ExtUpFractalsBuffer[i]=dCurrent; cur=-1; cbartime=time[i]; fbar=iBarShift(_Symbol,0,cbartime,false); } } //----8 bars Fractal if(!bFound && (Bars-i-1)>=5) { if(dCurrent>=high[i+1] && dCurrent==high[i+2] && dCurrent==high[i+3] && dCurrent>high[i+4] && dCurrent>high[i+5] && dCurrent>high[i-1] && dCurrent>high[i-2]) { bFound=true; ExtUpFractalsBuffer[i]=dCurrent; cur=-1; cbartime=time[i]; fbar=iBarShift(_Symbol,0,cbartime,false); } } //----9 bars Fractal if(!bFound && (Bars-i-1)>=6) { if(dCurrent>=high[i+1] && dCurrent==high[i+2] && dCurrent>=high[i+3] && dCurrent==high[i+4] && dCurrent>high[i+5] && dCurrent>high[i+6] && dCurrent>high[i-1] && dCurrent>high[i-2]) { bFound=true; ExtUpFractalsBuffer[i]=dCurrent; cur=-1; cbartime=time[i]; fbar=iBarShift(_Symbol,0,cbartime,false); } } //----Fractals down bFound=false; dCurrent=low[i]; if(dCurrent=3) { if(dCurrent==low[i+1] && dCurrent=4) { if(dCurrent<=low[i+1] && dCurrent==low[i+2] && dCurrent=5) { if(dCurrent<=low[i+1] && dCurrent==low[i+2] && dCurrent==low[i+3] && dCurrent=6) { if(dCurrent<=low[i+1] && dCurrent==low[i+2] && dCurrent<=low[i+3] && dCurrent==low[i+4] && dCurrent