Sécurité & licences • FullMargin

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.

MQL5 Protection compte & licence
Vue d’ensemble

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).

PRÉREQUIS

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 .mq5 compile 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.

Étape 1

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.

Bloc A – Module FullMargin License Guard
MQL5
#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();
   }
}
Étape 2

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.

Bloc B – OnInit sécurisé
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);
}
Étape 3

Arrêter le timer dans OnDeinit()

Au moment où le robot est retiré du graphique ou rechargé, arrêtez le timer :

Bloc C – OnDeinit
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);
}
Étape 4

Option : sécurité supplémentaire dans OnTick()

Pour plus de sécurité, vous pouvez vérifier la licence au début de OnTick().

Bloc D – OnTick protégé
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 ---
   // ...
}
Réponse API

Structure de la réponse de l’API

L’API FullMargin renvoie une réponse JSON. Le module utilise principalement le champ valid.

Exemple de réponse
{
  "valid": true,
  "plan": "PRO",
  "expires_at": "2025-12-31",
  "account": 12345678,
  "message": "License valid for this account."
}
Codes d’erreur

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