Verrou atomique entre EAs (SetOnCondition)
GlobalVariableSetOnCondition est une opération test-and-set atomique : un seul des EAs concurrents obtient le verrou, les autres échouent proprement — le mutex du pauvre en MQL5.
Cas d'usage
Empêcher deux instances (deux charts du même symbole) d'ouvrir le même trade en double.
Prérequis
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
}Résultat
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