Any questions from newcomers on MQL4 and MQL5, help and discussion on algorithms and codes

Artyom Trishkin
Moderator
90006

In this thread I want to begin to help those who really want to understand and learn programming in the new MQL4 and want to easily switch to MQL5 - the languages are very similar.

This blog will be a good place to discuss tasks, algorithms of their solution and any other questions concerning MT programming one way or another.

I hope that other experienced members of our forum will join us and this thread will be interesting to all.

mila.com
167
mila.com  

Hello.

Is it possible to make the number of construction bars in the standard Fractals indicator customizable, i.e. different from 5?

If so, how can this be done?

Andrey F. Zelinsky
39442
mila.com:

Is it possible to make the number of construction bars in the standard Fractals indicator customizable, i.e. different from 5?

If so, how can this be done?

You cannot do this in the standard (terminal)
Artyom Trishkin
Moderator
90006
mila.com:

Hello.

Is it possible to make the number of construction bars in the standard Fractals indicator customizable, i.e. different from 5?

If so, how can this be done?

As Andrey has already told you, the standard one cannot be used, but what prevents you from making your own one?
mila.com
167
mila.com  

Thank you. I need one just for mq4https://www.mql5.com/en/code/1381

I have compiled it in MT4 editor, it works, but it loads the cpu, what should I change to not load it?

//--- indicator buffers
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UpFractals
#property indicator_label1  "Up Fractals"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrDodgerBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot DnFractals
#property indicator_label2  "Down Fractals"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrTomato
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input int      InpLeftSide = 3;          // Кол-во баров слева от фрактала
input int      InpRightSide = 3;         // Кол-во баров справа от фрактала
//--- indicator buffers
double         UpFractalsBuffer[];
double         DnFractalsBuffer[];
//--- global variables
int            minRequiredBars;
int            leftSide, rightSide;
int            maxSide;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
//---
   if ( InpLeftSide < 1 ) {
      leftSide = 2;
      printf("Неккоретно указан параметр \"Кол-во баров слева от фрактала\": %d. Будет использовано значение: %d.",
         InpLeftSide, leftSide);
   } else {
      leftSide = InpLeftSide;
   }
   if ( InpRightSide < 1 ) {
      rightSide = 2;
      printf("Неккоретно указан параметр \"Кол-во баров справа от фрактала\": %d. Будет использовано значение: %d.",
         InpRightSide, rightSide);
   } else {
      rightSide = InpRightSide;
   }
//---
   minRequiredBars = leftSide + rightSide + 1;
   maxSide = int(MathMax(leftSide, rightSide));
//---
   SetIndexBuffer(0, UpFractalsBuffer, INDICATOR_DATA);
   SetIndexBuffer(1, DnFractalsBuffer, INDICATOR_DATA);
//---
   PlotIndexSetInteger(0, PLOT_ARROW, 217);
   PlotIndexSetInteger(1, PLOT_ARROW, 218);
//---
   PlotIndexSetInteger(0, PLOT_ARROW_SHIFT, -10);  
   PlotIndexSetInteger(1, PLOT_ARROW_SHIFT, 10);
//---
   for ( int i = 0; i < 2; i++ ) {
      PlotIndexSetInteger(i, PLOT_DRAW_BEGIN, minRequiredBars);
      PlotIndexSetDouble(i, PLOT_EMPTY_VALUE, 0.0);
   }
//---
   IndicatorSetInteger(INDICATOR_DIGITS, _Digits);
//---
   IndicatorSetString(INDICATOR_SHORTNAME, "ffra ("+(string)leftSide+", "+(string)rightSide+")");
//---
   return(0);
}
//+------------------------------------------------------------------+
//| Check if is Up Fractal function                                  |
//+------------------------------------------------------------------+
bool isUpFractal(int bar, int max, const double &High[]) {
//---
   for ( int i = 1; i <= max; i++ ) {
      if ( i <= leftSide && High[bar] < High[bar-i] ) {
         return(false);
      }
      if ( i <= rightSide && High[bar] <= High[bar+i] ) {
         return(false);
      }
   }
//---
   return(true);  
}
//+------------------------------------------------------------------+
//| Check if is Down Fractal function                                |
//+------------------------------------------------------------------+
bool isDnFractal(int bar, int max, const double &Low[]) {
//---
   for ( int i = 1; i <= max; i++ ) {
      if ( i <= leftSide && Low[bar] > Low[bar-i] ) {
         return(false);
      }
      if ( i <= rightSide && Low[bar] >= Low[bar+i] ) {
         return(false);
      }
   }
//---
   return(true);  
}
//+------------------------------------------------------------------+
//| 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 startBar, lastBar;
//---
   if ( rates_total < minRequiredBars ) {
      Print("Недостаточно данных для расчёта");
      return(0);
   }
//---
   if (prev_calculated < minRequiredBars) {
      startBar = leftSide;
      ArrayInitialize(UpFractalsBuffer, 0.0);
      ArrayInitialize(DnFractalsBuffer, 0.0);
   }        
   else {
      startBar = rates_total - minRequiredBars;
   }
//---
   lastBar = rates_total - rightSide;
   for ( int bar = startBar; bar < lastBar && !IsStopped(); bar++ ) {
      //---
      if ( isUpFractal(bar, maxSide, high) ) {
         UpFractalsBuffer[bar] = high[bar];
      } else {
         UpFractalsBuffer[bar] = 0.0;
      }
      //---
      if ( isDnFractal(bar, maxSide, low) ) {
         DnFractalsBuffer[bar] = low[bar];
      } else {
         DnFractalsBuffer[bar] = 0.0;
      }
   }  
//--- return value of prev_calculated for next call
   return(rates_total);
}
//+------------------------------------------------------------------+
Artyom Trishkin
Moderator
90006
mila.com:

