//+------------------------------------------------------------------+
//|                                                PercentChange.mq4 |
//|                                               Yuriy Tokman (YTG) |
//|                                               http://ytg.com.ua/ |
//+------------------------------------------------------------------+
#property copyright "Yuriy Tokman (YTG)"
#property link      "http://ytg.com.ua/"
#property version   "1.00"
#property strict
#property indicator_chart_window

input int   MaxBars          = 300;
input int   DisplayDistance  = 5;
input color DisplayGainColor = clrGreen;
input color DisplayLossColor = clrRed;
input int   DisplayFontSize = 8;
input int   DisplayAfterComma = 2;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   GetDell();
   Comment("");
//---   
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   string perc,name;
   double _start;
//---
   int limit=rates_total-prev_calculated;
   if(prev_calculated==0)limit--;
   else  limit++;  
   if(MaxBars>0 && limit>MaxBars) limit=MaxBars;
//---
   for( int i=0; i<limit && !IsStopped(); i++)
    {
      //((a-b):((a+b):2))*100 
      //а-цена открытия b-цена закрытия     
      _start = - ((Open[i]-Close[i])/((Open[i]+Close[i])/2)) * 100;
      //---
      if(_start>=0)
        {       
         name = "ytg_A-" + TimeToStr(Time[i], TIME_DATE|TIME_MINUTES);
         perc =DoubleToStr(_start, DisplayAfterComma) + "%";        
         TextCreate(0,name,0,Time[i],Low[i]-DisplayDistance*Point,perc,"Arial",DisplayFontSize,DisplayGainColor,90,ANCHOR_RIGHT);         
        }
      else if(_start<0)
        {
         name = "ytg_Y-" + TimeToStr(Time[i], TIME_DATE|TIME_MINUTES);
         perc =DoubleToStr(_start, DisplayAfterComma) + "%";        
         TextCreate(0,name,0,Time[i],High[i]+DisplayDistance*Point,perc,"Arial",DisplayFontSize,DisplayLossColor,90,ANCHOR_LEFT);
        }
     } 
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+ 
//| Создает объект "Текст"                                           | 
//+------------------------------------------------------------------+ 
bool TextCreate(const long              chart_ID=0,               // ID графика 
                const string            name="Text",              // имя объекта 
                const int               sub_window=0,             // номер подокна 
                datetime                time=0,                   // время точки привязки 
                double                  price=0,                  // цена точки привязки 
                const string            text="Text",              // сам текст 
                const string            font="Arial",             // шрифт 
                const int               font_size=10,             // размер шрифта 
                const color             clr=clrRed,               // цвет 
                const double            angle=0.0,                // наклон текста 
                const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // способ привязки 
                const bool              back=false,               // на заднем плане 
                const bool              selection=false,          // выделить для перемещений 
                const bool              hidden=true,              // скрыт в списке объектов 
                const long              z_order=0)                // приоритет на нажатие мышью 
  { 
//---
 if(ObjectFind(name)>=0)ObjectDelete(name);//если text уже создан удаляем его, ввиду случайного перетаскивания мышью
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим объект "Текст" 
   if(!ObjectCreate(chart_ID,name,OBJ_TEXT,sub_window,time,price)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось создать объект \"Текст\"! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
//--- установим текст 
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); 
//--- установим шрифт текста 
   ObjectSetString(chart_ID,name,OBJPROP_FONT,font); 
//--- установим размер шрифта 
   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size); 
//--- установим угол наклона текста 
   ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle); 
//--- установим способ привязки 
   ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor); 
//--- установим цвет 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 
//--- отобразим на переднем (false) или заднем (true) плане 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
//--- включим (true) или отключим (false) режим перемещения объекта мышью 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); 
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 
//--- установим приоритет на получение события нажатия мыши на графике 
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); 
//--- успешное выполнение 
   return(true); 
  } 
//----
void GetDell( string name = "ytg_")
 {
  string vName;
  for(int i=ObjectsTotal()-1; i>=0;i--)
   {
    vName = ObjectName(i);
    if (StringFind(vName,name) !=-1) ObjectDelete(vName);
   }
 }
//----
