//+----------------------------------------------------------------------------+
//|  i-ScreenShot-ReVeR Mod.mq4  |
//+----------------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property indicator_chart_window
#property strict

//+------ Внешние параметры советника -----------------------------------------+
extern string c0______		         = "Индикатор создания скриншотов в ручном и автоматическом режимах";
extern string c00_____		         = "Основные настройки";
extern bool AutoScreenShot          = True;
// Делать автоматические скриншоты
extern bool OpenCloseScreenShot     = True;
//Скрины при открытии/закрытии ордеров
extern bool ShowScreenShotButton    = True;
//Отображать кнопку ScreenShot
extern bool FolderSymbol 	         = True;  
// Создавать папку с именем текущего символа
extern bool FolderForTF  	         = True;  
// Создавать папку с именем текущего таймфрейма
extern string c1______		         = "Время начала и окончания работы";
extern string StartTime		         =	"0:0";
extern string EndTime		   	   =	"23:59";
extern string c2______		         = "Размер Скриншота";
extern int  size_x       	         = 1366;
extern int  size_y       	         = 768;
extern string c3________	         =	"Interval <=0 - в начале бара";
extern string c4________	         =	"Interval >0 - интервал в секундах";
extern int  Interval     	         = 0;    
                                        // Интервал создания скриншотов, количество секунд:
                                        //  <= 0 - в начале бара
                                        //   >0 - через заданное количество секунд
extern string c5________	         =	"Настройка имени сохраняемого файла";     
                                
enum Name 
   {
    Symbol_TF_OpenClose_Date_Time   = 0,
    Symbol_TF_Date_Time_OpenClose   = 1,
    Symbol_Date_Time_OpenClose_TF   = 2,
    Date_Time_Symbol_TF_OpenClose   = 3,
    Date_Time_TF_Symbol_OpenClose   = 4,
   };
input Name SetNameType              = 0;

enum Corner 
   {
    TopLeft                         = 0,
    TopRight                        = 1,
    BottomLeft                      = 2,
    BottomRight                     = 3,
   };
   
extern string c6________	         =	"Настройки расположения кнопки";
input Corner ButtonPosition         = 0;
extern int Distance_X               = 10;
extern int Distance_Y               = 10;

//+------ Глобальные переменные советника -------------------------------------+
datetime prevTimeBar=0;
bool work = false;
string folder = "";
string OpenClose = " ";
string msg = "";
int OpenOrder = 0, TmpOpenOrder = 0, OpenOrderNew = 0, Total_Orders = 0;
//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ПРЕДОПРЕДЕЛЁННЫЕ ФУНКЦИИ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  expert initialization function                                            |
//+----------------------------------------------------------------------------+
int OnInit() 
{
	if (Interval<=0) prevTimeBar=Time[0];
	else prevTimeBar=TimeCurrent();
	
	folder = "...MQL4\\Files\\";
   if (IsVisualMode() || IsTesting()) folder = "...tester\\files\\";
      
	if (ShowScreenShotButton) {
   	if (ButtonPosition == 1 || ButtonPosition == 3) Distance_X = Distance_X + 75;
   	if (ButtonPosition == 2 || ButtonPosition == 3) Distance_Y = Distance_Y + 20;
   
      if (ObjectFind("ScreenShot") < 0) {
      if(!ObjectCreate(0,"ScreenShot",OBJ_BUTTON,0,0,0)) Print(__FUNCTION__, ": не удалось создать кнопку! Код ошибки = ",GetLastError());
        
         ObjectSetInteger(0,"ScreenShot",OBJPROP_XDISTANCE,Distance_X);
         ObjectSetInteger(0,"ScreenShot",OBJPROP_YDISTANCE,Distance_Y);
         ObjectSetInteger(0,"ScreenShot",OBJPROP_XSIZE,75);
         ObjectSetInteger(0,"ScreenShot",OBJPROP_YSIZE,20);
         ObjectSetInteger(0,"ScreenShot",OBJPROP_CORNER,ButtonPosition);
         ObjectSetString(0,"ScreenShot",OBJPROP_TEXT,"ScreenShot");
         ObjectSetInteger(0,"ScreenShot",OBJPROP_COLOR,White);
         ObjectSetInteger(0,"ScreenShot",OBJPROP_BGCOLOR,Red);
         ObjectSetInteger(0,"ScreenShot",OBJPROP_BORDER_COLOR,Yellow);
         ObjectSetInteger(0,"ScreenShot",OBJPROP_BACK,true);
         ObjectSetInteger(0,"ScreenShot",OBJPROP_STATE,false);
      } 
   }   
   
   
   int TotalOrders = OrdersTotal();
   for(int i=TotalOrders-1; i>=0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if(OrderSymbol() == Symbol()) {
            TmpOpenOrder++;
            break;
         }
      }
   }
   
         
	return(INIT_SUCCEEDED);
}

//+----------------------------------------------------------------------------+
//|  expert deinitialization function                                          |
//+----------------------------------------------------------------------------+
void OnDeinit(const int reason) { if (!IsTesting()) Comment(""); 
   if (ShowScreenShotButton) ObjectsDelete("ScreenShot");
}

