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