history_data_analysis_v3





//+------------------------------------------------------------------+
//|                                     history_data_analysis_v3.mq4 |
//|                              Copyright © 2007, Kiriyenko Dmitriy |
//|                                      http://kiriyenko.moikrug.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Kiriyenko Dmitriy"
#property link      "http://kiriyenko.moikrug.ru"
//----
#property show_inputs
#define FILE_NAME "history_data_analysis_v3.ex4"
#define WRONG_TF "Òàéìôðåéì äîëæåí íàõîäèòüñÿ â ïðåäåëàõ M1-H4.\n\nÂûáåðèòå äðóãîé òàéìôðåéì."
#define WRONG_TF_HDR "Íåâåðíî âûáðàí òàéìôðåéì âõîäíûõ äàííûõ!"
#define WRONG_BREAKUP "Çíà÷åíèå break_up äîëæíî áûòü íå ìåíüøå êðèòåðèÿ ôèëüòðà äëÿ äûðû.\n"
#define BREAKUP_CHANGE "Çíà÷åíèå breakup_min áóäåò èçìåíåíî íà "
#define WRONG_BREAKUP_HDR "Íåâåðíî çàäàí êðèòåðèé ðàçðûâà!"
#define WRONG_FILE_EXT "Íåâåðíûé òèï ôàéëà: ìîæíî çàäàâàòü òîëüêî *.hst ôàéëû"
#define WRONG_FILE_EXT_HDR "Îøèáêà âõîäíûõ äàííûõ"
//----
extern string header0 = "<---------- Âõîäíûå äàííûå ---------->";
extern bool   input_from_file = false;
extern string input_file_name = ".hst";
extern bool   input_file_in_history = true;
//----
extern string header1 = "<---------- Ïàðàìåòðû ôèëüòðàöèè ---------->";
extern bool   bars_ignore = true; // àêòèâàòîð 
extern int    hole_min    = 3; // êîëè÷åñòâî îòñóòñòâóþùèõ áàðîâ, êîòîðûå êîä ñ÷èòàåò äûðîé
//----
extern int breakup_min    = 20; // êîë-âî îòñóòñòâóþùèõ áàðîâ, êîòîðûå êîä ñ÷èòàåò ðàçðûâîì

extern bool gap_ignore    = true; // àêòèâàòîð
extern int  gap_min       = 5; // êîë-âî îòñóòñòâóþùèõ ïèïñîâ, êîòîðûå êîä áóäåò èãíîðèðîâàòü
//----
extern string header2 = "<---------- Ïàðàìåòðû îò÷¸òà ---------->";
extern bool report_summary = false; // âûâîäèòü ñâîäêó
extern bool report_table = true; // âûâîäèòü òàáëèöó
//----
string begin_week_sessions = "00:00"; // âðåìÿ íà÷àëà íåäåëüíîé ñåññèè (÷÷:ìì)
string end_week_sessions = "21:59";   // âðåìÿ îêîí÷àíèÿ íåäåëüíîé ñåññèè (÷÷:ìì)
bool   new_file = true;               // ôëàã, ÷òîáû øàïêó òàáëèöû çàïèñàòü îäèí ðàç
int    in_handle, out_handle;         // ôàéëîâûå îáðàáîò÷èêè îòêðûòûõ ôàéëîâ
int    err;                           // ïåðåìåííàÿ äëÿ õðàíåíèÿ êîäà îøèáêè
//----
#include <WinUser32.mqh>
#include <stdlib.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int      period;               // òàéìôðåéì â ìèíóòàõ
   string   symbol;               // îáðàáàòûâàåìûé ñèìâîë
   int      bars;                 // ÷èñëî áàðîâ íà ãðàôèêå
   double   point;                // ðàçìåð ïóíêòà â âàëþòå êîòèðîâêè
   datetime time_start, time_end; // íà÷àëüíûé è êîíå÷íûé áàð
