특정 지표에 대한 고유 ID 생성기

 

차트의 지표가 서로 간섭하지 않도록 지표 코드에서 고유한 ID를 얻고 싶습니다.

원래 MathRand() 함수 를 사용했는데 불행히도 예상한 대로 고유한 숫자를 반환하지 않습니다. 아마도 임의의 생성기는 모든 표시기에서 독립적으로 실행되고 동일한 초기 시드를 가져옵니다( GetTickCount 라고 생각합니다). 여러 표시기가 동일한 ID를 갖기 때문입니다.

그래서 현재 표시기 이름과 하위 창에서 ID를 파생합니다. 이 조합은 고유할 수 있습니다. 그럼에도 불구하고 최근에는 터미널 구현이 불안정해서 서브윈도우 번호에 독립적인 ID를 찾고 싶습니다.

어떤 아이디어라도?

 
Ovo :

어떤 아이디어라도?


... MT4를 다시 시작해도 지속되는 ID를 원하는지 여부에 따라 다릅니다. 아마도 MathRand() 를 사용해 본 적이 없을 것입니다.

강력한 고유 ID를 원하는 경우 CoCreateGuid() 호출을 사용하여 운영 체제에 Guid를 요청할 수 있습니다. DLL 가져오기를 포함하지 않는 옵션을 원하면 MT4 전역 변수에서 카운터를 증가시키는 것과 같은 것을 시도할 수 있습니다. 첫 번째 표시기는 값 0을 가져오고 카운터를 1로 증가시킵니다. 두 번째 표시기는 값 1을 얻고 카운터를 2 등으로 늘립니다.

 
Ovo :

차트의 지표가 서로 간섭하지 않도록 지표 코드에서 고유한 ID를 얻고 싶습니다.

원래 MathRand() 함수를 사용했는데 불행히도 예상대로 고유한 숫자를 반환하지 않습니다. 아마도 임의의 생성기는 모든 표시기에서 독립적으로 실행되고 동일한 초기 시드를 가져옵니다( GetTickCount 라고 생각합니다). 여러 표시기가 동일한 ID를 갖기 때문입니다.

그래서 현재 표시기 이름과 하위 창에서 ID를 파생합니다. 이 조합은 고유할 수 있습니다. 그럼에도 불구하고 최근에는 터미널 구현이 불안정해서 서브윈도우 번호에 독립적인 ID를 찾고 싶습니다.

어떤 아이디어라도?


MathRand()를 사용하기 전에 MathSRand() 를 사용하셨습니까?
 
angevoyageur :
MathRand()를 사용하기 전에 MathSRand() 를 사용하셨습니까?

미루는게 문제 아닌가요? MathSRand()를 무엇으로 시드합니까? 차트에 이미 첨부된 표시기로 시작하는 MT4 복사본이 있는 경우 GetTickCount()와 같은 항목에 대해 동일한 값을 얻을 가능성이 매우 높습니다. 여전히 고유 식별자가 필요하지만 이제 MathSRand에 전달할 수 있는 고유 식별자가 필요합니다...
 
gchrmt4 :
미루는게 문제 아닌가요? MathSRand()를 무엇으로 시드합니까? 차트에 이미 첨부된 표시기로 시작하는 MT4 복사본이 있는 경우 GetTickCount()와 같은 항목에 대해 동일한 값을 얻을 가능성이 매우 높습니다. 여전히 고유 식별자가 필요하지만 이제 MathSRand에 전달할 수 있는 고유 식별자가 필요합니다...

지표가 이미 차트에 첨부되어 있는 경우, 어떤 방식으로든 저장된 고유 ID가 이미 있다고 가정합니다. 이 고유 ID의 목적을 이해하지 못하는 것 같습니다.

 
gchrmt4 :


... MT4를 다시 시작해도 지속되는 ID를 원하는지 여부에 따라 다릅니다. 아마도 MathRand()를 사용해 본 적이 없을 것입니다.

강력한 고유 ID를 원하는 경우 CoCreateGuid() 호출을 사용하여 운영 체제에 Guid를 요청할 수 있습니다. DLL 가져오기를 포함하지 않는 옵션을 원하면 MT4 전역 변수에서 카운터를 증가시키는 것과 같은 것을 시도할 수 있습니다. 첫 번째 표시기는 값 0을 가져오고 카운터를 1로 증가시킵니다. 두 번째 표시기는 값 1을 얻고 카운터를 2 등으로 늘립니다.


감사해요. 이해합니다. 예, DLL을 피하고 싶고 쓰레기를 남기고 싶지 않습니다. 저는 주로 전역 설정에 GV 풀을 사용하고 쓰레기 주변은 내 개요를 더 어렵게 만듭니다. 그럼에도 불구하고 레이블 개체 를 사용하여 동일한 트릭을 수행할 수 있습니다.

고유 ID의 목적은 단일 표시기의 여러 인스턴스(서로 다른 하위 창에서)에 의해 생성된 차트의 개체를 구별하는 것입니다. 나는 그것을 직면하는 첫 번째 사람이 아니라고 믿습니다. 객체가 초기에 사라지므로 지속적일 필요는 없습니다.

