Any questions from newcomers on MQL4 and MQL5, help and discussion on algorithms and codes
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?
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?
there is such in the codebasehttps://www.mql5.com/ru/search#!keyword=fractals&module=mql5_module_codebase
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?
#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);
}
//+------------------------------------------------------------------+
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:
rightSide=(InpRightSide<1?1:InpRightSide);
Then you'll get quite funny fractals...
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:
rightSide=(InpRightSide<1?1:InpRightSide);
In that case it will display absolutely ridiculous fractals...
Thank you, like this.
You can't find it in MT4 Help too, what to replace it with?
Thank you, there's one like this.
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);
}
//---
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?
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.

- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
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.