GlobalVariableSetOnCondition

如果当前值等于第三参量check_value,设置现有全局变量的新值。如果没有全局变量,函数将生成错误ERR_GLOBALVARIABLE_NOT_FOUND (4501)并且返回false。

bool  GlobalVariableSetOnCondition(
   string  name,            // 全局变量名称
   double  value,           // 条件是true下的变量新值
   double  check_value      // 检测值的状态
   );

参量

name

[in]  全局变量名称。

value

[in]  新值。

check_value

[in]   检测当前全局变量值。

返回值

如果成功,函数返回真值,否则返回错误值。更多关于 error 的细节,调用 GetLastError()。如果当前全局变量值不同于check_value,函数返回false。

注释

函数将为全局变量提供自动通道,所以它可以提供一个信号量在同一个客户终端内同时被几个EA调用。

 

示例:

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#property description   "To test the functionality of the GlobalVariableSetOnCondition function,"
#property description   "it is necessary to run the EA on several charts simultaneously."
 
#define   EXP_NAME      StringSubstr(__FILE__0StringLen(__FILE__)-4)   // 程序名称
#define   MUTEX         EXP_NAME+"_MUTEX"                                  // 互斥全局变量名
#define   DELAY         5000                                               // EA 仿真的毫秒数
 
input long  InpExpMagic =  0; /* Expert magic number  */ // EA ID. 如果为 0,则使用图表 ID
 
union LongDouble              // 从 double 中写入和检索 long 值的联合
  {
   long   lvalue;             // long 型值
   double dvalue;             // double 型值
  };
  
//--- EA 全局变量
long  ExtExpMagic;            // EA ID
ulong ExtStart;               // EA “计算”开始的那一刻
 
//+------------------------------------------------------------------+
//| EA 初始化函数                                                      |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 如果指定了零值,则将图表 ID分配给 EA ID
   ExtExpMagic=(InpExpMagic==0 ? ChartID() : InpExpMagic);
 
//--- 创建互斥体,如果有错误,返回初始化错误
   if(!MutexCreate())
      return(INIT_FAILED);
      
//--- 初始化成功
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| EA 去初始化函数                                                    |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- 如果互斥体被 EA 捕获,则释放互斥体
   if(MutexGetExpertID()==ExtExpMagic)
      MutexRelease();
      
//--- 清理干净
   Comment("");
  }
//+------------------------------------------------------------------+
//| EA 分时报价处理函数                                                |
//+------------------------------------------------------------------+
void OnTick()
  {
//---如果没有互斥体,则创建它;如果有错误,退出直到下一个分时报价
   if(!GlobalVariableCheck(MUTEX) && !MutexCreate())
      return;
      
//--- 获取终端全局变量中设置的 EA ID
   long magic=MutexGetExpertID();
 
//---如果 ID 属于此 EA,则模拟其工作
   if(magic==ExtExpMagic)
     {
      //--- 如果 EA “工作”完成,释放互斥体
      if(EAProgressHandler(ExtStart))
         MutexRelease();
      return;
     }
//--- 被另一个 EA 捕获的互斥体
   else
     {
      //--- 如果互斥体已经释放
      if(magic==0)
        {
         //--- 占用互斥并记住工作访问时间
         if(MutexOccupy())
           {
            PrintFormat("%s: Mutex is occupied by %s",Symbol(), ExpertIDDescription());
            ExtStart=GetTickCount64();
           }
         return;
        }
      //--- 互斥体仍被另一个 EA 占用 - 禁止工作
      else
         return;
     }
   /*
   两个相同 EA 分别运行于 EURUSD 和 AUDUSD 图表的结果:
   EURUSDMutex is occupied by Expert 133829812107724569
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 end
   EURUSDMutex is occupied by Expert 133829812107724569
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 end
   AUDUSDMutex is occupied by Expert 128968168951083984
   AUDUSDExpert 128968168951083984 next tick
   AUDUSDExpert 128968168951083984 next tick
   AUDUSDExpert 128968168951083984 next tick
   AUDUSDExpert 128968168951083984 next tick
   AUDUSDExpert 128968168951083984 next tick
   AUDUSDExpert 128968168951083984 next tick
   AUDUSDExpert 128968168951083984 next tick
   AUDUSDExpert 128968168951083984 end
   AUDUSDMutex is occupied by Expert 128968168951083984
   AUDUSDExpert 128968168951083984 next tick
   AUDUSDExpert 128968168951083984 next tick
   AUDUSDExpert 128968168951083984 next tick
   AUDUSDExpert 128968168951083984 next tick
   AUDUSDExpert 128968168951083984 next tick
   AUDUSDExpert 128968168951083984 end
   EURUSDMutex is occupied by Expert 133829812107724569
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 end
   EURUSDMutex is occupied by Expert 133829812107724569
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 end
   AUDUSDMutex is occupied by Expert 128968168951083984
   AUDUSDExpert 128968168951083984 next tick
   AUDUSDExpert 128968168951083984 next tick
   AUDUSDExpert 128968168951083984 next tick
   AUDUSDExpert 128968168951083984 next tick
   AUDUSDExpert 128968168951083984 next tick
   AUDUSDExpert 128968168951083984 next tick
   AUDUSDExpert 128968168951083984 next tick
   AUDUSDExpert 128968168951083984 end
   EURUSDMutex is occupied by Expert 133829812107724569
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 next tick
   EURUSDExpert 133829812107724569 end
   
  我们可以看到,第一个占用互斥体的 EA 是分时报价首先到达的 EA
  在工作循环完成后,如果分时报价再次出现在这里,
  同一 EA 会再次占用互斥体
   */
  }