다른 쉬운 방법은 GetTickCount의 두 번째 값을 기다리는 것입니다... 시간 손실을 수락하면. 또는 DLL 액세스로 시스템 시간 구조를 읽을 수 있습니다. 나노초 분해능이 있기 때문입니다. 하지만 이 간단한 작업을 위한 DLL은 더 이상 없습니다. :)

 
angevoyageur :

지표가 이미 차트에 첨부되어 있는 경우, 어떤 방식으로든 저장된 고유 ID가 이미 있다고 가정합니다. 이 고유 ID의 목적을 이해하지 못하는 것 같습니다.

... 또 다른 시나리오는 동일한 지표의 복사본이 여러 개 있는 템플릿을 적용하는 것입니다.

이를 위해 개인적으로 Windows API로 이동하지만 다음 코드는 MT4 세션당 각 표시기에 고유한 번호를 할당하는 측면에서 작동하는 것 같습니다.

   GlobalVariableTemp ( "IndicatorGV" );
   GlobalVariableTemp ( "IndicatorGVMutex" );
   while (! GlobalVariableSetOnCondition ( "IndicatorGVMutex" , 1 , 0 )) {
       // In theory this can enter a 100%-processor-usage loop
       // while waiting for another indicator to free the mutex
       // but in practice this never happens because indicators
       // all run in the same thread (and the mutex is therefore
       // only a safeguard)
   }
   double myVal = GlobalVariableGet ( "IndicatorGV" );
   GlobalVariableSet ( "IndicatorGV" , myVal + 1 );
   GlobalVariableSet ( "IndicatorGVMutex" , 0 );
 
Ovo :

감사해요. 이해합니다. 예, DLL을 피하고 싶고 쓰레기를 남기고 싶지 않습니다. 저는 주로 전역 설정에 GV 풀을 사용하고 쓰레기 주변은 내 개요를 더 어렵게 만듭니다. 그럼에도 불구하고 레이블 개체를 사용하여 동일한 트릭을 수행할 수 있습니다.

... ID가 xxxx1인 숨겨진 개체 를 만들려고 시도하고 실패하면 xxxx2를 시도한 다음 xxxx3 등을 시도합니까? 그러면 전역 변수가 아닌 차트 개체 측면에서 임시 쓰레기를 생성하지만 다른 개체에 사용할 ID를 제공합니다.
 
gchrmt4 :
... ID가 xxxx1인 숨겨진 개체를 만들려고 시도하고 실패하면 xxxx2를 시도한 다음 xxxx3 등을 시도합니까? 그러면 전역 변수가 아닌 차트 개체 측면에서 임시 쓰레기를 생성하지만 다른 개체에 사용할 ID를 제공합니다.
덜 눈에 띄는 정크를 원하면 독점 액세스로 xxxx1 파일을 열고 xxxx2, xxxx3 등을 열 수 있습니다.
 
Ovo :

차트의 지표가 서로 간섭하지 않도록 지표 코드에서 고유한 ID를 얻고 싶습니다.

원래 MathRand() 함수를 사용했는데 불행히도 예상대로 고유한 숫자를 반환하지 않습니다. 아마도 임의의 생성기는 모든 표시기에서 독립적으로 실행되고 동일한 초기 시드를 가져옵니다( GetTickCount 라고 생각합니다). 여러 표시기가 동일한 ID를 갖기 때문입니다.

그래서 현재 표시기 이름과 하위 창에서 ID를 파생합니다. 이 조합은 고유할 수 있습니다. 그럼에도 불구하고 최근에는 터미널 구현이 불안정해서 서브윈도우 번호에 독립적인 ID를 찾고 싶습니다.

어떤 아이디어라도?


하위 창 번호에 문제가 있습니까?
 
gchrmt4 :
덜 눈에 띄는 정크를 원하면 독점 액세스로 xxxx1 파일을 열고 xxxx2, xxxx3 등을 열 수 있습니다.

예를 들어(ChartID() 대신 WindowHandle() 사용, ChartID()는 여전히 널리 사용되는 MT4 버전에서 신뢰할 수 없기 때문입니다.

 int glbMyIdentifier = - 1 ;
int glbLockHandle = 0 ;
string glbLockFile = "" ;

int OnInit ()
{
   for ( int i = 1 ; i < 10000 ; i++) {
       string strTestLockFile = StringConcatenate ( WindowHandle ( Symbol (), Period ()), "-" , i);
       int lock = FileOpen (strTestLockFile, FILE_WRITE | FILE_BIN );
       if (lock == INVALID_HANDLE ) {
      
      } else {
         glbMyIdentifier = i;
         glbLockHandle = lock;
         glbLockFile = strTestLockFile;
         break ;
      }
   }   
   
   Print ( "Allocated: " , glbMyIdentifier);
   
   return ( INIT_SUCCEEDED );
}

void OnDeinit ( const int reason)
{
   FileClose (glbLockHandle);
   FileDelete (glbLockFile);
}
사유: