Author of this documentation: Tomáš Bělák
Scope: production-grade technical documentation for CUDA-accelerated LSTM training/inference from MetaTrader 5 (MQL5) via DLL bridge.
MQL5GPULibrary_LSTM is a hybrid quantitative-engineering project that exposes a CUDA-backed recurrent neural network runtime (LSTM-centric, with additional RNN/GRU layer support) to MetaTrader 5 through a DLL API designed for low-latency practical use.
The project solves a common integration bottleneck in algorithmic trading systems:
- MQL5 is excellent for strategy orchestration, execution logic, and chart-native tooling,
- while high-throughput deep learning training is better suited to C++/CUDA.
This repository bridges those worlds with:
- Handle-based model lifecycle management (
DN_Create,DN_Free), - Flexible network construction (
DN_AddLayerEx,DN_AddGRULayer,DN_AddRNNLayer), - Synchronous and asynchronous training (
DN_Train,DN_TrainAsync), - Detailed progress telemetry (
DN_GetProgress*,DN_GetProgressAll), - State persistence and rollback tools (
DN_SaveState,DN_GetState,DN_LoadState, snapshots), - Batch inference API suitable for indicator- or EA-level integration (
DN_PredictBatch).
The runtime is designed around five practical constraints from real trading-system environments:
- Deterministic ownership: each model instance is represented by an integer handle, minimizing cross-context ambiguity.
- Operational resilience: every mutating API call can be validated and followed by centralized error retrieval (
DN_GetError). - UI responsiveness in MT5: async training allows heavy GPU workloads without freezing chart logic or user interactions.
- Production telemetry: rich progress metadata (epochs, minibatches, best MSE, ETA, gradient norm) enables informed runtime decisions.
- Experiment safety: snapshots and state serialization reduce iteration risk and support reproducible workflows.
kernel.cu: CUDA/C++ core implementing model graph, training loop, telemetry, and exported DLL boundary.MQL5/Indicators/*.mq5: integration layer + practical examples of usage in MT5 indicator context.docs/: static visualization and interactive documentation assets.- Solution/project files (
.sln,.vcxproj): reproducible build entry points for Windows toolchain.
int DN_Create();
void DN_Free(int h);DN_Createallocates and registers a new model context and returns a positive handle on success.DN_Freemust be called exactly once per valid handle to release associated resources.
Operational rule: in MQL5, treat the handle as a managed resource; reset it to an invalid value after DN_Free to prevent accidental reuse.
MQL_BOOL DN_SetSequenceLength(int h, int seq_len);
MQL_BOOL DN_SetMiniBatchSize(int h, int mbs);
MQL_BOOL DN_AddLayerEx(int h, int in, int out, int act, int ln, double drop);
MQL_BOOL DN_AddGRULayer(int h, int in, int out, double drop);
MQL_BOOL DN_AddRNNLayer(int h, int in, int out, double drop);
MQL_BOOL DN_SetGradClip(int h, double clip);
MQL_BOOL DN_SetOutputDim(int h, int out_dim);seq_len > 0mbs > 00.0 <= drop < 1.0out_dimmust match target tensor dimensionality.
For canonical LSTM architecture stacks, DN_AddLayerEx should be considered the primary constructor.
MQL_BOOL DN_LoadBatch(int h, const double* X, const double* T,
int batch, int in, int out, int l);
MQL_BOOL DN_PredictBatch(int h, const double* X,
int batch, int in, int l, double* Y);in = seq_len * feature_dimlen(X) = batch * inlen(T) = batch * outlen(Y) = batch * out_dimin % seq_len == 0must hold
Violating these assumptions typically produces immediate API failure and a meaningful error message retrievable via DN_GetError.
MQL_BOOL DN_Train(int h, int epochs, double target_mse, double lr, double wd);Use synchronous mode when:
- integrating in offline optimization scripts,
- deterministic blocking is acceptable,
- simple control flow is preferred.
MQL_BOOL DN_TrainAsync(int h, int epochs, double target_mse, double lr, double wd);
int DN_GetTrainingStatus(int h);
void DN_GetTrainingResult(int h, double* out_mse, int* out_epochs);
void DN_StopTraining(int h);Use asynchronous mode when:
- the indicator/EA must keep processing ticks or UI events,
- long training runs require progress visibility,
- strategy architecture enforces non-blocking behavior.
0→ idle1→ training in progress2→ completed-1→ error
int DN_GetProgressEpoch(int h);
int DN_GetProgressTotalEpochs(int h);
int DN_GetProgressMiniBatch(int h);
int DN_GetProgressTotalMiniBatches(int h);
double DN_GetProgressLR(int h);
double DN_GetProgressMSE(int h);
double DN_GetProgressBestMSE(int h);
double DN_GetProgressGradNorm(int h);
int DN_GetProgressTotalSteps(int h);
double DN_GetProgressPercent(int h);
double DN_GetProgressElapsedSec(int h);
double DN_GetProgressETASec(int h);
MQL_BOOL DN_GetProgressAll(
int h,
int* epoch, int* total_epochs,
int* minibatch, int* total_minibatches,
double* mse, double* best_mse,
double* lr, double* grad_norm,
double* percent, double* elapsed_sec, double* eta_sec
);mse: current optimization state, noisy at batch granularity.best_mse: stability anchor; evaluate convergence versus this metric.grad_norm: early warning for exploding/unstable optimization.eta_sec: operational estimate for UI and task scheduling.
- Poll from
OnTimer(e.g., 100–500 ms), not every tick. - Prefer
DN_GetProgressAllto reduce call overhead and improve consistency. - Persist sampled telemetry for post-mortem model diagnostics.
int DN_GetLayerCount(int h);
double DN_GetLayerWeightNorm(int h, int l);
double DN_GetGradNorm(int h);
int DN_SaveState(int h);
MQL_BOOL DN_GetState(int h, char* buf, int max_len);
MQL_BOOL DN_LoadState(int h, const char* buf);
MQL_BOOL DN_SnapshotWeights(int h);
MQL_BOOL DN_RestoreWeights(int h);
void DN_GetError(short* buf, int len);- Checkpointing policy: call
DN_SaveStateat milestone convergence points and export state string externally. - Safe experimentation:
DN_SnapshotWeightsbefore high-risk hyperparameter changes; restore when divergence is detected. - Failure triage: on any
MQL_FALSE, immediately callDN_GetErrorand log the returned message with context.
DN_Create- Configure sequence length and minibatch
- Build layer stack
- Set output dimension
- Load training batch
- Optionally snapshot
- Start
DN_TrainAsync
- Query status (
DN_GetTrainingStatus) - Read telemetry (
DN_GetProgressAll) - Update chart UI / logs
- If completed, collect result (
DN_GetTrainingResult) - Optionally run inference (
DN_PredictBatch)
- If running, request stop (
DN_StopTraining) - Release handle (
DN_Free) - Zero/reset local handle variable
- Windows with Visual Studio capable of opening
.sln - NVIDIA CUDA Toolkit compatible with your compiler toolset
- x64 target environment
- Open
MQL5GPULibrary_LSTM.sln - Select
Release | x64 - Build solution
- Copy resulting DLL into terminal data folder
MQL5\Libraries
- Copy indicator files from
MQL5/IndicatorsintoMQL5\Indicators - Compile in MetaEditor
- Enable DLL imports in MT5 settings
- Attach indicator to chart and verify initialization logs
- Start conservatively (
lr,epochs) and tune incrementally. - Use
target_msefor controlled early stopping. - Apply gradient clipping (
DN_SetGradClip) when gradient norm spikes.
- Validate shape arithmetic before every
DN_LoadBatchcall. - Keep feature normalization strategy consistent between train and inference.
- Use fixed seeds and deterministic preprocessing where possible.
- Isolate each strategy/model with a unique handle.
- Do not share mutable buffers across asynchronous model operations.
- Always stop and free cleanly on chart unload or strategy reset.
kernel.cu— CUDA DLL implementation, core training/inference runtime.MQL5/Indicators/LSTM_RealTimePredictor.mq5— primary practical MT5 integration example.MQL5/Indicators/Examples/LSTM_PatternCompletion_Demo.mq5— demo-oriented usage.docs/index.html,docs/app.js,docs/lstm-flow.svg— static documentation artifacts.MQL5GPULibrary_LSTM.sln,MQL5GPULibrary_LSTM.vcxproj— build orchestration.LICENSE.txt— licensing terms.
-
Any API returns failure (
MQL_FALSE)
→ callDN_GetError, log immediately, include context (handle, operation, dimensions). -
Training does not converge
→ reducelr, inspectgrad_norm, enable/adjust clipping, validate target scaling. -
Status remains idle after async start
→ verify initialization order and successfulDN_TrainAsyncreturn code. -
Prediction output malformed
→ re-checkin,seq_len,out_dim, and allocated output buffer length. -
MT5 instability during long sessions
→ audit handle lifecycle and deinitialization discipline, reduce polling frequency.
This project is distributed under the MIT License. See LICENSE.txt for the full legal text.
Autor této dokumentace: Tomáš Bělák Rozsah: produkční technická dokumentace pro CUDA-akcelerovaný trénink a inferenci LSTM ze systému MetaTrader 5 (MQL5) prostřednictvím DLL rozhraní.
MQL5GPULibrary_LSTM je hybridní kvantitativně-inženýrský projekt, který zpřístupňuje CUDA-akcelerovaný běhový modul rekurentních neuronových sítí (s důrazem na LSTM, s dodatečnou podporou vrstev RNN/GRU) platformě MetaTrader 5 skrze DLL API navržené pro praktické využití s nízkou latencí.
Projekt řeší běžné integrační úzké místo v systémech algoritmického obchodování:
- MQL5 vyniká v orchestraci strategií, exekuční logice a nástrojích nativně svázaných s grafy,
- zatímco vysokovýkonný trénink hlubokých sítí je vhodnější pro C++/CUDA.
Toto úložiště propojuje oba světy prostřednictvím:
- Správy životního cyklu modelu založené na handle (
DN_Create,DN_Free), - Flexibilní konstrukce sítě (
DN_AddLayerEx,DN_AddGRULayer,DN_AddRNNLayer), - Synchronního i asynchronního tréninku (
DN_Train,DN_TrainAsync), - Podrobné telemetrie průběhu (
DN_GetProgress*,DN_GetProgressAll), - Nástrojů pro persistenci stavu a návrat k předchozímu stavu (
DN_SaveState,DN_GetState,DN_LoadState, snímky), - API pro dávkovou inferenci vhodného k integraci na úrovni indikátorů či EA (
DN_PredictBatch).
Běhový modul je navržen s ohledem na pět praktických omezení reálných obchodních systémů:
- Deterministické vlastnictví: každá instance modelu je reprezentována celočíselným handle, čímž se minimalizuje nejednoznačnost napříč kontexty.
- Provozní odolnost: každé volání API měnící stav lze ověřit a následně získat centralizovanou informaci o chybě (
DN_GetError). - Odezva UI v MT5: asynchronní trénink umožňuje náročné GPU úlohy bez zamrznutí logiky grafu nebo uživatelských interakcí.
- Produkční telemetrie: bohatá metadata o průběhu (epochy, mini-dávky, nejlepší MSE, odhadovaný čas dokončení, norma gradientu) umožňují informovaná rozhodnutí za běhu.
- Bezpečnost experimentů: snímky a serializace stavu snižují riziko při iteracích a podporují reprodukovatelné pracovní postupy.
kernel.cu: jádro v CUDA/C++ implementující graf modelu, trénovací smyčku, telemetrii a exportované rozhraní DLL.MQL5/Indicators/*.mq5: integrační vrstva a praktické příklady použití v kontextu indikátorů MT5.docs/: statické vizualizace a interaktivní dokumentační podklady.- Soubory řešení a projektu (
.sln,.vcxproj): reprodukovatelné vstupní body sestavení pro nástrojový řetězec Windows.
int DN_Create();
void DN_Free(int h);DN_Createalokuje a zaregistruje nový kontext modelu a při úspěchu vrací kladný handle.DN_Freemusí být voláno právě jednou pro každý platný handle, aby se uvolnily přidružené prostředky.
Provozní pravidlo: v MQL5 zacházejte s handle jako se spravovaným prostředkem; po volání DN_Free jej resetujte na neplatnou hodnotu, abyste předešli nechtěnému opětovnému použití.
MQL_BOOL DN_SetSequenceLength(int h, int seq_len);
MQL_BOOL DN_SetMiniBatchSize(int h, int mbs);
MQL_BOOL DN_AddLayerEx(int h, int in, int out, int act, int ln, double drop);
MQL_BOOL DN_AddGRULayer(int h, int in, int out, double drop);
MQL_BOOL DN_AddRNNLayer(int h, int in, int out, double drop);
MQL_BOOL DN_SetGradClip(int h, double clip);
MQL_BOOL DN_SetOutputDim(int h, int out_dim);seq_len > 0mbs > 00.0 <= drop < 1.0out_dimmusí odpovídat dimenzi cílového tenzoru.
Pro kanonické zásobníky architektury LSTM by měl být DN_AddLayerEx považován za primární konstruktor vrstvy.
MQL_BOOL DN_LoadBatch(int h, const double* X, const double* T,
int batch, int in, int out, int l);
MQL_BOOL DN_PredictBatch(int h, const double* X,
int batch, int in, int l, double* Y);in = seq_len * feature_dimlen(X) = batch * inlen(T) = batch * outlen(Y) = batch * out_dim- Musí platit
in % seq_len == 0
Porušení těchto předpokladů typicky vede k okamžitému selhání API a smysluplné chybové zprávě získatelné přes DN_GetError.
MQL_BOOL DN_Train(int h, int epochs, double target_mse, double lr, double wd);Synchronní režim použijte v případech, kdy:
- provádíte integraci v offline optimalizačních skriptech,
- je přijatelné deterministické blokování,
- preferujete jednoduchý řídicí tok.
MQL_BOOL DN_TrainAsync(int h, int epochs, double target_mse, double lr, double wd);
int DN_GetTrainingStatus(int h);
void DN_GetTrainingResult(int h, double* out_mse, int* out_epochs);
void DN_StopTraining(int h);Asynchronní režim použijte v případech, kdy:
- indikátor/EA musí pokračovat ve zpracování ticků nebo UI událostí,
- dlouhé trénovací běhy vyžadují viditelnost průběhu,
- architektura strategie vyžaduje neblokující chování.
0→ nečinný1→ trénink probíhá2→ dokončeno-1→ chyba
int DN_GetProgressEpoch(int h);
int DN_GetProgressTotalEpochs(int h);
int DN_GetProgressMiniBatch(int h);
int DN_GetProgressTotalMiniBatches(int h);
double DN_GetProgressLR(int h);
double DN_GetProgressMSE(int h);
double DN_GetProgressBestMSE(int h);
double DN_GetProgressGradNorm(int h);
int DN_GetProgressTotalSteps(int h);
double DN_GetProgressPercent(int h);
double DN_GetProgressElapsedSec(int h);
double DN_GetProgressETASec(int h);
MQL_BOOL DN_GetProgressAll(
int h,
int* epoch, int* total_epochs,
int* minibatch, int* total_minibatches,
double* mse, double* best_mse,
double* lr, double* grad_norm,
double* percent, double* elapsed_sec, double* eta_sec
);mse: aktuální stav optimalizace, na úrovni dávek zašuměný.best_mse: stabilizační kotva; konvergenci vyhodnocujte vůči této metrice.grad_norm: včasné varování před explodující/nestabilní optimalizací.eta_sec: provozní odhad pro UI a plánování úloh.
- Dotazujte se z
OnTimer(např. 100–500 ms), nikoli při každém ticku. - Preferujte
DN_GetProgressAllpro snížení režie volání a zvýšení konzistence. - Vzorkovaná telemetrická data uchovávejte pro následnou diagnostiku modelu.
int DN_GetLayerCount(int h);
double DN_GetLayerWeightNorm(int h, int l);
double DN_GetGradNorm(int h);
int DN_SaveState(int h);
MQL_BOOL DN_GetState(int h, char* buf, int max_len);
MQL_BOOL DN_LoadState(int h, const char* buf);
MQL_BOOL DN_SnapshotWeights(int h);
MQL_BOOL DN_RestoreWeights(int h);
void DN_GetError(short* buf, int len);- Politika checkpointů: volání
DN_SaveStatev milnících konvergence a export stavového řetězce externě. - Bezpečné experimentování:
DN_SnapshotWeightspřed rizikovými změnami hyperparametrů; obnovení při detekci divergence. - Řešení selhání: při jakémkoli
MQL_FALSEokamžitě zavolejteDN_GetErrora zaznamenanou zprávu uložte do logu s kontextem (handle, operace, dimenze).
DN_Create- Konfigurace délky sekvence a velikosti mini-dávky
- Sestavení zásobníku vrstev
- Nastavení výstupní dimenze
- Načtení trénovací dávky
- Volitelně vytvoření snímku
- Spuštění
DN_TrainAsync
- Dotaz na stav (
DN_GetTrainingStatus) - Čtení telemetrie (
DN_GetProgressAll) - Aktualizace UI grafu / logů
- Po dokončení získání výsledku (
DN_GetTrainingResult) - Volitelně spuštění inference (
DN_PredictBatch)
- Pokud běží trénink, vyžádání zastavení (
DN_StopTraining) - Uvolnění handle (
DN_Free) - Vynulování / reset lokální proměnné handle
- Windows s Visual Studio schopným otevřít
.sln - NVIDIA CUDA Toolkit kompatibilní s vaší sadou nástrojů kompilátoru
- Cílové prostředí x64
- Otevřete
MQL5GPULibrary_LSTM.sln - Zvolte konfiguraci
Release | x64 - Sestavte řešení
- Zkopírujte výslednou DLL do složky terminálových dat
MQL5\Libraries
- Zkopírujte soubory indikátorů z
MQL5/IndicatorsdoMQL5\Indicators - Zkompilujte v MetaEditoru
- Povolte import DLL v nastavení MT5
- Připojte indikátor ke grafu a ověřte inicializační logy
- Začněte konzervativně (
lr,epochs) a laďte postupně. - Používejte
target_msepro řízené předčasné zastavení. - Aplikujte ořezávání gradientu (
DN_SetGradClip), jakmile zaznamenáte výkyvy normy gradientu.
- Před každým voláním
DN_LoadBatchověřte aritmetiku tvarů. - Udržujte konzistentní strategii normalizace příznaků mezi tréninkem a inferencí.
- Kde je to možné, používejte pevné seedové hodnoty a deterministické předzpracování.
- Každou strategii/model izolujte s unikátním handle.
- Nesdílejte mutabilní buffery napříč asynchronními operacemi modelu.
- Při uvolnění grafu nebo resetu strategie vždy čistě zastavte a uvolněte prostředky.
kernel.cu— implementace CUDA DLL, jádro běhového modulu pro trénink a inferenci.MQL5/Indicators/LSTM_RealTimePredictor.mq5— primární praktický příklad integrace v MT5.MQL5/Indicators/Examples/LSTM_PatternCompletion_Demo.mq5— demonstrační ukázka použití.docs/index.html,docs/app.js,docs/lstm-flow.svg— statické dokumentační podklady.MQL5GPULibrary_LSTM.sln,MQL5GPULibrary_LSTM.vcxproj— orchestrace sestavení.LICENSE.txt— licenční podmínky.
-
Jakékoli API vrátí selhání (
MQL_FALSE) → zavolejteDN_GetError, okamžitě zalogujte, uveďte kontext (handle, operace, dimenze). -
Trénink nekonverguje → snižte
lr, zkontrolujtegrad_norm, povolte/upravte ořezávání, ověřte škálování cílových hodnot. -
Stav zůstává nečinný po spuštění asynchronního tréninku → ověřte pořadí inicializace a úspěšný návratový kód
DN_TrainAsync. -
Výstup predikce je nesprávně formátovaný → znovu zkontrolujte
in,seq_len,out_dima délku alokovaného výstupního bufferu. -
Nestabilita MT5 při dlouhých sezeních → proveďte audit životního cyklu handle a disciplíny deinicializace, snižte frekvenci pollingu.
Tento projekt je distribuován pod licencí MIT. Úplné znění licence naleznete v souboru LICENSE.txt.
