iFractalsClassic

Author: skype: irishka.rf
0 Views
0 Downloads
0 Favorites
iFractalsClassic
ÿþ//+------------------------------------------------------------------+

//|                                                    iFractals.mq4 |

//|                                                skype: irishka.rf |

//|                                 www.mql5.com/ru/users/irishka.rf |

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

#property copyright "skype: irishka.rf"

#property link      "www.mql5.com/ru/users/irishka.rf"

#property version   "1.00"

#property strict

#property indicator_chart_window

#property indicator_buffers 2

#property indicator_color1 clrGray

#property indicator_color2 clrGray



input int BarsFractals         = 0;//>;-2> @0AAG8BK205<KE 10@>2 =0 3@0D8:5 (0 - ?>;=>ABLN)

input int RangeFractals        = 5;//>;-2> @0AAG8BK205<KE 10@>2 4;O >B@8A>2:8 D@0:B0;0

//5 <5=55 3, =5G5B=>5 G8A;>

input int LastDrawnBarFractals = 0;//>A;54=89 @0AAG8BK205<K9 10@: 0 - B5:CI89, 1 - ?@54K4CI89 8 4. 

//A5 4> (2:;NG0O) (RangeFractals - 1)/2 30@0=B8@CNB ?5@5@8A>2:C ?>A;54=53> D@0:B0;0

input int RangePoints          = 5;//>;-2> ?C=:B>2 >B AB@5;:8 4> C@>2=O F5=K

input int WidthArrow           = 2;// 07<5@ AB@5;:8



double up [];

double dn [];

int range, last_bar;

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

//| Custom indicator initialization function                         |

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

int OnInit ()

{

//---- indicator buffers mapping  

  SetIndexBuffer (0, up);

  SetIndexBuffer (1, dn);   

//---- drawing settings

  SetIndexStyle (0, DRAW_ARROW, EMPTY, WidthArrow);

  SetIndexArrow (0, 217);

  SetIndexStyle (1, DRAW_ARROW, EMPTY, WidthArrow);

  SetIndexArrow (1, 218);

//----

  SetIndexEmptyValue (0, 0.0);

  SetIndexEmptyValue (1, 0.0);

//---- name for DataWindow

  SetIndexLabel (0, "Fractal Up");

  SetIndexLabel (1, "Fractal Down");

//---- initialization done

  int rf = RangeFractals;

  if (rf % 2 == 0) rf ++;

  if (rf < 3) rf = 3;

  range = (rf - 1)/2;

  last_bar = LastDrawnBarFractals;

  if (last_bar > range + 1) last_bar = range + 1;

  if (last_bar < 0) last_bar = 0;

   

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

{

//---

  int bars;

  if (prev_calculated == 0)//=0G0;>

  {

    ArraySetAsSeries (high, true);

    ArraySetAsSeries (low, true);

    if (BarsFractals == 0 || BarsFractals > Bars - range - range*2) bars = Bars - range - range*2;

    else bars = BarsFractals;

    

    main (bars, last_bar, high, low);

    return (rates_total);

  }

  if (rates_total - prev_calculated > 0)//:064K9 =>2K9 10@

  {

    int bar = range + 1;

    empty (bar, bar);

    main (bar, bar, high, low);

  }

  if (last_bar < range + 1)//:064K9 B8:, 5A;8 2>7<>6=0 ?5@5@8A>2:0

  {

    empty (range, last_bar);

    main (range, last_bar, high, low);

  }

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

  return (rates_total);

}

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

void empty (int t1, int t2)

{

  for (int i = t1; i >= t2; i --)

  {

    up [i] = 0.0;

    dn [i] = 0.0;

  }

}



void main (int bars, int lb, const double &h[], const double &l[])

{

  int i, j, k, t;

  bool upl, dnl, upr, dnr;

  for (i = bars; i >= lb; i --)

  {

    upr = true; dnr = true;

    bool uplm = false, dnlm = false;

    for (j = i + 1; j <= i + range*2; j ++)

    { 

      upl = true;

      dnl = true;

      k = j - 1;

      if (h [k] != h [i]) upl = false;

      if (l [k] != l [i]) dnl = false;



      for (t = k + 1; t <= k + range; t ++)

      {

        if (!uplm && h [t] >= h [i]) upl = false;

        if (!dnlm && l [t] <= l [i]) dnl = false;

      }

      for (t = k - 1; t > i; t --)

      {

        if (!uplm && t - i % range == 0 && h [t] != h [i]) upl = false;

        if (!uplm && t - i % range != 0 && h [t] > h [i]) upl = false;

        

        if (!dnlm && t - i % range == 0 && l [t] != l [i]) dnl = false;

        if (!dnlm && t - i % range != 0 && l [t] < l [i]) dnl = false;

      }

      if (upl) uplm = true;

      if (dnl) dnlm = true;

      if (uplm && dnlm) break;

    }

    for (j = i - range; j < i; j ++)

    {

      if (j < 0) continue;

      if (h [j] >= h [i])

        upr = false;

      if (l [j] <= l [i]) 

        dnr = false;

      if (!upr && !dnr) break;

    }

    up [i] = 0.0;

    dn [i] = 0.0;

    if (uplm && upr) up [i] = h [i] + RangePoints*Point;

    if (dnlm && dnr) dn [i] = l [i] - RangePoints*Point;

  }

}

Comments