Belirli Bir Gösterge için Benzersiz Kimlik Oluşturucu

 

Bir grafikteki göstergelerin birbiriyle karışmamasını sağlamak için gösterge kodunda benzersiz bir kimlik almak istiyorum.

Başlangıçta, maalesef beklediğim gibi benzersiz sayılar döndürmeyen MathRand() işlevini kullandım. Muhtemelen rastgele oluşturucu her göstergede bağımsız olarak çalışır ve aynı başlangıç tohumunu alır (sanırım GetTickCount olabilir), çünkü birden çok gösterge aynı kimliği kazanır.

Bu yüzden şu anda kimliği, hangi kombinasyonun benzersiz olabileceği gösterge adından ve alt penceresinden türetiyorum. Yine de Terminal uygulaması son zamanlarda kararsız, bu yüzden bir alt pencere numarasından bağımsız olan kimliği bulmak istiyorum.

Herhangi bir fikir?

 
Ovo :

Herhangi bir fikir?


... MT4'ün yeniden başlatmalarında kalıcı olan bir kimlik isteyip istemediğinize bağlıdır. Muhtemelen MathRand() kullanmayı denediğiniz verilmemiştir .

Sağlam bir benzersiz kimlik istiyorsanız, işletim sisteminden CoCreateGuid() çağrısını kullanarak bir Kılavuz isteyebilirsiniz. DLL içe aktarmalarını içermeyen bir seçenek istiyorsanız, o zaman bir MT4 global değişkeninde bir sayacı artırmak gibi bir şey deneyebilirsiniz: ilk gösterge 0 değerini alır ve sayacı 1'e çıkarır; ikinci gösterge 1 değerini alır ve sayacı 2'ye çıkarır vb.

 
Ovo :

Bir grafikteki göstergelerin birbiriyle karışmamasını sağlamak için gösterge kodunda benzersiz bir kimlik almak istiyorum.

Başlangıçta, ne yazık ki beklediğim gibi benzersiz sayılar döndürmeyen MathRand() işlevini kullandım. Muhtemelen rastgele oluşturucu her göstergede bağımsız olarak çalışır ve aynı başlangıç tohumunu alır (sanırım GetTickCount olabilir), çünkü birden çok gösterge aynı kimliği kazanır.

Bu yüzden şu anda kimliği, hangi kombinasyonun benzersiz olabileceği gösterge adından ve alt penceresinden türetiyorum. Yine de Terminal uygulaması son zamanlarda kararsız, bu yüzden bir alt pencere numarasından bağımsız olan kimliği bulmak istiyorum.

Herhangi bir fikir?


MathRand()'ı kullanmadan önce MathSRand()'ı kullandınız mı?
 
angevoyageur :
MathRand()'ı kullanmadan önce MathSRand()'ı kullandınız mı?

Bu sorunu ertelemek değil mi? MathSRand()'ı ne ile tohumluyorsunuz? Zaten grafiklere eklenmiş göstergelerle başlayan MT4'ün bir kopyasına sahipseniz, GetTickCount() gibi bir şey için aynı değeri almaları oldukça olasıdır. Yine de benzersiz bir tanımlayıcıya ihtiyacınız var, ancak şimdi MathSRand'a iletebileceğiniz benzersiz bir tanımlayıcıya ihtiyacınız var...
 
gchrmt4 :
Bu sorunu ertelemek değil mi? MathSRand() ile ne tohumlarsınız? Zaten grafiklere eklenmiş göstergelerle başlayan MT4'ün bir kopyasına sahipseniz, GetTickCount() gibi bir şey için aynı değeri almaları oldukça olasıdır. Yine de benzersiz bir tanımlayıcıya ihtiyacınız var, ancak şimdi MathSRand'a iletebileceğiniz benzersiz bir tanımlayıcıya ihtiyacınız var...

Göstergeler grafiklere zaten eklenmişse, şu veya bu şekilde depolanmış benzersiz bir kimlikleri olduğunu varsayalım. Muhtemelen bu benzersiz kimliğin amacını anlamıyorum.

 
gchrmt4 :


... MT4'ün yeniden başlatmalarında kalıcı olan bir kimlik isteyip istemediğinize bağlıdır. Muhtemelen MathRand()'ı kullanmayı denediğiniz verilmemiştir.

Sağlam bir benzersiz kimlik istiyorsanız, işletim sisteminden CoCreateGuid() çağrısını kullanarak bir Kılavuz isteyebilirsiniz. DLL içe aktarmalarını içermeyen bir seçenek istiyorsanız, o zaman bir MT4 global değişkeninde bir sayacı artırmak gibi bir şey deneyebilirsiniz: ilk gösterge 0 değerini alır ve sayacı 1'e çıkarır; ikinci gösterge 1 değerini alır ve sayacı 2'ye çıkarır vb.


Teşekkürler. Anladım. Evet, DLL'den kaçınmak istiyorum ve geride çöp bırakmaktan kaçınmak istiyorum - GV havuzunu çoğunlukla genel ayarlar için kullanıyorum ve etraftaki çöpler genel bakışımı zorlaştırıyor. Yine de aynı numara bir etiket nesnesi ile yapılabilir - bunu düşünebilirim.

Benzersiz kimliğin amacı, tek bir göstergenin (farklı alt pencerelerde) birden çok örneği tarafından oluşturulan bir grafikteki nesneleri ayırt etmektir. Sanırım bununla ilk karşılaşan ben değilim. Nesneler tanımlanınca kaybolduğu için kalıcı olmaları gerekmez.

Diğer kolay yol, eğer zaman kaybını kabul edersem, GetTickCount'un ikinci değerini beklemek olabilir. Veya DLL erişimi ile nanosaniye çözünürlüğe sahip olduğu için sistem zaman yapısını okuyabilirim. Ancak bu basit görev için artık DLL yok :)

 
angevoyageur :

Göstergeler grafiklere zaten eklenmişse, şu veya bu şekilde depolanmış benzersiz bir kimlikleri olduğunu varsayalım. Muhtemelen bu benzersiz kimliğin amacını anlamıyorum.

... Başka bir senaryo, içinde aynı göstergenin birden çok kopyasının bulunduğu bir şablonu uygulamak olabilir.

Bunun için kişisel olarak Windows API'sine giderdim, ancak aşağıdaki kod, MT4 oturumu başına her gösterge için benzersiz bir numara tahsis etme açısından işe yarıyor gibi görünüyor:

   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 :

Teşekkürler. Anladım. Evet, DLL'den kaçınmak istiyorum ve geride çöp bırakmaktan kaçınmak istiyorum - GV havuzunu çoğunlukla genel ayarlar için kullanıyorum ve etraftaki çöpler genel bakışımı zorlaştırıyor. Yine de aynı numara bir etiket nesnesi ile yapılabilir - bunu düşünebilirim.

... xxxx1 kimliğine sahip gizli bir nesne oluşturmayı deneyin ve başarısız olan xxxx2'yi ve ardından xxxx3'ü deneyin mi? Bu size diğer nesneler için kullanılacak kimliği verir - ancak genel değişkenler yerine grafik nesneleri açısından geçici çöp oluşturur.
 
gchrmt4 :
... xxxx1 kimliğine sahip gizli bir nesne oluşturmayı deneyin ve başarısız olan xxxx2'yi ve ardından xxxx3'ü deneyin mi? Bu size diğer nesneler için kullanılacak kimliği verir - ancak genel değişkenler yerine grafik nesneleri açısından geçici çöp oluşturur.
Daha az görünür önemsiz istiyorsanız, xxxx1 dosyasını özel erişimle ve ardından xxxx2 ve ardından xxxx3 vb. ile açmayı deneyebilirsiniz.
 
Ovo :

Bir grafikteki göstergelerin birbiriyle karışmamasını sağlamak için gösterge kodunda benzersiz bir kimlik almak istiyorum.

Başlangıçta, ne yazık ki beklediğim gibi benzersiz sayılar döndürmeyen MathRand() işlevini kullandım. Muhtemelen rastgele oluşturucu her göstergede bağımsız olarak çalışır ve aynı başlangıç tohumunu alır (sanırım GetTickCount olabilir), çünkü birden çok gösterge aynı kimliği kazanır.

Bu yüzden şu anda kimliği, hangi kombinasyonun benzersiz olabileceği gösterge adından ve alt penceresinden türetiyorum. Yine de Terminal uygulaması son zamanlarda kararsız, bu yüzden bir alt pencere numarasından bağımsız olan kimliği bulmak istiyorum.

Herhangi bir fikir?


Alt pencere numarasıyla ilgili sorun nedir?
 
gchrmt4 :
Daha az görünür önemsiz istiyorsanız, xxxx1 dosyasını özel erişimle ve ardından xxxx2 ve ardından xxxx3 vb. ile açmayı deneyebilirsiniz.

Örneğin (ChartID() yerine WindowHandle() kullanılması, çünkü ChartID() hala yaygın olarak kullanılan MT4 sürümlerinde güvenilmezdir):

 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);
}
Neden: