//+------------------------------------------------------------------+
//|                                                  IRIS [BETA].mq4 |
//|                                                              TTK |
//|                                     https://youtu.be/LjIAzKo62MQ |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "TTK"
#property link      "https://youtu.be/LjIAzKo62MQ"
#property version   "1.00"
#property strict
#property indicator_chart_window;
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//extern bool mSendAlerts = true;
   
extern color mCol0 = clrRed;
extern color mCol1 = clrDarkBlue;
extern color mCol2 = clrMediumSpringGreen;
extern color mCol3 = clrGray;
extern color mCol4 = clrRed;
extern color mCol5 = clrRed;
extern color mCol6 = clrRed;
extern color mCol7 = clrRed;
extern color mCol8 = clrDarkBlue;
extern color mCol9 = clrMediumSpringGreen;
extern color mCol10 = clrGray;
extern color mCol    = clrDimGray;
extern color mTxtCol = clrWhite;

extern double mFib0 = -61.8;
extern double mFib1 = -27.0;
extern double mFib2 = -18.0;
extern double mFib3 = 0.00;
extern double mFib4 = 23.6;
extern double mFib5 = 38.2;
extern double mFib6 = 50.0;
extern double mFib7 = 61.8;
extern double mFib8 = 78.6;
extern double mFib9 = 86.0;
extern double mFib10 = 100.00;

extern int lblPlceY = 15;
extern double lblPlceX5 = 0.00060;
extern double lblPlceX3  = 0.037;
extern double lblPlceXIndcs = 80.00;

extern int mLineExtend = 800;
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double mPipFact = Point();

double mP1;

double mP2;

double mFibPcnts[11];

double mFibs[11];

int mT1;

int mT2;

int mLabT;

int mArrSize;

color  mFibCols[11];
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CreateObj()
  {
   if(ObjectFind("m.Fib") == -1)
     {
      double mDepth = (WindowPriceMax(0) - WindowPriceMin(0)) / 4;
       
      ObjectCreate("m.Fib", OBJ_TREND, 0, Time[30], High[30], Time[25], High[30] + mDepth);
       
      ObjectSet("m.Fib", OBJPROP_RAY, FALSE);
       
      ObjectSet("m.Fib", OBJPROP_WIDTH, 1);
       
      ObjectSet("m.Fib", OBJPROP_STYLE,STYLE_DOT);
       
      ObjectSet("m.Fib", OBJPROP_COLOR, mCol);
       
      ObjectSet("m.Fib", OBJPROP_ZORDER, 0);
       
      ObjectSet("m.Fib", OBJPROP_SELECTED, TRUE);
     }
   
   for(int c = 0; c < mArrSize; c++)
     {
      if(ObjectFind("m.Fib" + (string)c) == -1)
        {
         ObjectCreate("m.Fib" + (string)c, OBJ_TREND, 0, 0, 0, 0, 0);
             
         ObjectSet("m.Fib" + (string)c, OBJPROP_RAY, FALSE);
         
         ObjectSet("m.Fib" + (string)c, OBJPROP_WIDTH, 5);
         
         ObjectCreate("m.Lab" + (string)c, OBJ_TEXT, 0, 0, 0, 0, 0);
        }
     }
   
   return;
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SetFibs()
 {
  double mRange;
    
  mP1 = ObjectGet("m.Fib", 3);
    
  mP2 = ObjectGet("m.Fib", 1);
    
  mRange = MathAbs(mP1 - mP2);
    
  if(mP2 < mP1)
    {
     ArraySort(mFibPcnts, WHOLE_ARRAY, 0, MODE_ASCEND);
     
     for(int i = 0; i < mArrSize; i++)
        {
         mFibs[i] = mP1 - mRange * mFibPcnts[i] /  100;
        }
    }
  else 
    {
     ArraySort(mFibPcnts, WHOLE_ARRAY, 0, MODE_DESCEND);
     
     for(int i = 0; i < mArrSize; i++)
       {
        mFibs[i] = mP1 + mRange * mFibPcnts[i] / 100;
       }
    }

  for(int i = 0; i < mArrSize; i++)
    {
     ObjectSet("m.Fib" + (string)i, OBJPROP_TIME1, Time[mT1]);
         
     ObjectSet("m.Fib" + (string)i, OBJPROP_TIME2, Time[mT2]);
         
     ObjectSet("m.Fib" + (string)i, OBJPROP_PRICE1, mFibs[i]);
         
     ObjectSet("m.Fib" + (string)i, OBJPROP_PRICE2, mFibs[i]);
         
     ObjectSet("m.Fib" + (string)i, OBJPROP_COLOR, mFibCols[i]);
         
     ObjectSetText("m.Lab" + (string)i, DoubleToStr(mFibs[i], Digits) + " (" + DoubleToStr(mFibPcnts[i], 1) + ")", 9, "Verdana", mTxtCol);
         
     mLabT = MathMin(mT1, mT2) + lblPlceY;
    
     ObjectSet("m.Lab" + (string)i, OBJPROP_TIME1, Time[mLabT]);
     
     ObjectSet("m.Lab" + (string)i, OBJPROP_PRICE1, mFibs[i] + mPipFact);
    }
  
  return;
 }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits == 5)
     {
      mPipFact += lblPlceX5;
     }
   else if(Digits == 3)
     {
      mPipFact += lblPlceX3;
     }
   else if(Digits == 2)
     {
      mPipFact += lblPlceXIndcs;
     }
   
   mFibPcnts[0] = mFib0;
   mFibPcnts[1] = mFib1;
   mFibPcnts[2] = mFib2;
   mFibPcnts[3] = mFib3;
   mFibPcnts[4] = mFib4;
   mFibPcnts[5] = mFib5;
   mFibPcnts[6] = mFib6;
   mFibPcnts[7] = mFib7;
   mFibPcnts[8] = mFib8;
   mFibPcnts[9] = mFib9;
   mFibPcnts[10] = mFib10;
    
   mFibCols[0] = mCol0;
   mFibCols[1] = mCol1;
   mFibCols[2] = mCol2;
   mFibCols[3] = mCol3;
   mFibCols[4] = mCol4;
   mFibCols[5] = mCol5;
   mFibCols[6] = mCol6;
   mFibCols[7] = mCol7;
   mFibCols[8] = mCol8;
   mFibCols[9] = mCol9;
   mFibCols[10] = mCol10;
   
   mArrSize = ArraySize(mFibPcnts);
   
   CreateObj();
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
  {
   
   mT1 = iBarShift(NULL, 0, (datetime)ObjectGetInteger(0, "m.Fib", OBJPROP_TIME1));
   
   

   mT2 = iBarShift(NULL, 0, (datetime)ObjectGetInteger(0, "m.Fib", OBJPROP_TIME2));
   
   if(mT1 < mT2)
     {  
      mT1 = mT2;
      mT2 = iBarShift(NULL, 0, (datetime)ObjectGetInteger(0, "m.Fib", OBJPROP_TIME1));
     }
   
   //mT2 = MathMax(0, mT2 - mLineExtend);
   
   SetFibs();
   
   return(rates_total);
  }  
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   for(int i = ObjectsTotal(); i >= 0; i--)
     {
      if(StringSubstr(ObjectName(i), 0, 2) == "m.")
      ObjectDelete(ObjectName(i));
     }
   Comment("");
  }
//+------------------------------------------------------------------+