//+------------------------------------------------------------------+ //| Gen.mq5 | //| Copyright 2026, Niquel Mendoza | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2026, Niquel Mendoza" #property link "https://www.mql5.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #include #include "..\\Basic.mqh" //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ input string InpFileNameOut = "MQLArticles\\Temp\\Main.mqh"; input bool InpFolderInC = true; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ const int g_tf_values[21] = { PERIOD_M1, PERIOD_M2, PERIOD_M3, PERIOD_M4, PERIOD_M5, PERIOD_M6, PERIOD_M10, PERIOD_M12, PERIOD_M15, PERIOD_M20, PERIOD_M30, PERIOD_H1, PERIOD_H2, PERIOD_H3, PERIOD_H4, PERIOD_H6, PERIOD_H8, PERIOD_H12, PERIOD_D1, PERIOD_W1, PERIOD_MN1 }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CHasher0 { public: CHasher0(void) {} ~CHasher0(void) {} static __forceinline int Hash(const int v) { return v; } }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CHasher1 { public: CHasher1(void) {} ~CHasher1(void) {} static __forceinline ulong Hash(const int v, const ulong seed) { ulong h = ((ulong)v ^ seed) * 0x9E3779B97F4A7C15; h ^= h >> 32; return h; } }; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- TSN::CPerfectHashByLeo ph; ph.InitAlg(21, 0.98, 4); //--- int out_k[]; ArrayResize(out_k, ph.m_final_table_size); ArrayInitialize(out_k, -1); ulong out_seeds[]; Print(ph.Run(g_tf_values, out_seeds, out_k)); //--- for(int i = 0; i < 21; i++) { const int v = g_tf_values[i]; const int seed_index = int(v & ph.m_buckets_size_last); ulong h = ((ulong)v ^ out_seeds[seed_index]) * 0x9E3779B97F4A7C15; h ^= h >> 32; //--- Pos const int fi = int(h & ph.m_final_table_size_last); PrintFormat("Index final = %d | valor = %s", fi, EnumToString((ENUM_TIMEFRAMES)out_k[fi])); } //--- ::ResetLastError(); const int fh = FileOpen(InpFileNameOut, FILE_WRITE | FILE_ANSI | FILE_TXT | (InpFolderInC ? FILE_COMMON : 0)); if(fh == INVALID_HANDLE) { FastLog(FUNCION_ACTUAL, FATAL_ERROR_TEXT, StringFormat("Fallo al abrir el archivo = %s, ultimo err = %d", InpFileNameOut, ::GetLastError())); return; } //--- const int fnt = int(ph.m_final_table_size_last); //--- Escritura del archivo FileWrite(fh, "//+------------------------------------------------------------------+"); FileWrite(fh, "//| Main.mqh |"); FileWrite(fh, "//| Copyright 2026, Niquel Mendoza |"); FileWrite(fh, "//| https://www.mql5.com |"); FileWrite(fh, "//+------------------------------------------------------------------+"); FileWrite(fh, "#property copyright \"Copyright 2026, Niquel Mendoza\""); FileWrite(fh, "#property link \"https://www.mql5.com\""); FileWrite(fh, "#property strict"); FileWrite(fh, "#ifndef MQLARITCLES_UTILS_TFI_MAIN_MQH"); FileWrite(fh, "#define MQLARITCLES_UTILS_TFI_MAIN_MQH"); FileWriteString(fh, "\r\n"); FileWrite(fh, "//+------------------------------------------------------------------+"); FileWrite(fh, "//| |"); FileWrite(fh, "//+------------------------------------------------------------------+"); FileWrite(fh, "/*"); FileWrite(fh, "La idea con este mqh es poder mapear los valores de enumtimeframe (Que estan dispersos) en una talba"); FileWrite(fh, "de 32 entradas por ejemplo un fast period seconds, o un swith jump table o(1)"); FileWrite(fh, "O un timeframe to string"); FileWrite(fh, "*/"); FileWrite(fh, ""); FileWrite(fh, "namespace TSN {"); FileWrite(fh, "//+------------------------------------------------------------------+"); FileWrite(fh, "//| |"); FileWrite(fh, "//+------------------------------------------------------------------+"); FileWrite(fh, StringFormat("#define MQLARTICLES_TFI_BUCKETS_SIZE (%I64uULL)", ph.m_buckets_size)); FileWrite(fh, StringFormat("#define MQLARTICLES_TFI_BUCKETS_SIZE_L (%I64uULL)", ph.m_buckets_size_last)); FileWrite(fh, StringFormat("#define MQLARTICLES_TFI_FINAL_TSIZE (%I64uULL)", ph.m_final_table_size)); FileWrite(fh, StringFormat("#define MQLARTICLES_TFI_FINAL_TSIZE_L (%I64uULL)", ph.m_final_table_size_last)); FileWrite(fh, ""); FileWrite(fh, "/* Algoritmo completo"); FileWrite(fh, "const int seed_index = int(v & MQLARTICLES_TFI_BUCKETS_SIZE_L);"); FileWrite(fh, "ulong h = ((ulong)v ^ g_mqlarticles_tfi_out_seeds[seed_index]) * 0x9E3779B97F4A7C15;"); FileWrite(fh, "h ^= h >> 32;"); FileWrite(fh, "const int fi = int(h & MQLARTICLES_TFI_FINAL_TSIZE_L);"); FileWrite(fh, "*/"); FileWrite(fh, ""); FileWrite(fh, "//--- Tabla de seeds"); FileWrite(fh, "const ulong g_mqlarticles_tfi_out_seeds[MQLARTICLES_TFI_BUCKETS_SIZE] ="); FileWrite(fh, "{"); int v = int(ph.m_buckets_size_last); for(int i = 0; i < v; i++) { FileWrite(fh, StringFormat("%I64uULL,", out_seeds[i])); } FileWrite(fh, StringFormat("%I64uULL", out_seeds[v])); FileWrite(fh, "};"); FileWrite(fh, ""); FileWrite(fh, "//+------------------------------------------------------------------+"); FileWrite(fh, "//-- Ahora empezamos con otras tablas "); // tabla 1 period seconds FileWrite(fh, "const int g_mqlarticles_tfi_period_s[MQLARTICLES_TFI_FINAL_TSIZE] = {"); for(int i = 0; i < fnt; i++) { const int v = out_k[i]; if(v == -1) { FileWrite(fh, "-1, // Invalid "); } else { const ENUM_TIMEFRAMES vt = (ENUM_TIMEFRAMES)v; FileWrite(fh, StringFormat("%d, // %s ", PeriodSecondsFastSeg(vt), EnumToString(vt))); } } //--- final v = out_k[fnt]; if(v == -1) { FileWrite(fh, "-1 // Invalid "); } else { const ENUM_TIMEFRAMES vt = (ENUM_TIMEFRAMES)v; FileWrite(fh, StringFormat("%d // %s ", PeriodSecondsFastSeg(vt), EnumToString(vt))); } FileWrite(fh, "};"); //--- Ahora namings FileWrite(fh, ""); FileWrite(fh, "//--- Ahora namigs"); FileWrite(fh, "struct MqlArticlesTfiDesc {"); FileWrite(fh, " string full_name; // Nombre compleato eg: PERIOD_M1 "); FileWrite(fh, " string short_name_up; // Short name upper M1, etc.. "); FileWrite(fh, " string short_name_lo; // Short name lowe m1, etc.. "); FileWrite(fh, " string desc; // Short name lowe m1, etc.. "); FileWrite(fh, "}; "); FileWrite(fh, ""); FileWrite(fh, "const MqlArticlesTfiDesc g_mqlarticles_tfi_desc[MQLARTICLES_TFI_FINAL_TSIZE] = {"); for(int i = 0; i < fnt; i++) { const int v = out_k[i]; if(v == -1) { FileWrite(fh, "{\"\", \"\",\"\",\"\"}, // Invalid "); } else { const ENUM_TIMEFRAMES vt = (ENUM_TIMEFRAMES)v; const string str_base = EnumToString(vt); string s = str_base; StringReplace(s, "PERIOD_", ""); string low = s; low.Lower(); FileWrite(fh, StringFormat("{\"%s\",\"%s\",\"%s\",\"\"}, ", str_base, s, low)); } } //--- v = out_k[fnt]; if(v == -1) { FileWrite(fh, "{\"\", \"\",\"\",\"\"} // Invalid "); } else { const ENUM_TIMEFRAMES vt = (ENUM_TIMEFRAMES)v; const string str_base = EnumToString(vt); string s = str_base; StringReplace(s, "PERIOD_", ""); string low = s; low.Lower(); FileWrite(fh, StringFormat("{\"%s\",\"%s\",\"%s\",\"\"} ", str_base, s, low)); } FileWrite(fh, "}; "); FileWrite(fh, ""); FileWrite(fh, "}"); // namespace FileWrite(fh, "//+------------------------------------------------------------------+"); FileWrite(fh, "#endif // MQLARITCLES_UTILS_TFI_MAIN_MQH"); FileClose(fh); // Termino } //+------------------------------------------------------------------+