//+------------------------------------------------------------------+
//| EA 操作处理模拟器                                                  |
//+------------------------------------------------------------------+
bool EAProgressHandler(ulong start)
  {
   //--- 如果自处理程序开始工作以来已经过了指定的时间
   if(GetTickCount64()-start>=DELAY)
     {
      //--- 在日志中报告处理程序的完成情况,
      //--- 为处理程序设置新的开始时间并返回“true”
      PrintFormat("%s: %s end"Symbol(), ExpertIDDescription());
      start=GetTickCount64();
      return(true);
     }
   //--- EA 计算模拟器的操作时间尚未完成 -
   //--- 在日志中报告下一个分时报价
   else
     {
      PrintFormat("%s: %s next tick"Symbol(), ExpertIDDescription());
     }
//--- 工作时间尚未结束 - 返回“false”
   return(false);
  }
//+------------------------------------------------------------------+
//| 创建互斥体,将其设置为锁定状态                                        |
//+------------------------------------------------------------------+
bool MutexCreate(void)
  {
   if(!GlobalVariableCheck(MUTEX))
     {
      LongDouble magic={};
      magic.lvalue=ExtExpMagic;
      ResetLastError();
      if(!GlobalVariableSet(MUTEXmagic.dvalue))
        {
         PrintFormat("%s: GlobalVariableSet() failed. Error %d",__FUNCTION__GetLastError());
         return(false);
        }
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| 捕获互斥体                                                         |
//+------------------------------------------------------------------+
bool MutexOccupy(void)
  {
   if(!GlobalVariableCheck(MUTEX))
     {
      PrintFormat("%s: Error! Mutex is missing. First create it with MutexCreate()",__FUNCTION__);
      return(false);
     }
   LongDouble magic={};
   magic.lvalue=ExtExpMagic;
   ResetLastError();
   if(!GlobalVariableSetOnCondition(MUTEXmagic.dvalue0))
     {
      PrintFormat("%s: GlobalVariableSetOnCondition() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| 释放互斥体 |
//+------------------------------------------------------------------+
bool MutexRelease(void)
  {
   if(!GlobalVariableCheck(MUTEX))
     {
      PrintFormat("%s: Error! Mutex is missing. First create it with MutexCreate()",__FUNCTION__);
      return(false);
     }
   LongDouble magic={};
   magic.lvalue=ExtExpMagic;
   ResetLastError();
   if(!GlobalVariableSetOnCondition(MUTEX0magic.dvalue))
     {
      PrintFormat("%s: GlobalVariableSetOnCondition() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| 返回互斥值                                                        |
//+------------------------------------------------------------------+
long MutexGetExpertID(void)
  {
   LongDouble magic={};
   ResetLastError();
   if(!GlobalVariableGet(MUTEXmagic.dvalue))
     {
      PrintFormat("%s: GlobalVariableGet() failed. Error %d",__FUNCTION__GetLastError());
      return(WRONG_VALUE);
     }
   return(magic.lvalue);
  }
//+------------------------------------------------------------------+
//| 以字符串形式返回 EA ID                                             |
//+------------------------------------------------------------------+
string ExpertIDDescription(void)
  {
   return("Expert "+(string)ExtExpMagic);
  }