// íà÷àëüíàÿ îáðàáîòêà âõîäíîãî ôàéëà è óñòàíîâêà ãëîáàëüíûõ äàííûõ
   if(input_from_file)
     {
       // îïðåäåëåíèå òèïà
       if(file_ext(input_file_name) != "hst")
         {
           MessageBox(WRONG_FILE_EXT, WRONG_FILE_EXT_HDR, MB_OK | MB_ICONSTOP);
           return(-3);
         }
       // îòêðûòèå ôàéëà
       if(input_file_in_history)
           in_handle = FileOpenHistory(input_file_name, FILE_BIN | FILE_READ);
       else
           in_handle = FileOpen(input_file_name, FILE_BIN | FILE_READ);
       err = GetLastError();
       if(in_handle < 0 || err > 0) 
           return(error_out(err, "Îòêðûòèå âõîäíîãî ôàéëà"));
       // îïðåäåëåíèå ÷èñëà áàðîâ
       bars = (FileSize(in_handle) - 148) / 44;
       err = GetLastError();
       if(err > 0) 
           return(error_out(err, "Îïðåäåëåíèå ðàçìåðà âõîäíîãî ôàéëà"));
       // ÷òåíèå çàãîëîâêà âõîäíîãî ôàéëà
       FileSeek(in_handle, 68, SEEK_SET);
       err = GetLastError();
       if(err > 0) 
           return(error_out(err, "Ñìåùåíèå âî âõîäíîì ôàéëå ê ñèìâîëó"));
       // ÷òåíèå ñèìâîëà/ïåðèîäà
       symbol = FileReadString(in_handle, 12);
       period = FileReadInteger(in_handle, LONG_VALUE);
       int digits = FileReadInteger(in_handle, LONG_VALUE);
       point = MathPow(10, -digits);
       err = GetLastError();
       if(err > 0) 
           return(error_out(err, "×òåíèå ñèìâîëà è ïåðèîäà èç âõîäíîãî ôàéëà"));
       // îïðåäåëåíèå âðåìåííûõ ãðàíèö èñòîðè÷åñêèõ äàíûõ
       FileSeek(in_handle, 60, SEEK_CUR);
       err = GetLastError();
       if(err > 0) 
           return(error_out(err, "Ñìåùåíèå âî âõîäíîì ôàéëå ê ïåðâîé äàòå"));
       time_start = FileReadInteger(in_handle, LONG_VALUE);
       err = GetLastError();
       if(err > 0) 
           return(error_out(err, "×òåíèå ïåðâîé äàòû èç âõîäíîãî ôàéëà"));
       FileSeek(in_handle, -44, SEEK_END);
       err = GetLastError();
       if(err > 0) 
           return(error_out(err, "Ñìåùåíèå âî âõîäíîì ôàéëå ê ïîñëåäíåé äàòå"));
       time_end = FileReadInteger(in_handle, LONG_VALUE);
       err = GetLastError();
       if(err > 0) 
           return (error_out(err, "×òåíèå ïîñëåäíåé äàòû èç âõîäíîãî ôàéëà"));
       // ïåðåâîä êóðñîðà â íà÷àëî êîòèðîâîê â *.hst ôàéëå
       FileSeek(in_handle, 148, SEEK_SET);
       err = GetLastError();
       if(err > 0) 
           return(error_out(err, "Ñìåùåíèå âî âõîäíîì ôàéëå ê íà÷àëó êîòèðîâîê"));
     }
   else // èëè ïîäñòàíîâêà ãëîáàëüíûõ äàííûõ ñ ãðàôèêà
     {
       bars = Bars;
       symbol = Symbol();
       period = Period();
       point = Point;
       time_start = Time[Bars-1];
       time_end = Time[0];
     }
// âûáîð ïàðàìåòðîâ ïîä òàéìôðåéì
   string time_frame;    // òàéìôðåéì
   int duration_bar = period*60;  // äëèòåëüíîñòü áàðà â ñåê.
   switch(period)
     {
       case 1:   time_frame = "M1";  break;
       case 5:   time_frame = "M5";  break;
       case 15:  time_frame = "M15"; break;
       case 30:  time_frame = "M30"; break;
       case 60:  time_frame = "H1";  break;
       case 240: time_frame = "H4";  break;
       default: 
           MessageBox(WRONG_TF, WRONG_TF_HDR, MB_OK | MB_ICONWARNING | MB_DEFBUTTON1); 
           return(-2);
     }
