MQL5

Atomic lock between EAs (SetOnCondition)

GlobalVariableSetOnCondition is an atomic test-and-set operation: only one of the competing EAs gets the lock, the others fail cleanly — the poor man's mutex in MQL5.

Prerequisites

MetaTrader 5, MQL5

MQL5
#define LOCK_NAME "MYEA_TradeLock"

bool AcquireLock(int timeoutMs = 1000)
{
   if(!GlobalVariableCheck(LOCK_NAME))
      GlobalVariableTemp(LOCK_NAME); // créée à 0, disparaît à la fermeture

   uint deadline = GetTickCount() + (uint)timeoutMs;
   while(GetTickCount() < deadline)
   {
      // Atomique : passe 0 -> 1 seulement si la valeur vaut encore 0
      if(GlobalVariableSetOnCondition(LOCK_NAME, 1.0, 0.0))
         return true;
      Sleep(20);
   }
   return false; // un autre EA détient le verrou
}

void ReleaseLock() { GlobalVariableSet(LOCK_NAME, 0.0); }

// Utilisation :
if(AcquireLock())
{
   TryOpenTrade();
   ReleaseLock(); // TOUJOURS relâcher, même en cas d'échec du trade
}

Result

2026.06.10 14:30:00.108  LockDemo (EURUSD,M15)  [chart A] verrou MYEA_TradeLock acquis (0 -> 1, atomique)
2026.06.10 14:30:00.110  LockDemo (EURUSD,H1)   [chart B] SetOnCondition refusé : verrou occupé, attente 20 ms...
2026.06.10 14:30:00.295  LockDemo (EURUSD,M15)  [chart A] trade envoyé, verrou relâché (1 -> 0)
2026.06.10 14:30:00.315  LockDemo (EURUSD,H1)   [chart B] verrou acquis après 205 ms — aucun trade en double
MutexAtomiqueGlobalVariablesConcurrence

Related snippets

Back to the Data Lab