Load History Data
Download scriptOverview of the Data History Analysis Script
This script is designed for traders using MetaTrader 4 (MT4) to perform a deep audit of historical market data. Its primary purpose is to identify "holes"—periods where price action is missing from the charts—and distinguish between minor data gaps and significant structural "breakups" in the price history. This is particularly useful for identifying data quality issues or verifying the integrity of historical feeds from different brokers.
Key Logic and Functionality
1. Timeframe Constraints
The script is specifically optimized for intraday analysis. It functions on timeframes ranging from M1 (1 minute) to H4 (4 hours). If a user attempts to run it on larger periods (like Daily or Weekly charts), the script will prompt the user to switch back to a supported timeframe.
2. Identification of "Holes" and "Breakups"
The core logic scans the chronological sequence of bars to see if there are jumps in time.
- Minor Holes: Small gaps in data that may be normal for certain assets.
- Breakups: Large missing sections of data where many consecutive bars are absent.
- Customizable Filters: The user can define specific thresholds to determine what qualifies as a "hole" versus a "breakup." For example, you can set the script to ignore very small gaps (e.g., 1–3 minutes) and only flag significant missing data as breakups.
3. Gap Analysis (Price Jumps)
Beyond just looking at time, the script also measures the Price Gap. It calculates the difference in pips between the closing price of one bar and the opening price of the next following a "hole." This helps traders see if the price jumped significantly during the missing period or if it resumed where it left off.
4. Weekend and Holiday Handling
To ensure accuracy, the script is programmed to recognize weekend sessions. It attempts to account for the standard 48-hour market closure (Saturday and Sunday) so that these planned breaks are not incorrectly flagged as data "holes."
5. Automated Reporting
Instead of displaying all this raw data on the trading chart (which could be cluttered), the script generates a comprehensive text file (.txt) in the MT4 folder. This report includes:
- Chronological List: Every identified hole with its specific start/end date and time.
- Size Metrics: The duration of each hole in terms of bars, hours, days, or months.
- Statistical Summary:
- Total count of holes vs. total count of breakups.
- Average size of missing data sections.
- Maximum observed gap and maximum observed breakup size.
- Chart Quality Score: A percentage representing the "health" of your historical data, showing how much of the history is continuous versus broken.
User Experience Summary
When you run the script, it performs a complete sweep of the available history for the current instrument. Once finished, it provides a pop-up notification telling you exactly where to find the text file. This file serves as a "Data Audit Report," allowing you to verify if your historical data is clean and reliable before using it for backtesting or technical analysis.
//+------------------------------------------------------------------+
//| holes_history_data_v2.mq4 |
//| Copyright © 2005 Bagadul |
//| bagbagadul@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005 Bagadul"
#property link "bagbagadul@yandex.ru"
#property show_inputs
/*
Äàííûé êîä âûÿâëÿåò â äàííûõ èñòîðèè îòñóòñòâóþùèå áàðû (äàëåå "äûðû") è ðàçðûâû (áîëüøèå äûðû), îïðåäåëÿåò
èõ ðàçìåð, äëèòåëüíîñòü è ãýï, ðàáîòàåò íà âñåõ èíñòðóìåíòàõ è ïðåäíàçíà÷åí äëÿ âíóòðåäíåâíûõ ãðàôèêîâ,
ïîýòîìó òàéìôðåéì îãðàíè÷åí ïåðèîäîì - H4, ïðè àíàëèçå ó÷èòûâàþòÿ òîëüêî âûõîäíûå äíè (ñóááîòà è âîñêðåñåíèå - 48 ÷àñîâ),
îñòàëüíûå ìîìåíòû êîä ñ÷èòàåò äûðàìè èëè ðàçðûâàìè. Äëÿ óäîáñòâà ðàáîòû íà ãðàôèêå, â êîäå ïðåäóñìîòðåí
ôèëüòð, ãäå ìîæíî çàäàòü: (äàííûå îïöèè ìîæíî îòìåíèòü â ñâîéñòâàõ ñêðèïòà)
1. êîëè÷åñòâî îòñóòñòâóþùèõ áàðîâ íà òàéìôðåéìàõ (M1,5,15,30), êîòîðûå êîä áóäåò
èãíîðèðîâàòü êàê äûðû
2. êîëè÷åñòâî îòñóòñòâóþùèõ áàðîâ (ìèíèìàëüíîå çíà÷åíèå), êîòîðîå êîä ñ÷èòàë áû
ðàçðûâîì (ïî óìîë÷àíèþ 20 áàðîâ);
Ïðè ðàâíîñòè ýòèõ çíà÷åíèé 1 è 2, âñå íàéäåííûå äûðû êîä áóäåò ñ÷èòàòü ðàçðûâàìè.
3. êîëè÷åñòâî îòñóòñòâóþùèõ ïèïñîâ, êîòîðûå êîä áóäåò èãíîðèðîâàòü êàê ãýï
Äàëåå çàïóñêàòü êàê ñêðèïò.
Äëÿ óïðîùåíèÿ, â êîäå ãäå âîçìîæíî èìåþòñÿ êîììåíòàðèè, ðåçóëüòàòû âûâîäÿòñÿ â *.txt ôàéë.
Êîä ñîçäàí íà MT4 build 182.
!!! Åñëè äàííûå èñòîðèè "ñêëååíû" èëè ïîñòàâëÿëèñü áîëüøå ÷åì îäíèì áðîêåðîì, òî ðåçóëüòàò îò÷åòà
ìîæåò ñîäåðæàòü íåòî÷íîñòè â ÷àñòè, îòìå÷åííîé ïðèìå÷àíèåì (***âêëþ÷àÿ âûõîäíûå äíè).
*/
//+-------------------------------------------------------------------+
// êîëè÷åñòâî îòñóòñòâóþùèõ áàðîâ íà ðàçíûõ òàéìôðåéìàõ, êîòîðûå êîä áóäåò èãíîðèðîâàòü
extern string Filter = "Ìèíèìàëüíûå çíà÷åíèÿ";
extern bool bars_ignore = true; // àêòèâàòîð
extern int bars_ignore_M1 = 3; // (ïî óìîë÷àíèþ)
extern int bars_ignore_M5 = 3;
extern int bars_ignore_M15 = 2;
extern int bars_ignore_M30 = 2;
//+-------------------
// êîëè÷åñòâî îòñóòñòâóþùèõ áàðîâ, êîòîðûå êîä ñ÷èòàë áû ðàçðûâîì
extern int breakup_min = 20; // ìèíèìàëüíîå çíà÷åíèå (äîëæíî áûòü > 0 è >= bars_min)
// êîëè÷åñòâî îòñóòñòâóþùèõ ïèïñîâ íà ðàçíûõ òàéìôðåéìàõ, êîòîðûå êîä áóäåò èãíîðèðîâàòü
extern bool gap_ignore = true; // àêòèâàòîð
extern int gap_min = 5; // (ïî óìîë÷àíèþ)
//+-------------------------------------------------------------------+
string begin_week_sessions = "00:00"; // âðåìÿ íà÷àëà íåäåëüíîé ñåññèè (÷÷:ìì) (ïî óìîë÷àíèþ)
bool new_file = true;
int handle;
//+-------------------
#include <WinUser32.mqh>
//+-------------------
int start()
{
//+------------------------------
string time_frame; // òàéìôðåéì
int duration_bar; // äëèòåëüíîñòü áàðà â ñåê.
int hole_min; // êîëè÷åñòâî îòñóòñòâóþùèõ áàðîâ, êîòîðûå êîä áóäåò èãíîðèðîâàòü
switch ( Period() )
{
case 1: time_frame = "M1"; duration_bar = 60; hole_min = bars_ignore_M1; break;
case 5: time_frame = "M5"; duration_bar = 300; hole_min = bars_ignore_M5; break;
case 15: time_frame = "M15"; duration_bar = 900; hole_min = bars_ignore_M15; break;
case 30: time_frame = "M30"; duration_bar = 1800; hole_min = bars_ignore_M30; break;
case 60: time_frame = "H1"; duration_bar = 3600; hole_min = 1; break;
case 240: time_frame = "H4"; duration_bar = 14400; hole_min = 1; break;
default: MessageBox("Òàéìôðåéì äîëæåí íàõîäèòüñÿ â ïðåäåëàõ M1-H4.\n\nÂûáèðåòå äðóãîé òàéìôðåéì.",
"Íåïðàâèëüíî âûáðàí òàéìôðåéì (ãðàôèê)", MB_OK | MB_ICONWARNING | MB_DEFBUTTON1);
return(0);
}
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;
//+------------------------------
// äàííûé áëîê ñîçäàåò èìÿ ôàéëà
datetime bar_day = TimeDay (Time[Bars - 1]);
datetime bar_month = TimeMonth (Time[Bars - 1]);
datetime bar_year = TimeYear (Time[Bars - 1]);
string zero_day_begin, zero_month_begin;
if (bar_day < 10) zero_day_begin = "0"; else zero_day_begin = "";
if (bar_month < 10) zero_month_begin = "0"; else zero_month_begin = "";
string date_start = zero_day_begin + bar_day + "." + zero_month_begin + bar_month + "." + bar_year; // íà÷àëüíàÿ äàòà
bar_day = TimeDay (Time[0]);
bar_month = TimeMonth (Time[0]);
bar_year = TimeYear (Time[0]);
string zero_day_end, zero_month_end;
if (bar_day < 10) zero_day_end = "0"; else zero_day_end = "";
if (bar_month < 10) zero_month_end = "0"; else zero_month_end = "";
string date_end = zero_day_end + bar_day + "." + zero_month_end + bar_month + "." + bar_year; // êîíå÷íàÿ äàòà
string file_name = Symbol() + "_" + time_frame + "_holes_" + date_start + "-" + date_end + ".txt";
//+------------------------------
if (breakup_min < hole_min)
{
int warning_1 = MessageBox("Çíà÷åíèÿ êîëè÷åñòâà îòñóòñòâóþùèõ áàðîâ äîëæíû ñîñòàâëÿòü:\n\nhole_min <= breakup_min\n\n" +
"Çíà÷åíèå - breakup_min, áóäåò óâåëè÷åíî äî - hole_min.", "Íåïðàâèëüíî âûáðàíû çíà÷åíèÿ: " +
"hole_min, breakup_min", MB_OKCANCEL | MB_ICONWARNING | MB_DEFBUTTON1);
if (warning_1 == 1) breakup_min = hole_min; else return(0);
}
//+------------------------------
// îïðåäåëåíèå âðåìåíè îòêðûòèÿ ïîñëåäíåãî áàðà îêîí÷àíèÿ íåäåëüíîé ñåññèè (÷÷:ìì)
datetime ews;
string end_week_sessions; // âðåìÿ îêîí÷àíèÿ íåäåëüíîé ñåññèè
for (int i = 0; i < Bars; i++ )
{
datetime time = iTime(NULL, 0, Bars - i );
int day_week = TimeDayOfWeek(time);
if (day_week == 5)
{
datetime initial_time = StrToTime(TimeToStr(time,TIME_DATE|TIME_MINUTES));
if (initial_time > ews) ews = initial_time;
}
end_week_sessions = TimeToStr(ews,TIME_MINUTES);
}
//+------------------------------
// àíàëèç äàííûõ èñòîðèè
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;
string line_2 = "-----------------------------------------------------------------------------------------------------------" +
"-----------------------------------------------------------------------------------------------------------\n";
string perenos = "\n";
//+-------------------
for (int h = 0; h < Bars; h++ )
{
//+-------------------
// âðåìÿ òåêóùåãî è ïðåäûäóùåãî áàðîâ â èñòîðèè
datetime bar_time_current = iTime(NULL, 0, Bars - h - 2);
datetime bar_time_previous = iTime(NULL, 0, Bars - h - 1);
// öåíà îòêðûòèÿ òåêóùåãî è öåíà çàêðûòèÿ ïðåäûäóùåãî áàðîâ â èñòîðèè
double open_price_current = NormalizeDouble(Open[Bars - h - 2],4);
double close_price_previous = NormalizeDouble(Close[Bars - h - 1],4);
// ãýï â pipsàõ
double pips_gap = NormalizeDouble(MathAbs(open_price_current - close_price_previous)/Point,0);
//+-------------------
// ôàêòè÷åñêèé äèàïàçîí òàéìôðåéìà ñ ó÷åòîì íåòî÷íîñòè
int time_frame_range = bar_time_current - bar_time_previous;
//+-------------------
if (time_frame_range > duration_bar) // êîëè÷åñòâî ñåêóíä â áàðå ïðåâûøàåò òàéìôðåéì
{
string note_1, note_8; // ïðèìå÷àíèÿ
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;
note_1 = "(***âêëþ÷àÿ âûõîäíûå äíè)";
}
else
{
weeks = 0;
if (TimeDayOfWeek(bar_time_previous) > TimeDayOfWeek(bar_time_current) )
{
hole_range = time_frame_range - holiday - duration_bar;
note_1 = "(***âêëþ÷àÿ âûõîäíûå äíè)";
}
else
{
hole_range = time_frame_range - duration_bar;
note_1 = "";
}
}
bars_hole = hole_range / duration_bar;
if (bars_hole >= hole_min && pips_gap >= gap_min)
{
holes_total_amount++; // îáùåå êîëè÷åñòâî äûð (óâåëè÷èâàåì)
bars_hole_amount += bars_hole; // îáùåå êîëè÷åñòâî áàðîâ â äûðàõ (óâåëè÷èâàåì)
string gap;
if (pips_gap >= gap_min)
{
gap_holes += pips_gap; // îáùèé ãýï â äûðàõ
gap = DoubleToStr(pips_gap,0);
if (pips_gap == 0) n = 0;
}
else gap = "-";
string _gap_;
if (holes_total_amount < 10) _gap_ = " ";
else if (holes_total_amount >= 10 && holes_total_amount < 100) _gap_ = " ";
else if (holes_total_amount >= 100 && holes_total_amount < 1000) _gap_ = " ";
else _gap_ = "";
seconds = bars_hole * duration_bar;
hours = MathFloor(seconds / 3600);
minutes = seconds / 3600 - hours;
string duration_hole;
string zero_h4 = "", zero_m4 = "";
if (hours < 10) zero_h4 = "0";
if (minutes * 60 < 10) zero_m4 = "0";
duration_hole = zero_h4 + DoubleToStr(hours,0) + ":" + zero_m4 + DoubleToStr(minutes * 60,0);
if (hours > 24)
{
days = MathFloor(hours / 24); hours = hours - days * 24;
if (hours < 10) zero_h4 = "0";
duration_hole = DoubleToStr(days,0) + " day(s) " + zero_h4 + DoubleToStr(hours,0) + ":" + zero_m4 + DoubleToStr(minutes * 60,0);
if (days > 30)
{
months = MathFloor(days / 30); days = days - months * 30;
duration_hole = DoubleToStr(months,0) + " month(s) " + DoubleToStr(days,0) + " day(s) " + zero_h4 + DoubleToStr(hours,0) + ":" + zero_m4 + DoubleToStr(minutes * 60,0);
}
}
//+-------------------
// âðåìÿ íà÷àëà äèàïàçîíà äûðû
datetime hole_day_begin_;
string hole_time_begin_;
int ny_month_begin;
if (StrToTime(TimeToStr(bar_time_previous + duration_bar,TIME_MINUTES)) == StrToTime(end_week_sessions) + duration_bar &&
TimeDayOfWeek(bar_time_previous + duration_bar) == 5)
{
hole_day_begin_ = TimeDay(bar_time_previous + duration_bar + holiday);
hole_time_begin_ = TimeToStr(bar_time_previous + duration_bar + holiday, TIME_MINUTES );
ny_month_begin = TimeMonth(bar_time_previous + duration_bar + holiday);
note_1 = "";
}
else
{
hole_day_begin_ = TimeDay(bar_time_previous + duration_bar);
hole_time_begin_ = TimeToStr(bar_time_previous + duration_bar, TIME_MINUTES );
ny_month_begin = TimeMonth(bar_time_previous + duration_bar);
}
datetime hole_day_begin = hole_day_begin_;
datetime hole_month_begin = TimeMonth(bar_time_previous + duration_bar);
datetime hole_year_begin = TimeYear(bar_time_previous + duration_bar);
string hole_time_begin = hole_time_begin_;
if (hole_day_begin < 10) zero_day_begin = "0"; else zero_day_begin = "";
if (hole_month_begin < 10) zero_month_begin = "0"; else zero_month_begin = "";
//+-------------------
// âðåìÿ îêîí÷àíèÿ äèàïàçîíà äûðû
datetime hole_day_end = TimeDay(bar_time_current);
datetime hole_month_end = TimeMonth(bar_time_current);
datetime hole_year_end = TimeYear(bar_time_current);
string hole_time_end = TimeToStr(bar_time_current, TIME_MINUTES );
if (hole_day_end < 10) zero_day_end = "0"; else zero_day_end = "";
if (hole_month_end < 10) zero_month_end = "0"; else zero_month_end = "";
//+-------------------
if (ny_month_begin == 12 && TimeMonth(bar_time_current) == 1) note_8 = "NewYear ";
else note_8 = "";
//+-------------------
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; // ï/ï íîìåð
}
//+------------------------------
// ñîçäàíèå òàáëèöû *.txt ôàéëà
if (new_file)
{
string line_1 = "__________________________________________________________________________________________________________________________" + "\n";
string headline = "ï/ï ¹\t| *Äèàïàçîí (äàòà / âðåìÿ)\t\t\t| Ðàçìåð (bars)\t| Äëèòåëüíîñòü (÷÷:ìì)\t| **Gap (pips)\t| Ïðèìå÷àíèÿ" + "\n";
FileDelete(file_name);// óäàëåíèå ðàííåå çàïèñàííîãî ôàéëà ñ òàêèì æå èìåíåì
handle = FileOpen(file_name, FILE_WRITE | FILE_READ, " ");
FileSeek (handle, 2400, SEEK_END);
FileWrite(handle, perenos, line_1, headline, line_2);
new_file = false;
}
if (note_1 != "") note_ = true;
//+-------------------
string hole = " " + holes_total_amount + _gap_ + "\t " + zero_day_begin + hole_day_begin + "." +
zero_month_begin + hole_month_begin + "." + hole_year_begin + " [" + hole_time_begin +
"]\t -\t" + zero_day_end + hole_day_end + "." + zero_month_end + hole_month_end + "." + hole_year_end +
" [" + hole_time_end + "]\t " + bars_hole + "\t\t " + duration_hole + "\t\t\t " + gap + "\t\t " + note_8 + note_1 + "\n";
FileWrite(handle, hole );
//+-------------------
// ìàêñèìàëüíàÿ äûðà è ðàçðûâ
string hole_range_max = "ï/ï ¹ - " + number_hole + "\n";
string breakup_range_max = "ï/ï ¹ - " + number_breakup + "\n";
string gap_range_max = "ï/ï ¹ - " + number_gap + "\n";
}
}
}
//+------------------------------
// ñîçäàíèå îò÷åòà *.txt ôàéëà
if (hole_min > 1) string note_2 = "\t( äûðû ðàçìåðîì < " + hole_min + " bars - èãíîðèðóþòñÿ çàäàííûìè ïîëüçîâàòåëåì óñëîâèÿìè )";
string note_3;
if (hole_min == breakup_min) note_3 = "ñìîòðåòü <Ðàçðûâû>, ñîãëàñíî çàäàííûì ïîëüçîâàòåëåì óñëîâèÿì )";
else note_3 = hole_min + " - " + breakup_min + " bars )\t" + note_2;
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;
string hole_average_size_;
string info_10, info_11, info_12, info_13, info_21, info_22, info_23;
string grade_hole_chart_ = DoubleToStr( (bars_hole_amount_ - bars_breakup_amount_)/ bars_ * 100, 2);
string quality_chart__ = DoubleToStr( (bars_ - bars_hole_amount_ + bars_breakup_amount_ ) / bars_ * 100, 2);
if (holes_total_amount != breakup_total_amount)
{
seconds = (bars_hole_amount - bars_breakup_amount) * duration_bar;
hours = MathFloor(seconds / 3600);
minutes = seconds / 3600 - hours;
string duration_holes;
string zero_h1 = "", zero_m1 = "";
if (hours < 10) zero_h1 = "0";
if (minutes * 60 < 10) zero_m1 = "0";
duration_holes = zero_h1 + DoubleToStr(hours,0) + ":" + zero_m1 + DoubleToStr(minutes * 60,0);
if (hours > 24)
{
days = MathFloor(hours / 24); hours = hours - days * 24;
if (hours < 10) zero_h1 = "0";
duration_holes = DoubleToStr(days,0) + " day(s) " + zero_h1 + DoubleToStr(hours,0) + ":" + zero_m1 + DoubleToStr(minutes * 60,0);
if (days > 30)
{
months = MathFloor(days / 30); days = days - months * 30;
duration_holes = DoubleToStr(months,0) + " month(s) " + DoubleToStr(days,0) + " day(s) " + zero_h1 + DoubleToStr(hours,0) + ":" + zero_m1 + DoubleToStr(minutes * 60,0);
}
}
hole_average_size_ = DoubleToStr( (bars_hole_amount_ - bars_breakup_amount_)/(holes_total_amount_ - breakup_total_amount_), 2);
info_10 = "Êîëè÷åñòâî -\t\t\t" + (holes_total_amount - breakup_total_amount) + "\n";
info_11 = "Ðàçìåð -\t\t\t" + (bars_hole_amount - bars_breakup_amount) + " bars\n";
info_23 = "Äëèòåëüíîñòü -\t\t\t" + duration_holes + " ÷÷:ìì\n";
info_12 = "Ìàêñèìàëüíûé ðàçìåð -\t\t" + hole_max + " bars\t\t" + hole_range_max;
info_13 = "Ñðåäíèé ðàçìåð -\t\t\t" + hole_average_size_ + " bars\n";
info_21 = "Ñòåïåíü äûðÿâîñòè ãðàôèêà -\t" + grade_hole_chart_ + " %\n";
info_22 = "Êà÷åñòâî ãðàôèêà -\t\t" + quality_chart__ + " %\n";
}
else
{
info_10 = "Êîëè÷åñòâî -\t\t\t-\n";
info_11 = "Ðàçìåð -\t\t\t-\n";
info_23 = "Äëèòåëüíîñòü -\t\t\t-\n";
info_12 = "Ìàêñèìàëüíûé ðàçìåð -\t\t-\n";
info_13 = "Ñðåäíèé ðàçìåð -\t\t\t-\n";
info_21 = "Ñòåïåíü äûðÿâîñòè ãðàôèêà -\t-\n";
info_22 = "Êà÷åñòâî ãðàôèêà -\t\t-\n";
}
string grade_hole_chart = DoubleToStr(bars_hole_amount_ / bars_ * 100, 2);
string grade_breakup_chart = DoubleToStr(bars_breakup_amount_ / bars_ * 100, 2);
string quality_chart = DoubleToStr( (bars_ - bars_hole_amount_) / bars_ * 100, 2);
string quality_chart_ = DoubleToStr( (bars_ - bars_breakup_amount_) / bars_ * 100, 2);
//+-------------------
string line_3 = " -----------------------------------------------------------------------------------------------------------" +
"-----------------------------------------------------------------------------------------------------------" + "\n";
string shapka = "Îò÷åò ïî îòñóòñòâóþùèì áàðàì â äàííûõ èñòîðèè. Èíñòðóìåíò - " + Symbol() + ". Òàéìôðåéì [" + time_frame + "].\n";
string info_1 = "Ïåðèîä -\t\t\t" + date_start + " ã. - " + date_end + " ã.\n";
string info_2 = "Áàðîâ â èñòîðèè -\t\t\t" + Bars + " bars\n";
seconds = Time[0] - Time[Bars - 1];
hours = MathFloor(seconds / 3600);
minutes = seconds / 3600 - hours;
double years;
string duration_period;
string zero_h5 = "", zero_m5 = "";
if (hours < 10) zero_h5 = "0";
if (minutes * 60 < 10) zero_m5 = "0";
duration_period = zero_h4 + DoubleToStr(hours,0) + ":" + zero_m5 + DoubleToStr(minutes * 60,0);
if (hours > 24)
{
days = MathFloor(hours / 24); hours = hours - days * 24;
if (hours < 10) zero_h5 = "0";
duration_period = DoubleToStr(days,0) + " day(s) " + zero_h5 + DoubleToStr(hours,0) + ":" + zero_m5 + DoubleToStr(minutes * 60,0);
if (days > 30)
{
months = MathFloor(days / 30); days = days - months * 30;
duration_period = DoubleToStr(months,0) + " month(s) " + DoubleToStr(days,0) + " day(s) " + zero_h5 + DoubleToStr(hours,0) + ":" + zero_m5 + DoubleToStr(minutes * 60,0);
if (months > 12)
{
years = MathFloor(months / 12); months = months - years * 12;
duration_period = DoubleToStr(years,0) + " year(s) " + DoubleToStr(months,0) + " month(s) " + DoubleToStr(days,0) + " day(s) " + zero_h5 + DoubleToStr(hours,0) + ":" + zero_m5 + DoubleToStr(minutes * 60,0);
}
}
}
string info_26 = "Äëèòåëüíîñòü -\t\t\t" + duration_period + " ÷÷:ìì\n";
string line_4 = "_____________________________________________________";
string info_3 = "ÎÁÙÈÉ ÀÍÀËÈÇ äûð è ðàçðûâîâ \n";
string info_4;
//+-------------------
if (holes_total_amount != 0)
{
//+------------------------------
seconds = bars_hole_amount * duration_bar;
hours = MathFloor(seconds / 3600);
minutes = seconds / 3600 - hours;
string duration_holes_;
string zero_h2 = "", zero_m2 = "";
if (hours < 10) zero_h2 = "0";
if (minutes * 60 < 10) zero_m2 = "0";
duration_holes_ = zero_h2 + DoubleToStr(hours,0) + ":" + zero_m2 + DoubleToStr(minutes * 60,0);
if (hours > 24)
{
days = MathFloor(hours / 24); hours = hours - days * 24;
if (hours < 10) zero_h2 = "0";
duration_holes_ = DoubleToStr(days,0) + " day(s) " + zero_h2 + DoubleToStr(hours,0) + ":" + zero_m2 + DoubleToStr(minutes * 60,0);
if (days > 30)
{
months = MathFloor(days / 30); days = days - months * 30;
duration_holes_ = DoubleToStr(months,0) + " month(s) " + DoubleToStr(days,0) + " day(s) " + zero_h2 + DoubleToStr(hours,0) + ":" + zero_m2 + DoubleToStr(minutes * 60,0);
}
}
string hole_average_size = DoubleToStr(bars_hole_amount_ / holes_total_amount_, 2);
string gap_average_size = DoubleToStr(gap_holes_ / holes_total_amount_, 2);
FileSeek (handle, 0, SEEK_END);
FileWrite(handle, line_1);
FileSeek (handle, 0, SEEK_SET);
info_4 = "Êîëè÷åñòâî -\t\t\t" + holes_total_amount + "\n";
string info_5 = "Ðàçìåð -\t\t\t" + bars_hole_amount + " bars\n";
string info_24 = "Äëèòåëüíîñòü -\t\t\t" + duration_holes_ + " ÷÷:ìì\n";
string info_6 = "Ñðåäíèé ðàçìåð -\t\t\t" + hole_average_size + " bars\n";
string note_7;
if (gap_min != 0) note_7 = "**"; else note_7 = " ";
string info_27 = "Gap" + note_7 + " -\t\t\t\t" + gap_holes + " pips\n";
string info_28 = "Ìàêñèìàëüíûé Gap -\t\t" + gap_max + " pips\t\t" + gap_range_max;
string info_31 = "Ñðåäíèé Gap -\t\t\t" + gap_average_size + " pips" + " \t( Gap / êîëè÷åñòâî )\n";
string info_7 = "Ñòåïåíü îáùåé äûðÿâîñòè ãðàôèêà -\t" + grade_hole_chart + " %\n";
string info_8 = "Êà÷åñòâî ãðàôèêà -\t\t" + quality_chart + " %\n";
string info_9 = "ÄÛÐÛ ( " + note_3 + "\n";
//+-------------------
string info_14 = "ÐÀÇÐÛÂÛ ( " + breakup_min + " bars è âûøå)\n";
string info_15, info_16, info_17, info_18, info_19, info_20, info_25;
if (breakup_total_amount != 0)
{
seconds = bars_breakup_amount * duration_bar;
hours = MathFloor(seconds / 3600);
minutes = seconds / 3600 - hours;
string duration_breakups;
string zero_h3 = "", zero_m3 = "";
if (hours < 10) zero_h3 = "0";
if (minutes * 60 < 10) zero_m3 = "0";
duration_breakups = zero_h3 + DoubleToStr(hours,0) + ":" + zero_m3 + DoubleToStr(minutes * 60,0);
if (hours > 24)
{
days = MathFloor(hours / 24); hours = hours - days * 24;
if (hours < 10) zero_h3 = "0";
duration_breakups = DoubleToStr(days,0) + " day(s) " + zero_h3 + DoubleToStr(hours,0) + ":" + zero_m3 + DoubleToStr(minutes * 60,0);
if (days > 30)
{
months = MathFloor(days / 30); days = days - months * 30;
duration_breakups = DoubleToStr(months,0) + " month(s) " + DoubleToStr(days,0) + " day(s) " + zero_h3 + DoubleToStr(hours,0) + ":" + zero_m3 + DoubleToStr(minutes * 60,0);
}
}
string breakup_average_size = DoubleToStr(bars_breakup_amount_ / breakup_total_amount_, 2);
info_15 = "Êîëè÷åñòâî -\t\t\t" + breakup_total_amount + "\n";
info_16 = "Ðàçìåð -\t\t\t" + bars_breakup_amount + " bars\n";
info_25 = "Äëèòåëüíîñòü -\t\t\t" + duration_breakups + " ÷÷:ìì\n";
info_17 = "Ìàêñèìàëüíûé ðàçìåð -\t\t" + breakup_max + " bars\t\t" + breakup_range_max;
info_18 = "Ñðåäíèé ðàçìåð -\t\t\t" + breakup_average_size + " bars\n";
info_19 = "Ñòåïåíü ðàçðûâíîñòè ãðàôèêà -\t" + grade_breakup_chart + " %\t\t( áåç ó÷åòà äûð )\n";
info_20 = "Êà÷åñòâî ãðàôèêà -\t\t" + quality_chart_ + " %\t\t( áåç ó÷åòà äûð )\n";
}
else
{
info_15 = "Êîëè÷åñòâî -\t\t\t-\n";
info_16 = "Ðàçìåð -\t\t\t-\n";
info_25 = "Äëèòåëüíîñòü -\t\t\t-\n";
info_17 = "Ìàêñèìàëüíûé ðàçìåð -\t\t-\n";
info_18 = "Ñðåäíèé ðàçìåð -\t\t\t-\n";
info_19 = "Ñòåïåíü ðàçðûâíîñòè ãðàôèêà -\t-\n";
info_20 = "Êà÷åñòâî ãðàôèêà -\t\t-\n";
}
//+-------------------
string note_4 = " *Äèàïàçîí íà÷èíàåòñÿ âðåìåíåì îòêðûòèÿ ïåðâîãî îòñóòñòâóþùåãî áàðà, à çàêàí÷èâàåòñÿ âðåìåíåì îòêðûòèÿ áàðà,\n ñëåäóþùåãî çà ïîñëåäíèì îòñóòñòâóþùèì áàðîì.\n";
string note_9 = " =Gap â äûðàõ= ÍÅ ÌÎÆÅÒ áûòü òî÷íûì, â ñèëó îòñóòñòâèÿ ñàìèõ áàðîâ, à ëèøü îïðåäåëÿåò ÐÀÇÍÈÖÓ â óðîâíÿõ öåí äî è ïîñëå ãýïà.\n";
string note_10;
if (n != 0) note_10 = " **";
else note_10 = " **Gap = 0 pips - íå îçíà÷àåò ïîëíîå îòñóòñòâèå êîòèðîâîê, à ëèøü óêàçûâàåò, ÷òî öåíà âîçâðàòèëàñü íà ïðåæíèé óðîâåíü (äî ãýïà).\n";
string note_5;
if (gap_ignore == true && gap_min >= 1) note_5 = " **Äûðû ñ Gap < " + gap_min + " pips - èãíîðèðóþòñÿ çàäàííûìè ïîëüçîâàòåëåì óñëîâèÿìè.\n" + note_9;
else note_5 = note_10 + note_9;
string note_6 = "";
if (note_ == true) note_6 = "***Êîíåö íåäåëüíîé ñåññèè -\t" + TimeToStr(StrToTime(end_week_sessions) + duration_bar,TIME_MINUTES) + " ÷÷:ìì";
FileWrite(handle, line_3, shapka, line_2, info_1, info_2, info_26, line_4, perenos, info_3, info_4, info_5, info_24, info_6, info_27,
info_28, info_31, info_7, info_8, line_4, perenos, info_9, info_10, info_11, info_23, info_12, info_13, info_21, info_22,
line_4, perenos, info_14, info_15, info_16, info_25, info_17, info_18, info_19, info_20, line_4, perenos, note_4, perenos, note_5, perenos, note_6);
}
else
{
FileDelete(file_name);
handle = FileOpen(file_name, FILE_WRITE | FILE_READ, " ");
info_4 = "Êîëè÷åñòâî -\t\t\tÍà äàííîì ãðàôèêå äûð è ðàçðûâîâ ÍÅ ÎÁÍÀÐÓÆÅÍÎ\n";
FileWrite(handle, line_3, shapka, line_2, info_1, info_2, line_4, perenos, info_3, info_4, line_4);
}
FileClose(handle);
MessageBox(" ïàïêå òåðìèíàëà MT4: \Experts\files\ ñîçäàí ôàéë îò÷åòà:\n\n" + file_name,
"Àíàëèç äàííûõ èñòîðèè óñïåøíî çàâåðøåí", MB_OK | MB_DEFBUTTON1);
return(0);
}
//+------------------------------------------------------------------+
Comments