GlobalVariableSetOnCondition

현재 값이 세 번째 매개변수 check_value와 같을 경우 기존 글로벌 변수의 새 값을 설정합니다. 글로벌 변수가 없으면 함수는 ERR_GLOBALVARIABLE_NOT_FOUND (4501) 오류를 생성하고 false를 반환합니다.

bool  GlobalVariableSetOnCondition(
   string  name,            // 글로벌 변수 이름
   double  value,           // 조건이 true인 경우 변수에 대한 새 값
   double  check_value      // 값 조건 조회
   );

매개변수

이름

[in]  글로벌 변수 이름.

[in]  새 값.

check_value

[in]   글로벌 변수의 현재 값을 확인하는 값.

값 반환

성공하면 true를 반환하고, 그렇지 않으면 false를 반환합니다. 오류에 대한 자세한 내용은 GetLastError()를 호출하십시오. 글로벌 변수의 현재 값이 check_value와 다르면 함수는 false를 반환합니다.

주의

함수는 글로벌 변수에 대한 아토믹 액세스를 제공하므로 하나의 클라이언트 터미널에서 동시에 작동하는 엑스퍼트 어드바이저의 상호 작용에 따라 뮤텍스를 제공하는 데 사용할 수 있습니다.

 

예:

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#property description"GlobalVariableSetOnCondition 함수의 기능을 테스트하려면"
#property description"여러 차트에서 동시에 EA를 실행해야 합니다."
 
#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   lvalue;             // 롱 값
   double dvalue;             // 더블 값
  };
  
//--- EA 전역 변수
long  ExtExpMagic;            // EA ID
ulong ExtStart;               // "calculations" 시작 시점
 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 0 값이 지정된 경우 EA ID에 차트 ID를 할당합니다.
   ExtExpMagic=(InpExpMagic==0 ? ChartID() : InpExpMagic);
 
//--- 뮤텍스를 생성하고 오류가 있으면 초기화 오류를 반환합니다.
   if(!MutexCreate())
      return(INIT_FAILED);
      
//--- 초기화 성공
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
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를 실행한 결과EUR/USD 그리고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);
  }
//+------------------------------------------------------------------+
//| Create mutex, set it to the locked state                         |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//| Release mutex                                                    |
//+------------------------------------------------------------------+
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(MUTEXmagic.dvalue0))
     {
      PrintFormat("%s: GlobalVariableSetOnCondition() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| Return mutex value                                               |
//+------------------------------------------------------------------+
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);
  }