// ïðîâåðêà êîððåêòíîñòè çàäàíèÿ ôèëüòðà ïî áàðàì
   if(hole_min < 1) 
       hole_min = 1; 
   if(bars_ignore == false) 
       hole_min = 1;
// ïðîâåðêà êîððåêòíîñòè çàäàíèÿ ôèëüòðà ïî ãýïàì
   if(gap_min < 0) 
       gap_min = 0;
   if(gap_ignore == false) 
       gap_min = 0;
   if(breakup_min < hole_min)
     { 
       string message = StringConcatenate(WRONG_BREAKUP, BREAKUP_CHANGE, hole_min);
       int warning_1 = MessageBox(message, WRONG_BREAKUP_HDR,
                                  MB_OKCANCEL | MB_ICONWARNING | MB_DEFBUTTON1); 
       if(warning_1 == 1) 
           breakup_min = hole_min;  
       else 
           return(-1);
       err = GetLastError();
       if(err > 0) 
           return(error_out(err, "Âûâîä ñîîáùåíèÿ î êîððåêöèè êðèòåðèÿ ðàçðûâà"));
     }
// ñîçäàíèå èìåíè ôàéëà
   string date_start = TimeToStr(time_start, TIME_DATE);
   string date_end   = TimeToStr(time_end, TIME_DATE);
   string file_name = StringConcatenate(symbol, "_", time_frame, "_holes_",
                                        date_start, "-", date_end, ".csv");
// îòêðûòèå âûõîäíîãî ôàéëà
   out_handle = FileOpen(file_name, FILE_CSV |FILE_WRITE, ";");
   err = GetLastError();
   if(out_handle < 0 || err > 0) 
       return(error_out(err, "Îòêðûòèå âûõîäíîãî ôàéëà"));
// àíàëèç äàííûõ èñòîðèè 
   int    week_seconds = 604800; // êîëè÷åñòâî ñåêóíä â íåäåëå
   double weeks;                 // îòíîøåíèå äèàïàçîíà äûðû ê êîëè÷åñòâó ñåêóíä â íåäåëå
// âûõîäíûå äíè â ñåê.
   datetime holiday = StrToTime(begin_week_sessions) - StrToTime(end_week_sessions)
                        + (24*3600*3) - duration_bar;
   int hole_range; // äèàïàçîí äûðû
   int bars_hole;  // áàðîâ â äûðå
   int holes_total_amount;   // îáùåå êîëè÷åñòâî äûð
   int breakup_total_amount; // îáùåå êîëè÷åñòâî ðàçðûâîâ
   int bars_hole_amount;     // îáùåå êîëè÷åñòâî áàðîâ â äûðàõ
   int bars_breakup_amount;  // îáùåå êîëè÷åñòâî áàðîâ â ðàçðûâàõ
   int gap_total_amount;     // îáùåå êîëè÷åñòâî ãýïîâ
   int gap_holes;            // îáùèé ãýï â äûðàõ
   int gap_breakups;         // îáùèé ãýï â ðàçðûâàõ
   int hole_max;             // çíà÷åíèå ìàêñèìàëüíîé äûðû
   int breakup_max;          // çíà÷åíèå ìàêñèìàëüíîãî ðàçðûâà
   int gap_max;              // çíà÷åíèå ìàêñèìàëüíîãî ãýïà
   bool note_ = false;
   double months, days, hours, minutes, seconds;
   int n = 1;
   for(int h = 0; h < bars; h++)
     {
       // âðåìÿ òåêóùåãî è ïðåäûäóùåãî áàðîâ â èñòîðèè
       datetime bar_time_current, bar_time_previous;
       // öåíà îòêðûòèÿ òåêóùåãî è öåíà çàêðûòèÿ ïðåäûäóùåãî áàðîâ â èñòîðèè
       double open_price_current, close_price_previous;
       if(!input_from_file)
         {
           bar_time_current  = iTime(NULL, 0, Bars - h - 2);
           bar_time_previous = iTime(NULL, 0, Bars - h - 1);
           open_price_current   = NormalizeDouble(Open[Bars - h - 2],4);
           close_price_previous = NormalizeDouble(Close[Bars - h - 1],4);
         }
       else
         {
           bar_time_previous = FileReadInteger(in_handle, LONG_VALUE);
           err = GetLastError();
           // åñëè ôàéë çàêîí÷èëñÿ, çàâåðøàåì öèêë
           if(err == 4099) 
               break; 
           if(err > 0) 
               return(error_out(err, "×òåíèå èç âõîäíîãî ôàéëà âðåìåíè ïðåä.áàðà"));
           FileSeek(in_handle, 24, SEEK_CUR);
           err = GetLastError();
           if(err > 0) 
               return(error_out(err, "Ñìåùåíèå âî âõ. ôàéëå ê ö.çàêð. ïðåä. áàðà"));
           close_price_previous = FileReadDouble(in_handle, DOUBLE_VALUE);
           if(err == 4099) 
               break; // åñëè ôàéë çàêîí÷èëñÿ, çàâåðøàåì öèêë
           err = GetLastError();
           if(err > 0) 
               return(error_out(err, "×òåíèå èç âõîäíîãî ôàéëà öåíû çàêðûòèÿ"));
           FileSeek(in_handle, 8, SEEK_CUR);
           err = GetLastError();
           if(err > 0) 
               return(error_out(err, "Ñìåùåíèå âî âõîäíîì ôàéëå ê ñëåä.áàðó"));
           bar_time_current = FileReadInteger(in_handle, LONG_VALUE);
           open_price_current = FileReadDouble(in_handle, DOUBLE_VALUE);
           err = GetLastError();
           if(err == 4099) 
               break; // åñëè ôàéë çàêîí÷èëñÿ, çàâåðøàåì öèêë
           if(err > 0) 
               return(error_out(err, "×òåíèå èç âõ. ôàéëà ñëåä.áàðà"));
           FileSeek(in_handle, -12, SEEK_CUR);
           err = GetLastError();
           if(err > 0) 
               return(error_out(err, "Ñìåùåíèå âî âõîäíîì ôàéëå ê íà÷àëó áàðà"));
         }
       // ãýï â ïóíêòàõ
       double abs_gap  = MathAbs(open_price_current - close_price_previous);
       double pips_gap = NormalizeDouble(abs_gap/point, 0);  
       // ôàêòè÷åñêèé äèàïàçîí òàéìôðåéìà ñ ó÷åòîì íåòî÷íîñòè
       int time_frame_range = bar_time_current - bar_time_previous; 
       if(time_frame_range > duration_bar) // êîë-âî ñåêóíä â áàðå ïðåâûøàåò òàéìôðåéì
         {
           // êîë-âî ñåêóíä â áàðå ïðåâûøàåò êîëè÷åñòâî ñåêóíä â íåäåëå
           if(time_frame_range > week_seconds) 
             {
               // çíà÷åíèå äûðû â íåäåëüíîì âûðàæåíèè
               weeks = MathFloor(time_frame_range / week_seconds); 
                  
               if(TimeDayOfWeek(bar_time_previous) > TimeDayOfWeek(bar_time_current))
                   hole_range = time_frame_range - holiday * (1 + weeks) - duration_bar;
               else 
                   hole_range = time_frame_range - (holiday * weeks) - duration_bar;
             } 
           else
             {
               weeks = 0;
               if(TimeDayOfWeek(bar_time_previous) > TimeDayOfWeek(bar_time_current))
                   hole_range = time_frame_range - holiday - duration_bar;
               else 
                   hole_range = time_frame_range - duration_bar;
             }
           bars_hole = hole_range / duration_bar;
           if(bars_hole >= hole_min && pips_gap >= gap_min)
             { 
               holes_total_amount++;          // îáùåå êîëè÷åñòâî äûð (óâåëè÷èâàåì)
               // îáùåå êîëè÷åñòâî áàðîâ â äûðàõ (óâåëè÷èâàåì)
               bars_hole_amount += bars_hole;
               int gap;
               if(pips_gap >= gap_min) 
                 {
                   gap_holes += pips_gap; // îáùèé ãýï â äûðàõ 
                   gap = pips_gap;
                   if(pips_gap == 0) 
                       n = 0; 
                 }
               else 
                   gap = 0;
               seconds = bars_hole * duration_bar;
               string duration_hole = interval_to_str(seconds);
               if(bars_hole >= breakup_min)
                 {
                   // îáùåå êîëè÷åñòâî ðàçðûâîâ
                   breakup_total_amount++;
                   // îáùåå êîëè÷åñòâî áàðîâ â ðàçðûâàõ
                   bars_breakup_amount += bars_hole; 
                   // îáùèé ãýï â ðàçðûâàõ
                   gap_breakups += pips_gap; 
                 }
               if(hole_max < bars_hole && bars_hole < breakup_min)
                 {
                   // ìàêñèìàëüíàÿ äûðà
                   hole_max = bars_hole;
                   // ï/ï íîìåð
                   int number_hole = holes_total_amount;
                 } 
               if(breakup_max <= bars_hole && bars_hole >= breakup_min)
                 {
                   // ìàêñèìàëüíûé ðàçðûâ
                   breakup_max = bars_hole;
                   // ï/ï íîìåð
                   int number_breakup = holes_total_amount;
                 }     
               if(gap_max <= pips_gap)
                 {
                   // ìàêñèìàëüíûé ãýï
                   gap_max = pips_gap;
                   // ï/ï íîìåð
                   int number_gap = holes_total_amount; 
                 }     
               // ñîçäàíèå òàáëèöû *.csv ôàéëà
               if(new_file && report_table)
                 {
                   if(report_summary)
                     {
                       FileSeek (out_handle, 2400, SEEK_END);
                       err = GetLastError();
                       if(err > 0) 
                           return(error_out(err, "Ñìåùåíèå â ôàéëå äëÿ ñâîäêè"));
                     }
                   FileWrite(out_handle, "¹ ï/ï","Âðåìÿ íà÷àëà", "Âðåìÿ îêîí÷àíèÿ",
                                         "Ðàçìåð (áàðîâ)", "Äëèòåëüíîñòü (ìèí)",
                                         "Äëèòåëüíîñòü", "Ãýï (ïò)");
                   err = GetLastError();
                   if(err > 0) 
                       return(error_out(err, "Çàïèñü øàïêè òàáëèöû"));
                   new_file = false;
                 }
               FileWrite(out_handle, holes_total_amount,
                         TimeToStr(bar_time_previous + duration_bar),
                         TimeToStr(bar_time_current),
                         bars_hole, bars_hole*Period(),
                         duration_hole, gap);
               err = GetLastError();
               if(err > 0) 
                   return(error_out(err, "Çàïèñü ñòðîêè òàáëèöû"));
               // ìàêñèìàëüíàÿ äûðà è ðàçðûâ
               int hole_range_max = number_hole;
               int breakup_range_max = number_breakup;
               int gap_range_max = number_gap;
             }
         }
     }
   // ëîâëÿ îøèáêè "èíäåêñ çà ïðåäåëàìè ìàññèâà"
   err = GetLastError();
   if(err > 0 && err != 4002) 
       return(error_out(err, "Ïîñëå îêîí÷àíèÿ ïåðåáîðà áàðîâ"));
   // ñîçäàíèå îò÷åòà *.csv ôàéëà 
   double bars_hole_amount_     = bars_hole_amount;     
   double bars_breakup_amount_  = bars_breakup_amount;  
   double holes_total_amount_   = holes_total_amount;   
   double breakup_total_amount_ = breakup_total_amount; 
   double gap_holes_            = gap_holes;
   double gap_total_amount_     = gap_total_amount;
   double bars_                 = bars;
   double hole_average_size_; 
   if(holes_total_amount != breakup_total_amount)
     {
       seconds = (bars_hole_amount - bars_breakup_amount) * duration_bar;
       string duration_holes = interval_to_str(seconds);
       hole_average_size_ = NormalizeDouble((bars_hole_amount_ - 
                                            bars_breakup_amount_) /
                                            (holes_total_amount_ - 
                                            breakup_total_amount_), 2);
       int only_holes_total_amount_ = (holes_total_amount - breakup_total_amount);
       int bars_only_hole_amount_ = (bars_hole_amount - bars_breakup_amount);
     }
   seconds = time_end - time_start;
   string duration_period = interval_to_str(seconds);
   if (holes_total_amount > 0)
     {
       seconds = bars_hole_amount * duration_bar;
       string duration_holes_ = interval_to_str(seconds);        
       double hole_average_size = NormalizeDouble(bars_hole_amount_/holes_total_amount_,2);
       string gap_average_size  = NormalizeDouble(gap_holes_/holes_total_amount_, 2);

       FileSeek(out_handle, 0, SEEK_SET);
       err = GetLastError();
       if (err > 0) return (error_out(err,"Ñìåùåíèå â íà÷àëî ôàéëà äëÿ çàïèñè îò÷¸òà"));
       
       string hole_comment;
       if (hole_min == breakup_min) hole_comment = "ñìîòðåòü <Ðàçðûâû>, ñîãëàñíî çàäàííûì"+
                                                   " ïîëüçîâàòåëåì óñëîâèÿì)";
       else hole_comment = StringConcatenate(hole_min," - ",breakup_min," áàðîâ )"); 
       hole_comment = StringConcatenate("ÄÛÐÛ  ( ",hole_comment);

       string breakup_comment = StringConcatenate("ÐÀÇÐÛÂÛ ( ",breakup_min," áàðîâ è âûøå)");
       
       if (breakup_total_amount != 0)          
       {
           seconds = bars_breakup_amount * duration_bar;
           string duration_breakups = interval_to_str(seconds);
           double breakup_average_size = NormalizeDouble(bars_breakup_amount_
                                                           /breakup_total_amount_, 2);
       }

       if (report_summary)
       {
           FileWrite(out_handle, "\nÎò÷åò ïî îòñóòñòâóþùèì áàðàì â äàííûõ èñòîðèè");
           FileWrite(out_handle, "Èíñòðóìåíò - ",Symbol(),"Òàéìôðåéì",time_frame);
           FileWrite(out_handle, "Ïåðèîä",date_start,date_end);
           FileWrite(out_handle, "Áàðîâ â èñòîðèè",bars,"áàðîâ");
           FileWrite(out_handle, "Äëèòåëüíîñòü (ìèí)",(time_end-time_start)/60,
                                 duration_period);
           FileWrite(out_handle, "\nÎÁÙÈÉ ÀÍÀËÈÇ äûð è ðàçðûâîâ");
           FileWrite(out_handle, "Êîëè÷åñòâî",holes_total_amount);
           FileWrite(out_handle, "Îáùèé ðàçìåð",bars_hole_amount,"áàðîâ");
           FileWrite(out_handle, "Äëèòåëüíîñòü (ìèí)",
                                 (bars_hole_amount*duration_bar)/60,duration_holes_);
           FileWrite(out_handle, "Ñðåäíèé ðàçìåð",hole_average_size,"áàðîâ");
           FileWrite(out_handle, "Îáùèé ãýï",gap_holes,"ïò");
           FileWrite(out_handle,"Ìàêñèìàëüíûé ãýï",gap_max,"ïò","¹",gap_range_max);
           FileWrite(out_handle, "Ñðåäíèé ãýï",gap_average_size,"ïò");
           FileWrite(out_handle, "\n" + hole_comment);
           FileWrite(out_handle,  "Êîëè÷åñòâî",only_holes_total_amount_);
           FileWrite(out_handle, "Ðàçìåð",bars_only_hole_amount_,"áàðîâ");
           FileWrite(out_handle, "Äëèòåëüíîñòü (ìèí)",
                                 (bars_hole_amount-bars_breakup_amount)*duration_bar/60,
                                 duration_holes);
           FileWrite(out_handle, "Ìàêñèìàëüíûé ðàçìåð",hole_max,"¹",hole_range_max);
           FileWrite(out_handle, "Ñðåäíèé ðàçìåð",hole_average_size_);
           FileWrite(out_handle, "\n" + breakup_comment);
           FileWrite(out_handle, "Êîëè÷åñòâî",breakup_total_amount);
           FileWrite(out_handle, "Ðàçìåð",bars_breakup_amount,"áàðîâ");
           FileWrite(out_handle, "Äëèòåëüíîñòü (ìèí)",bars_breakup_amount*duration_bar/60,
                                 duration_breakups);
           FileWrite(out_handle, "Ìàêñèìàëüíûé ðàçìåð",breakup_max,"áàðîâ","¹",
                                 breakup_range_max);
           FileWrite(out_handle, "Ñðåäíèé ðàçìåð",breakup_average_size,"áàðîâ\n");
           err = GetLastError();
           if (err > 0) return (error_out(err,"Çàïèñü îò÷¸òà"));
       }
     }
   else
     {
       FileWrite(out_handle, "Íà äàííîì ãðàôèêå äûð è ðàçðûâîâ ÍÅ ÎÁÍÀÐÓÆÅÍÎ");
       err = GetLastError();
       if (err > 0) return (error_out(err,"Çàïèñü \"Äûð íå îáíàðóæåíî\""));
     }
   FileClose(out_handle);
   err = GetLastError();
   if(err > 0) 
       return(error_out(err, "Çàêðûòèå ôàéëà"));
   MessageBox(" ïàïêå òåðìèíàëà MT4: \Experts\files\ ñîçäàí ôàéë îò÷åòà:\n\n" + file_name, 
              "Àíàëèç äàííûõ èñòîðèè óñïåøíî çàâåðøåí", MB_OK | MB_DEFBUTTON1);
   err = GetLastError();
   if(err > 0) 
       return(error_out(err, "Âûâîä ñîîáùåíèÿ î çàâåðøåíèè ðàáîòû"));
   return(0);
 }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string interval_to_str(int seconds)
  {
   int hours = seconds / 3600;
   int minutes = seconds % 3600 / 60;
   string str_interval;
   string zero_h = "", zero_m = ""; 
   if(hours < 10) 
       zero_h = "0"; 
   if(minutes < 10) 
       zero_m = "0"; 
   str_interval = StringConcatenate(zero_h, DoubleToStr(hours, 0), ":",
                                    zero_m, DoubleToStr(minutes, 0));            
   if(hours > 24)  
     {
       int days = hours / 24; hours = hours % 24;
       if(hours < 10) 
           zero_h = "0";
       str_interval = StringConcatenate(DoubleToStr(days, 0), " äí. ",
                                        zero_h, DoubleToStr(hours, 0), ":",
                                        zero_m, DoubleToStr(minutes, 0));  
       if(days > 30)   
         {
           int months = days/30; days = days%30;
           str_interval = StringConcatenate(DoubleToStr(months,0)," ìåñ. ",
                                            DoubleToStr(days,0)," äí. ",
                                            zero_h,DoubleToStr(hours,0),":",
                                            zero_m,DoubleToStr(minutes,0));  
           
           if(months > 12) 
             {
               int years  = months / 2; months = months % 12;
               str_interval = StringConcatenate(DoubleToStr(years, 0), " ëåò ",
                                                   DoubleToStr(months, 0), " ìåñ. ",
                                                   DoubleToStr(days, 0), " äíåé  ",
                                                   zero_h, DoubleToStr(hours, 0),":",
                                                   zero_m, DoubleToStr(minutes, 0));
             }
         }
     }   
   return (str_interval);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int error_out(int err, string where)
  {
   if (err == 0) return;
   string message = StringConcatenate("Îøèáêà ¹", err, ":\"", ErrorDescription(err), "\"\n",
                                      "âîçíèêëà ïðè âûïîëíåíèè îïåðàöèè \"", where, "\"");
   string caption = StringConcatenate("Âîçíèêëà îøèáêà â ìîäóëå: \"", FILE_NAME, "\"!");
   MessageBox(message, caption, MB_OK | MB_ICONSTOP);
   return (err);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string file_ext(string file_name)
  {
   string result = StringSubstr(file_name, StringLen(file_name) - 3, 3);
   int err = GetLastError();
   if(err > 0) 
       return(error_out(err, "Îáðàáîòêà çàäàííîé ñòðîêè-èìåíè ôàéëà"));
   return (result);
  }
//+------------------------------------------------------------------+





Sample





Analysis



Market Information Used:

Series array that contains open time of each bar
Series array that contains open prices of each bar
Series array that contains close prices for each bar


Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features:

It opens Message Boxes to the user

Uses files from the file system
It reads information from a file
It writes information to file