//+----------------------------------------------------------------------------+
//|  expert start 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 (AutoScreenShot) {
	   msg = "Последний ScreenShot сохранен в директории: " + folder;
   	//ограничение работы по времени
      datetime b,e, tc;
   	tc = TimeCurrent();
   	b = StrToTime(StartTime);
   	e = StrToTime(EndTime);
   	//корректировка, если работаем ночью
   	if(b>e) {
   	   if(tc<=e) b = b-60*60*24;
   		if(tc>b) e = e+60*60*24;
   	}
   		
   	work = false;
   	if(tc >= b && tc<=e) work = true;
   	if(!work) return(rates_total);
   	//////////////////////////////////
  
   	if (Interval <= 0) {
   		if (prevTimeBar > 0 && prevTimeBar < Time[0]) {
   		   OpenClose = " ";
   			Main(msg);
   			prevTimeBar = Time[0];
   		}
   	}
   	else {
   		Print("TimeCurrent()=",TimeCurrent(),"    prevTimeBar=",prevTimeBar);
   		if (prevTimeBar > 0 && prevTimeBar + Interval <= TimeCurrent()) {
   		   OpenClose = " ";
   			Main(msg);
   			prevTimeBar = TimeCurrent();
   		}
   	}
   }
   	
	if (OpenCloseScreenShot) {  	
	   OpenOrder = 0;
      int TotalOrders = OrdersTotal();
      for(int i=TotalOrders-1; i>=0; i--) {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
            if(OrderSymbol() == Symbol()) {
               OpenOrder++;
            }
         }
      }
      if (OpenOrder > 0 && OpenOrder > Total_Orders) {
         OpenClose = " OPEN ";
         if(TmpOpenOrder == 0) Main("ScreenShot открытия ордера сохранен в директории: " + folder);
         TmpOpenOrder = 0;
         Total_Orders = OpenOrder;
      }
      else if (OpenOrder < Total_Orders) {
         OpenClose = " CLOSE ";
         Main("ScreenShot после закрытия ордера сохранен в директории: " + folder);
         Total_Orders = OpenOrder;
      }
   }
   
   return(rates_total);
}

//+----------------------------------------------------------------------------+
void OnChartEvent(const int id,         // идентификатор события  
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string 
                  )
{
   
   if(id == CHARTEVENT_OBJECT_CLICK && sparam == "ScreenShot") {
      OpenClose = " (User) ";
      msg = "Нажатие кнопки: ScreenShot сохранен в директории: " + folder;
      Main(msg);
      
      ChartRedraw();
      Sleep(500);
      
      ObjectSetInteger(0,"ScreenShot",OBJPROP_STATE,false);
     }

}   
//+----------------------------------------------------------------------------+
//|  Главная функция.                                                          |
//+----------------------------------------------------------------------------+
void Main(string msgManual) {
  
   if (msgManual != "") msg = msgManual;
   string TFPeriod = "";
   switch(Period())
   {  
      case 1:     TFPeriod = "M1"; break;
      case 5:     TFPeriod = "M5"; break;
      case 15:    TFPeriod = "M15"; break;
      case 30:    TFPeriod = "M30"; break;
      case 60:    TFPeriod = "H1"; break;
      case 240:   TFPeriod = "H4"; break; 
      case 1440:  TFPeriod = "D1"; break; 
      case 10080: TFPeriod = "W1"; break;
      case 43200: TFPeriod = "MN"; break;
      default: TFPeriod = "Unknown TF";
   }
   
   string st = "";
   switch(SetNameType )
  {
      case 0:  st = Symbol() + " " + TFPeriod + OpenClose + TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS); break;
      case 1:  st = Symbol() + " " + TFPeriod + " " + TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS) + OpenClose; break;
      case 2:  st = Symbol() + " " + TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS) + " " + TFPeriod + OpenClose + TFPeriod; break;
      case 3:  st = TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS) + " " + Symbol() + " " + TFPeriod + OpenClose; break;
      case 4:  st = TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS) + " " + TFPeriod + " " + Symbol() + OpenClose; break;
      default: st = Symbol() + " " + TFPeriod + " " + TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS) + OpenClose; break;
  }      
           
   st = StrTran(st, ":", ".");
   
   if (FolderForTF) st = TFPeriod+"\\"+st;
   if (FolderSymbol) st = Symbol()+"\\"+st;
   WindowScreenShot(st + ".gif", size_x, size_y);
   Message(msg+st);
}

//+----------------------------------------------------------------------------+
//|  Вывод сообщения в коммент и в журнал                                      |
//+----------------------------------------------------------------------------+
void Message(string m) {
   Comment(m);
   if (StringLen(m) > 0) Print(m);
}

//+----------------------------------------------------------------------------+
//|  Замена подстроки                                                          |
//|  Параметры:                                                                |
//|    str     - текстовая строка, в которой производится замена               |
//|    strfrom - заменяемая подстрока                                          |
//|    strto   - заменяющая подстрока                                          |
//+----------------------------------------------------------------------------+
string StrTran(string str, string strfrom, string strto) {
   int    n;
   string outstr="", tempstr;

   for (n=0; n<StringLen(str); n++) {
      tempstr=StringSubstr(str, n, StringLen(strfrom));
      if (tempstr==strfrom) {
         outstr=outstr+strto;
         n=n+StringLen(strfrom)-1; } 
      else outstr=outstr+StringSubstr(str, n, 1);
   }
   return(outstr);
}
//+----------------------------------------------------------------------------+

void ObjectsDelete(string search) { //Удаление объектов с графика, содержащих определенное название
   for (int i = ObjectsTotal() - 1; i >= 0; i--) {
      if (StringFind(ObjectName(i), search) != -1) ObjectDelete(ObjectName(i));
   }
}