6 KiB
A lightweight and fast MT5 module that keeps a local SQLite mirror of the models.dev LLM registry.
Fetches the full catalog (orgs + models: cost, context windows, modalities, flags) via WebRequest, persists it to a shared SQLite database, and notifies subscribed charts on every update.
Main Features
- Self-updating registry: on init, downloads
https://models.dev/api.jsonand upserts every org/model into a local SQLite database (llm_orgs,llm_models) - Scheduled refresh: configurable update interval (
InpHorasUpdate), re-syncs automatically viaOnTimer - Retry with backoff: failed fetches/writes are retried up to
InpMaxIntentostimes, waitingInpSegundosTryseconds between attempts, before falling back to the next full cycle - Shared or local storage: files can live in the MT5 common folder (
InpFilesInCommonFolder) so multiple charts/EAs share one database - Cross-chart notifications: on a successful sync, emits
EventChartCustom(LLMREG_ON_UPDATE) to every chart registered in thecharts_idtable - Compact model schema: cost (in/out), release/update dates, context window/input/output, and bitflags for
tools,temperature,reasoning,open_weights,structured_output, plus input/output modalities (text,audio,video,image,pdf)
Registry service (drop-in EA/module)
input string InpFolderNameBase = "LLmRegistery\\";
input bool InpFilesInCommonFolder = true;
input int InpHorasUpdate = 8;
input int InpMaxIntentos = 5;
input int InpSegundosTry = 100;
input int InpTimeoutWebReqeuestMs = 60000;
input ENUM_VERBOSE_LOG_LEVEL InpLogLevel = VERBOSE_LOG_LEVEL_ALL;
TSN::CLlmRegistery g_llm_registery;
int OnInit()
{
g_llm_registery.AddLogFlags(InpLogLevel);
if(!g_llm_registery.Init(InpFolderNameBase, InpFilesInCommonFolder, InpHorasUpdate,
InpMaxIntentos, InpSegundosTry, InpTimeoutWebReqeuestMs))
return INIT_FAILED;
return(INIT_SUCCEEDED);
}
void OnTimer()
{
g_llm_registery.OnTimerEvent();
}
Subscribing to updates from another chart
#include <TSN\\LLM\\RegDef.mqh>
int g_sql_handle = INVALID_HANDLE;
const long g_my = ChartID();
int OnInit()
{
g_sql_handle = DatabaseOpen(InpEaServerFoderName + LLMREG_FILENAME_SQL,
DATABASE_OPEN_READWRITE | (InpEaFilesInCommonFolder ? DATABASE_OPEN_COMMON : 0));
DatabaseExecute(g_sql_handle, StringFormat("INSERT OR IGNORE INTO charts_id (chart_id) VALUES(%I64d)", g_my));
return(INIT_SUCCEEDED);
}
void OnChartEvent(const int32_t id, const long &lparam, const double &dparam, const string &sparam)
{
if(id == CHARTEVENT_CUSTOM + LLMREG_ON_UPDATE)
Print("Base de datos de modelos ha sido actulizada");
}
void OnDeinit(const int reason)
{
DatabaseExecute(g_sql_handle, StringFormat("DELETE FROM charts_id WHERE chart_id = %I64d;", g_my));
DatabaseClose(g_sql_handle);
}
Querying the registry (SQL)
SELECT m.name, m.cost_in, m.cost_out, m.context_window
FROM llm_models m
JOIN llm_orgs o ON o.id = m.org_id
WHERE o.id = 'anthropic'
ORDER BY m.last_update_date DESC;
Schema
llm_orgs
├── id (PK)
├── name
├── doc
└── updated_at
llm_models
├── id, org_id (PK, FK -> llm_orgs.id)
├── name, description
├── cost_in, cost_out
├── release_date, last_update_date
├── flags (tools | temperature | open_weights | reasoning | structured_output)
├── in_modals / out_modals (text | audio | video | image | pdf)
├── context_window / context_output / context_input
└── updated_at
charts_id
└── chart_id (PK) -- charts subscribed to update notifications
Full definition in Src/Init.sql.
Repository Structure
LLmRegiteryByLeo/
├── Src/
│ ├── Main.mqh # CLlmRegistery: fetch, parse, upsert, notify, retry logic
│ ├── Def.mqh # Structs, flags, modal defines, index constants
│ ├── Init.sql # SQLite schema (orgs, models, charts_id)
│ └── EnumReg/ # Modal string -> flag enum registry
├── Test/
│ └── TestHooks.mq5 # Minimal subscriber example (chart hook)
└── RegisteryService.mq5 # Main EA/module entry point
License
Read Full License By downloading or using this repository, you accept the license terms.
Requirements
See dependencies.json for the full list.
- MetaTrader 5, build 5430+
- WebRequest access enabled for
https://models.dev(Tools → Options → Expert Advisors)
Installation
cd "C:\Users\YOUR_USER\AppData\Roaming\MetaQuotes\Terminal\YOUR_ID\MQL5\Shared Projects"
tsndep install "https://forge.mql5.io/nique_372/LLmRegiteryByLeo.git"
Requires the tsndep package, available on PyPI. It automatically downloads and installs all declared dependencies.
Quick Start
1. Add the URL to WebRequest allowed list:
https://models.dev
2. Attach RegisteryService.mq5 to a chart (once, as a background service). It creates/updates LLmRegistery.db and Registery.json in the shared folder.
3. From any other EA, open the shared database and query it directly, or subscribe to LLMREG_ON_UPDATE via OnChartEvent as shown in Subscribing to updates.
Contact
- Platform: MQL5 Community
- Profile: https://www.mql5.com/es/users/nique_372
- Articles: https://www.mql5.com/es/users/nique_372/publications