| //+------------------------------------------------------------------+
|
| //| Main.mqh |
|
| //| Copyright 2025, Niquel Mendoza. |
|
| //| https://www.mql5.com/es/users/nique_372 |
|
| //+------------------------------------------------------------------+
|
| #property copyright "Copyright 2025, Niquel Mendoza."
|
| #property link "https://www.mql5.com/es/users/nique_372"
|
| #property strict
|
|
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| #include "..\\..\\..\\GrapichsByLeo\\Histogram\\Main.mqh"
|
| #include "..\\Utils\\Base.mqh"
|
| // https://forge.mql5.io/nique_372/GrapichsByLeo
|
|
|
|
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| struct MetricData
|
| {
|
| string label;
|
| uint ms_duracion;
|
| int memory_use;
|
| };
|
|
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| class CGenericUtilsSort_MetricData
|
| {
|
| public:
|
| CGenericUtilsSort_MetricData(void) {}
|
| ~CGenericUtilsSort_MetricData(void) {}
|
| //---
|
| static void Swap(MetricData& a, MetricData& b)
|
| {
|
| const MetricData temp = a;
|
| a = b;
|
| b = temp;
|
| }
|
| };
|
|
|
| //+------------------------------------------------------------------+
|
| class CGenericUtilsSort_MetricDataMem : public CGenericUtilsSort_MetricData
|
| {
|
| public:
|
| CGenericUtilsSort_MetricDataMem(void) {}
|
| ~CGenericUtilsSort_MetricDataMem(void) {}
|
| //---
|
| static __forceinline bool Less(const MetricData& a, const MetricData& b) { return a.memory_use < b.memory_use; }
|
| };
|
|
|
| //+------------------------------------------------------------------+
|
| class CGenericUtilsSort_MetricDataVelozMs : public CGenericUtilsSort_MetricData
|
| {
|
| public:
|
| CGenericUtilsSort_MetricDataVelozMs(void) {}
|
| ~CGenericUtilsSort_MetricDataVelozMs(void) {}
|
| //---
|
| static __forceinline bool Less(const MetricData& a, const MetricData& b) { return a.ms_duracion < b.ms_duracion; }
|
| };
|
|
|
| //--- Para el texto en ejes
|
| __forceinline string MetricTextFunc_ByMs(double value, int8_t decimals) { return DoubleToString(value, 0) + " ms"; }
|
| __forceinline string MetricTextFunc_ByMem(double value, int8_t decimals) { return DoubleToString(value, 1) + " mb"; }
|
|
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| class CMetrics
|
| {
|
| private:
|
| MetricData m_data[TOTAL_FVG_TEST];
|
|
|
| public:
|
| CMetrics(void) {}
|
| ~CMetrics(void) {}
|
|
|
| //---
|
| void Init();
|
|
|
| //---
|
| void Plot(uint back_color, const string& file_name, bool comon);
|
| };
|
|
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| void CMetrics::Init(void)
|
| {
|
| //---
|
| for(int i = 0; i < TOTAL_FVG_TEST; i++)
|
| {
|
| ResetLastError();
|
| const int fh = FileOpen(g_benchk_filenames[i], FILE_READ | FILE_TXT | FILE_COMMON);
|
| if(fh == INVALID_HANDLE)
|
| {
|
| FastLog(FUNCION_ACTUAL, ERROR_TEXT, StringFormat("Error al abrir el archivo = %s, ultimo error = %d", g_benchk_filenames[i], GetLastError()));
|
| Remover();
|
| return;
|
| }
|
|
|
| //---
|
| m_data[i].ms_duracion = uint(FileReadString(fh));
|
| m_data[i].memory_use = int(FileReadString(fh));
|
| m_data[i].label = g_benchk_names[i];
|
| FileClose(fh);
|
| }
|
|
|
| ArrayPrint(m_data, 2, " | ");
|
| }
|
|
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| void CMetrics::Plot(uint back_color, const string& file_name, bool comon)
|
| {
|
| //---
|
| CCanvasCustom canvas;
|
| canvas.CreateBitmapLabel(0, 0, "Comparacion", 30, 0, 1050, 550, COLOR_FORMAT_ARGB_RAW);
|
| canvas.Erase(back_color);
|
|
|
| //--- Plot 1
|
| CHistogramVertical hist1;
|
| hist1.Initialize(&canvas, 5, 5, 550, 540, 0xFFFFFFFF);
|
| hist1.TituloDefault("Velocidad MS");
|
|
|
| // Datos
|
| TsnSortP(m_data, 0, ArraySize(m_data) - 1, MetricData, MetricDataVelozMs);
|
| //CSimpleSort::SortDescendente(m_data, (MetricSortByMs)MetricSortFunc_ByMs);
|
| for(int i = 0; i < TOTAL_FVG_TEST; i++)
|
| {
|
| hist1.AddConjuntoBar(m_data[i].label, 12, "Arial", HISTOGRAM_TEXT_MODE_LEFT_UPPER, 1, 50, HIST_DRAW_RECT_FILL, 0); // Ya ocnifugra el ptr de lectura
|
| hist1.AddBarToConjuntoBarFast(double(m_data[i].ms_duracion), hist1.GetColorGeneratorPointer().Next());
|
| }
|
|
|
| // Lienzo
|
| hist1.InitLienzoBarras(75, 80, 540, 530, 5, 5, 10);
|
| hist1.CreateBordesEjesGridsSimple(HIST_LINE_MODE_IZQUIERDA, 10, true, 4278190080, 4287730065, MetricTextFunc_ByMs);
|
|
|
|
|
| //--- Plot 2
|
| CHistogramVertical hist2;
|
| hist2.Initialize(&canvas, 565, 5, 1040, 540, 0xFFFFFFFF);
|
| hist2.TituloDefault("Consumo en mb");
|
|
|
|
|
| // Datos
|
| TsnSortP(m_data, 0, ArraySize(m_data) - 1, MetricData, MetricDataMem);
|
| // CSimpleSort::SortDescendente(m_data, (MetricSortByMs)MetricSortFunc_ByMem);
|
| for(int i = 0; i < TOTAL_FVG_TEST; i++)
|
| {
|
| hist2.AddConjuntoBar(m_data[i].label, 12, "Arial", HISTOGRAM_TEXT_MODE_LEFT_UPPER, 1, 50, HIST_DRAW_RECT_FILL, 0); // Ya ocnifugra el ptr de lectura
|
| hist2.AddBarToConjuntoBarFast(double(m_data[i].memory_use), hist1.GetColorGeneratorPointer().Next());
|
| }
|
|
|
| // Lienzo
|
| hist2.InitLienzoBarras(75, 80, 465, 530, 5, 5, 10);
|
| hist2.CreateBordesEjesGridsSimple(HIST_LINE_MODE_IZQUIERDA, 10, true, 4278190080, 4287730065, MetricTextFunc_ByMem);
|
|
|
| //---
|
|
|
| hist1.Redraw();
|
| hist2.Redraw();
|
| //---
|
| Sleep(15000);
|
|
|
| //--- Gurdamos
|
| canvas.Save(file_name, comon);
|
| canvas.Destroy();
|
| }
|
|
|
| //+------------------------------------------------------------------+
|