Thank you. Need one just on mq4https://www.mql5.com/en/code/1381

The corrections are minimal:

//+------------------------------------------------------------------+
//|                                              iXBarsFractals.mq4  |
//|               Copyright 2011, Rone. redaction 2016 by artmedia70 |
//|                                            rone.sergey@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, Rone."
#property link      "rone.sergey@gmail.com"
#property version   "1.00"
#property description "Индикатор позволяет отдельно указывать кол-во баров слева и справа от фрактала. Хорошо подходит "
#property description "для определения как локальных, так и глобальных экстремумов."
#property strict
//--- indicator buffers
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UpFractals
#property indicator_label1  "Up Fractals"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrDodgerBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot DnFractals
#property indicator_label2  "Down Fractals"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrTomato
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input int      InpLeftSide = 3;          // Кол-во баров слева от фрактала
input int      InpRightSide = 3;         // Кол-во баров справа от фрактала
//--- indicator buffers
double         UpFractalsBuffer[];
double         DnFractalsBuffer[];
//--- global variables
int            minRequiredBars;
int            leftSide,rightSide;
int            maxSide;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   leftSide=(InpLeftSide<2?2:InpLeftSide);
   rightSide=(InpRightSide<2?2:InpRightSide);
//---
   minRequiredBars=leftSide+rightSide+1;
   maxSide=int(fmax(leftSide,rightSide));
//---
   SetIndexBuffer(0,UpFractalsBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,DnFractalsBuffer,INDICATOR_DATA);
//---
   SetIndexArrow(0,217);
   SetIndexArrow(1,218);
   //PlotIndexSetInteger(0,PLOT_ARROW,217);
   //PlotIndexSetInteger(1,PLOT_ARROW,218);
//---
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,-10);
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,10);
//---
   for(int i=0; i<2; i++) {
      PlotIndexSetInteger(i,PLOT_DRAW_BEGIN,minRequiredBars);
      PlotIndexSetDouble(i,PLOT_EMPTY_VALUE,0.0);
      }
//---
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---
   IndicatorSetString(INDICATOR_SHORTNAME,"XBarsFractals("+(string)leftSide+", "+(string)rightSide+")");
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Check if is Up Fractal function                                  |
//+------------------------------------------------------------------+
bool isUpFractal(int bar,int max,const double &high[])
  {
//---
   for(int i=1; i<=max; i++) {
      if(i<=leftSide && high[bar]<high[bar-i])     return(false);
      if(i<=rightSide && high[bar]<=high[bar+i])   return(false);
      }
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Check if is Down Fractal function                                |
//+------------------------------------------------------------------+
bool isDnFractal(int bar,int max,const double &low[])
  {
//---
   for(int i=1; i<=max; i++) {
      if(i<=leftSide && low[bar]>low[bar-i])    return(false);
      if(i<=rightSide && low[bar]>=low[bar+i])  return(false);
      }
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| 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 startBar,lastBar;
//---
   if(rates_total<minRequiredBars) return(0);
//---
   if(prev_calculated<minRequiredBars) {
      startBar=leftSide;
      ArrayInitialize(UpFractalsBuffer, 0.0);
      ArrayInitialize(DnFractalsBuffer, 0.0);
      }
   else startBar=rates_total-minRequiredBars;
//---
   lastBar=rates_total-rightSide;
   for(int bar=startBar; bar<lastBar && !IsStopped(); bar++) {
      //---
      if(isUpFractal(bar,maxSide,high))   UpFractalsBuffer[bar]=high[bar];
      else                                UpFractalsBuffer[bar]=0.0;
      //---
      if(isDnFractal(bar,maxSide,low))    DnFractalsBuffer[bar]=low[bar];
      else                                DnFractalsBuffer[bar]=0.0;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

True, I would do it a little differently, but it's force of habit...

You could even do it like this:

   leftSide=(InpLeftSide<1?1:InpLeftSide);
   rightSide=(InpRightSide<1?1:InpRightSide);

Then you'll get quite funny fractals...

mila.com
167
mila.com  
Artyom Trishkin:

The corrections are minimal:


Although I would have done it a little differently, but that's force of habit...

You could even do it like this:

   leftSide=(InpLeftSide<1?1:InpLeftSide);
   rightSide=(InpRightSide<1?1:InpRightSide);

In that case it will display absolutely ridiculous fractals...

Thank you, like this.

PLOT_ARROW_SHIFT

You can't find it in MT4 Help too, what to replace it with?

Artyom Trishkin
Moderator
90006
mila.com:

Thank you, there's one like this.

PLOT_ARROW_SHIFT

Not in the MT4 help either, what to replace it with?

It's "Vertical Arrow Offset for DRAW_ARROW Style".

None of the standard ones.

You can just set the offset either in the settings, or by value of ATR

And make these lines like this:

//---
   for(int i=0; i<2; i++) {
      SetIndexDrawBegin(i,minRequiredBars);
      SetIndexEmptyValue(i,0);
      //PlotIndexSetInteger(i,PLOT_DRAW_BEGIN,minRequiredBars);
      //PlotIndexSetDouble(i,PLOT_EMPTY_VALUE,0.0);
      }
//---
Delete what's commented out here and put in what's commented out.


mila.com
167
mila.com  
Artyom Trishkin:

This is "Vertical Arrow Offset for DRAW_ARROW Style".

Delete what's commented out here and put in what's written in.


It's still loading.

Calling from another indicator, even hangs the terminal for a moment.

What else can I do?

Artyom Trishkin
Moderator
90006
mila.com:

It's still loading.

Calling from another indicator, even hangs the terminal for a moment.

What else can I do?

Don't call from another indicator :)

Or show how you do it.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954