Intégrer License Guard dans vos robots MQL5
License Guard protège vos Expert Advisors en vérifiant automatiquement leurs licences auprès de secure.fullmargin.net et en liant chaque robot à un compte MT5. Suivez les étapes ci-dessous pour l’intégrer rapidement.
Pourquoi utiliser FullMargin License Guard ?
Le module FullMargin License Guard fournit un bloc de sécurité standard pour vos robots MQL5 :
-
Validation de la licence via l’API
https://secure.fullmargin.net/scripts/validate.php. - Stockage local de la clé de licence dans un fichier lié au robot.
- Vérification de l’ID de compte MT5 autorisé.
- Re-vérification périodique de la licence via
OnTimer. - Arrêt automatique du robot en cas de licence invalide ou expirée.
L’exemple ci-dessous utilise un robot nommé Systest.
Pour votre propre EA, changez simplement ROBOT_NAME et gardez le même module.
💡 Astuce : cliquez sur le bouton « Copier » en haut à droite de chaque bloc de code pour le coller directement dans MetaEditor (MQL5).
Avant de commencer
En tant que développeur, vous n’avez pas à gérer la partie licences ou abonnements. FullMargin s’occupe de tout. Votre rôle est simplement d’intégrer le module de sécurité et de soumettre votre robot dans l’espace Boutique FullMargin.
-
1
Intégrer le module FullMargin License Guard
Copiez les blocs de code License Guard dans votre EA MQL5 (Bloc A, OnInit, OnDeinit, OnTick) en suivant les sections de cette page.
-
2
Compiler et tester le robot dans MetaEditor (MQL5)
Vérifiez que votre fichier
.mq5compile sans erreur et que le robot fonctionne normalement sur MetaTrader 5. -
3
Soumettre votre EA dans l’espace Boutique FullMargin
Envoyez votre fichier compilé (
.ex5) et les informations du robot dans la Boutique FullMargin. FullMargin se charge de créer les licences, d’associer les comptes MT5 et de gérer les offres.
Ajouter le module de licence
Copiez le bloc suivant en haut du fichier de votre EA. Il gère la licence, le fichier local, la requête HTTP et le timer.
#include <JAson.mqh> // Optionnel : parsing JSON
#define ROBOT_NAME "Systest" // 🔒 Nom du robot verrouillé
long allowedAccountId = 0; // ID du compte autorisé
string licenseKey = "";
string url = "https://secure.fullmargin.net/scripts/validate.php";
string headers = "Content-Type: application/x-www-form-urlencoded\r\n";
int LICENSE_CHECK_INTERVAL = 1800; // 30 minutes
// Input à déclarer dans votre EA
input string licenseKeyInput = ""; // Saisissez votre clé de licence ici
// --------- Fichiers licence ---------
string GetLicenseFileName()
{
string eaName = MQLInfoString(MQL_PROGRAM_NAME);
return eaName + "_license.txt";
}
bool SaveLicenseToFile(string license)
{
string filename = GetLicenseFileName();
int fileHandle = FileOpen(filename, FILE_WRITE | FILE_TXT);
if(fileHandle == INVALID_HANDLE)
{
Print("Erreur d'écriture dans le fichier ", filename);
return false;
}
FileWrite(fileHandle, license);
FileClose(fileHandle);
return true;
}
string LoadLicenseFromFile()
{
string filename = GetLicenseFileName();
int fileHandle = FileOpen(filename, FILE_READ | FILE_TXT);
if(fileHandle == INVALID_HANDLE)
{
Print("Fichier ", filename, " introuvable.");
return "";
}
string savedLicense = FileReadString(fileHandle);
FileClose(fileHandle);
return savedLicense;
}
// --------- Vérifier la licence auprès du serveur ---------
bool CheckLicense()
{
if(licenseKey == "")
{
Print("Aucune clé de licence définie.");
return false;
}
string postData = "licenseKey=" + licenseKey + "&robotName=" + ROBOT_NAME;
char data[];
StringToCharArray(postData, data);
char response[];
string responseHeaders;
int timeout = 5000;
int res = WebRequest("POST", url, headers, timeout, data, response, responseHeaders);
if(res == 200)
{
string responseBody = CharArrayToString(response);
Print("Réponse du serveur : ", responseBody);
int validIndex = StringFind(responseBody, "\"valid\":");
if(validIndex != -1)
{
bool isValid = (StringSubstr(responseBody, validIndex + 8, 4) == "true");
if(isValid)
{
Print("Licence valide.");
return true;
}
else
{
Print("Licence invalide ou expirée.");
}
}
else
{
Print("Réponse JSON invalide : champ \"valid\" introuvable.");
}
}
else
{
Print("Erreur de connexion au serveur. Code d'erreur : ", res);
}
return false;
}
// --------- Timer de vérification ---------
void StartLicenseCheckTimer()
{
if(LICENSE_CHECK_INTERVAL > 0)
EventSetTimer(LICENSE_CHECK_INTERVAL);
}
void StopLicenseCheckTimer()
{
EventKillTimer();
}
// OnTimer est appelé automatiquement par MetaTrader
void OnTimer()
{
if(!CheckLicense())
{
Print("Licence invalide lors de la vérification périodique. Le robot sera arrêté.");
ExpertRemove();
}
}
Intégrer la sécurité dans OnInit()
Votre fonction OnInit() charge la licence, l’enregistre si besoin, la vérifie,
et lie le robot au compte MT5 courant.
int OnInit()
{
Print("Initialisation de la sécurité FullMargin pour ", ROBOT_NAME);
// 1. Tenter de charger une licence existante
licenseKey = LoadLicenseFromFile();
// 2. Si pas de licence enregistrée, utiliser celle entrée par l'utilisateur
if(licenseKey == "" && licenseKeyInput != "")
{
licenseKey = licenseKeyInput;
SaveLicenseToFile(licenseKey);
Print("Clé licence enregistrée localement.");
}
// 3. Vérifier la licence
if(!CheckLicense())
{
Print("Licence invalide. Le robot sera arrêté.");
return(INIT_FAILED);
}
// 4. Vérification de l'ID du compte
long currentAccountId = AccountInfoInteger(ACCOUNT_LOGIN);
if(allowedAccountId == 0)
{
allowedAccountId = currentAccountId;
Print("Authorized account registered : ", allowedAccountId);
}
else if(allowedAccountId != currentAccountId)
{
Print("Error: This account is not authorized to use this robot.");
return(INIT_FAILED);
}
// 5. Démarrer le timer pour vérifier la licence périodiquement
StartLicenseCheckTimer();
return(INIT_SUCCEEDED);
}
Arrêter le timer dans OnDeinit()
Au moment où le robot est retiré du graphique ou rechargé, arrêtez le timer :
void OnDeinit(const int reason)
{
// Arrêter le timer lorsque le robot est désinitialisé
StopLicenseCheckTimer();
Print("Sécurité FullMargin désinitialisée. Reason = ", reason);
}
Option : sécurité supplémentaire dans OnTick()
Pour plus de sécurité, vous pouvez vérifier la licence au début de OnTick().
void OnTick()
{
// Protection simple : si la licence n'est plus valide, on ne trade pas
if(!CheckLicense())
{
Comment("🚫 ", ROBOT_NAME, " — Licence invalide ou expirée.\n",
"Veuillez contacter le support FullMargin.");
return;
}
// --- Logique normale de votre robot ici ---
// ...
}
Structure de la réponse de l’API
L’API FullMargin renvoie une réponse JSON. Le module utilise principalement le champ
valid.
{
"valid": true,
"plan": "PRO",
"expires_at": "2025-12-31",
"account": 12345678,
"message": "License valid for this account."
}
Codes d’erreur courants
| Cas | Symptômes | Action recommandée |
|---|---|---|
| URL non autorisée | WebRequest échoue, erreurs réseau récurrentes | Ajouter l’URL dans les “requêtes Web” de MetaTrader |
| Licence vide | licenseKey == "" dans les logs |
Saisir la clé dans licenseKeyInput ou vérifier le fichier local
|
| Licence expirée / invalide | Message “Licence invalide ou expirée.” | Vérifier l’abonnement et le compte lié dans votre espace FullMargin |
| Compte non autorisé | “This account is not authorized to use this robot.” | Utiliser le compte enregistré ou demander une mise à jour de licence |