iFreeNumFractals

Author: Copyright 2017, Artem A. Trishkin, Skype artmedia70
Price Data Components
0 Views
0 Downloads
0 Favorites
iFreeNumFractals
ÿþ//+------------------------------------------------------------------+

//|                                             iFreeNumFractals.mq4 |

//|              Copyright 2017, Artem A. Trishkin, Skype artmedia70 |

//|                       https://login.mql5.com/ru/users/artmedia70 |

//+------------------------------------------------------------------+

#property copyright "Copyright 2017, Artem A. Trishkin, Skype artmedia70"

#property link      "https://login.mql5.com/ru/users/artmedia70"

#property version   "3.1"

#property strict

#property indicator_chart_window

#property indicator_buffers 2

#property indicator_plots   2

//--- plot UpperFractal

#property indicator_label1  "Upper Fractal"

#property indicator_type1   DRAW_ARROW

#property indicator_color1  clrRed

#property indicator_style1  STYLE_SOLID

#property indicator_width1  1

//--- plot LowerFractal

#property indicator_label2  "Lower Fractal"

#property indicator_type2   DRAW_ARROW

#property indicator_color2  clrSteelBlue

#property indicator_style2  STYLE_SOLID

#property indicator_width2  1

//--- enums

enum ENUM_TYPE_FRACTAL

  {

   TYPE_FRACTAL_ACCURATE   =  0,    // Accurate fractal

   TYPE_FRACTAL_INACCURATE =  1,    // Inaccurate fractal

  };

//--- input parameters

input ENUM_TYPE_FRACTAL InpTypeFractals   =  TYPE_FRACTAL_ACCURATE;  // Type of fractal

input uint              InpLeftNumUp      =  2;                      // The number of bars on the left for upper fractals

input uint              InpRightNumUp     =  2;                      // The number of bars on the right for upper fractals

input uint              InpLeftNumDn      =  2;                      // The number of bars on the left for lower fractals

input uint              InpRightNumDn     =  2;                      // The number of bars on the right for lower fractals

//--- indicator buffers

double         BufferUpperFractal[];

double         BufferLowerFractal[];

//--- global variables

int left_num_up;    // >;8G5AB2> 10@>2 A;520 4;O 25@E=53> D@0:B0;0

int right_num_up;   // >;8G5AB2> 10@>2 A?@020 4;O 25@E=53> D@0:B0;0

int left_num_dn;    // >;8G5AB2> 10@>2 A;520 4;O =86=53> D@0:B0;0

int right_num_dn;   // >;8G5AB2> 10@>2 A?@020 4;O =86=53> D@0:B0;0

int period_max;

int period_min;

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int OnInit()

  {

//--- indicator buffers mapping

   SetIndexBuffer(0,BufferUpperFractal);

   SetIndexBuffer(1,BufferLowerFractal);

//--- setting a code from the Wingdings charset as the property of PLOT_ARROW

   PlotIndexSetInteger(0,PLOT_ARROW,217);

   PlotIndexSetInteger(1,PLOT_ARROW,218);

   SetIndexArrow(0,217);

   SetIndexArrow(1,218);

   SetIndexEmptyValue(0,EMPTY_VALUE);

   SetIndexEmptyValue(1,EMPTY_VALUE);

//---

   left_num_up=int(InpLeftNumUp<1 ? 1 : InpLeftNumUp);

   left_num_dn=int(InpLeftNumDn<1 ? 1 : InpLeftNumDn);

   right_num_up=int(InpRightNumUp<1 ? 1: InpRightNumUp);

   right_num_dn=int(InpRightNumDn<1 ? 1 : InpRightNumDn);

   period_max=fmax(left_num_up+right_num_up,left_num_dn+right_num_dn);

   period_min=fmin(right_num_up,right_num_dn);

   string short_name=MQLInfoString(MQL_PROGRAM_NAME)+"("+(string)left_num_up+","+(string)right_num_up+")("+(string)left_num_dn+","+(string)right_num_dn+")";

   IndicatorSetString(INDICATOR_SHORTNAME,short_name);

   IndicatorSetInteger(INDICATOR_DIGITS,Digits());

//---

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| 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[])

  {

//---

   if(rates_total<fmax(period_max,4)) return(0);

   int limit=rates_total-prev_calculated;

   if(limit>0) 

     {

      limit=rates_total-fmax(left_num_up,left_num_dn)-1;

      ArrayInitialize(BufferUpperFractal,EMPTY_VALUE);

      ArrayInitialize(BufferUpperFractal,EMPTY_VALUE);

     }

//---

   for(int i=limit; i>period_min; i--) 

     {

      BufferUpperFractal[i]=GetFreeUpperFractal(rates_total,i,high,left_num_up,right_num_up);

      BufferLowerFractal[i]=GetFreeLowerFractal(rates_total,i,low, left_num_dn,right_num_dn);

     }

//--- return value of prev_calculated for next call

   return(rates_total);

  }

//+------------------------------------------------------------------+

//| >72@0I05B F5=C =86=53> D@0:B0;0 8;8 ?CAB>5 7=0G5=85             |

//+------------------------------------------------------------------+

double GetFreeLowerFractal(const int rates_total,int shift,const double &low[],int left_dimension=2,int right_dimension=2) 

  {

   if(left_dimension<1) left_dimension=1;

   if(right_dimension<1) right_dimension=1;

   if(shift-right_dimension<1 || shift+left_dimension>rates_total-1) return(EMPTY_VALUE);

   if(InpTypeFractals==TYPE_FRACTAL_ACCURATE) 

     {

      for(int i=shift-1; i>=shift-right_dimension; i--) if(low[i]<=low[i+1]) return(EMPTY_VALUE);

      for(int i=shift+1; i<=shift+left_dimension; i++)  if(low[i]<=low[i-1]) return(EMPTY_VALUE);

     }

   else 

     {

      for(int i=shift-1; i>=shift-right_dimension; i--) if(low[i]<low[shift]) return(EMPTY_VALUE);

      for(int i=shift+1; i<=shift+left_dimension; i++)  if(low[i]<low[shift]) return(EMPTY_VALUE);

     }

   return low[shift];

  }

//+------------------------------------------------------------------+

//| >72@0I05B F5=C 25@E=53> D@0:B0;0 8;8 ?CAB>5 7=0G5=85            |

//+------------------------------------------------------------------+

double GetFreeUpperFractal(const int rates_total,int shift,const double &high[],int left_dimension=2,int right_dimension=2) 

  {

   if(left_dimension<1) left_dimension=1;

   if(right_dimension<1) right_dimension=1;

   if(shift-right_dimension<1 || shift+left_dimension>rates_total-1) return(EMPTY_VALUE);

   if(InpTypeFractals==TYPE_FRACTAL_ACCURATE) 

     {

      for(int i=shift-1; i>=shift-right_dimension; i--) if(high[i]>=high[i+1]) return(EMPTY_VALUE);

      for(int i=shift+1; i<=shift+left_dimension; i++)  if(high[i]>=high[i-1]) return(EMPTY_VALUE);

     }

   else 

     {

      for(int i=shift-1; i>=shift-right_dimension; i--) if(high[i]>high[shift]) return(EMPTY_VALUE);

      for(int i=shift+1; i<=shift+left_dimension; i++)  if(high[i]>high[shift]) return(EMPTY_VALUE);

     }

   return high[shift];

  }

//+----------------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---