//+------------------------------------------------------------------+
//| CustomFractals.mq5 |
//| Copyright 2021, Tobias Johannes Zimmer |
//| https://www.mql5.com/pennyhunter |
//+------------------------------------------------------------------+
#property copyright "2009-2020, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
//--- indicator settings
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
#property indicator_type1 DRAW_ARROW
#property indicator_type2 DRAW_ARROW
#property indicator_color1 clrBlue
#property indicator_color2 clrBlue
#property indicator_label1 "Fractal Up"
#property indicator_label2 "Fractal Down"
//--- indicator buffers
double ExtUpperBuffer[];
double ExtLowerBuffer[];
//--- 10 pixels upper from high price
int ExtArrowShift = -10;
//---
int ExtWingding01 = 217;
int ExtWingding02 = 218;
//--- input
input int how_many = 2; //bars left and right
input int how_far_away = -10;
input int sign_size = 3;
input int wingding_num1 = 217;
input int wingding_num2 = 218;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void OnInit() {
//--- indicator buffers mapping
SetIndexBuffer(0, ExtUpperBuffer, INDICATOR_DATA);
SetIndexBuffer(1, ExtLowerBuffer, INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS, _Digits);
//---check if the characters are within wingdings characters
if(wingding_num1 < 0 || wingding_num1 > 255) {
ExtWingding01 = 217;
Print("unicode character must be within 255+0");
} else ExtWingding01 = wingding_num1;
if(wingding_num2 < 0 || wingding_num2 > 255) {
ExtWingding02 = 218;
Print("unicode character must be within 255+0");
} else ExtWingding02 = wingding_num2;
//--- sets arrow form from microsoft wingdings that will be drawn
PlotIndexSetInteger(0, PLOT_ARROW, wingding_num1);
PlotIndexSetInteger(1, PLOT_ARROW, wingding_num2);
//--- arrow shifts when drawing
ExtArrowShift = how_far_away;
PlotIndexSetInteger(0, PLOT_ARROW_SHIFT, ExtArrowShift);
PlotIndexSetInteger(1, PLOT_ARROW_SHIFT, -ExtArrowShift);
//--- sets drawing line empty value--
PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);
PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);
//--- sets sign size
PlotIndexSetInteger(0, PLOT_LINE_WIDTH, sign_size);
PlotIndexSetInteger(1, PLOT_LINE_WIDTH, sign_size);
}
//+------------------------------------------------------------------+
//| OnCalculate 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[]) {
//if there are not enough bars
if(rates_total < ((how_many * 2) + 1))
return(0);
//--- preliminary settings
int start;
if(prev_calculated < ((how_many * 2) + 3)) {
start = how_many;
} else
start = rates_total - ((how_many * 2) + 1);
//--- clean up arrays
ArrayInitialize(ExtUpperBuffer, EMPTY_VALUE);
ArrayInitialize(ExtLowerBuffer, EMPTY_VALUE);
//--- main cycle of calculations
//--- Upper Fractal
for(int i = start; i < rates_total - (how_many + 1) && !IsStopped(); i++) {
bool IsFractalUp = true;
for(int j = 1; j <= how_many && IsFractalUp == true; j++) {
IsFractalUp &= (high[i] > high[i + j]);
IsFractalUp &= (high[i] > high[i - j]);
}
if(IsFractalUp) ExtUpperBuffer[i] = high[i];
else
ExtUpperBuffer[i] = EMPTY_VALUE;
}
//--- Lower Fractal
for(int i = start; i < rates_total - (how_many + 1) && !IsStopped(); i++) {
bool IsFractalDn = true;
for(int j = 1; j <= how_many && IsFractalDn == true; j++) {
IsFractalDn &= (low[i] < low[i + j]);
IsFractalDn &= (low[i] < low[i - j]);
}
if(IsFractalDn) ExtLowerBuffer[i] = low[i];
else
ExtLowerBuffer[i] = EMPTY_VALUE;
}
//--- OnCalculate done. Return new prev_calculated.
return(rates_total);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
Comments