원본 프로젝트 LengKundee/NUNA
122 lines
4.6 KiB
MQL5
122 lines
4.6 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| 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);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//+------------------------------------------------------------------+
|