Otomatik Sihirli Numara - sayfa 2

 
jjc :

Burada bir şey eksik. Örneğin USDJPY H1 için iki grafik açarsam ve her birine EA'nın bir örneğini eklersem, her ikisi de sihirli sayı 9999033'ü kullanır.

Evet, bu seçenek yerleşik değildi çünkü onu hiç kullanmadım. İki girintili çizelgeyi (görebildiğim) ayırt etmenin tek yolu, pencere tutamağında hash yapmak olacaktır ...

ancak daha sonra yeniden başlatma ve grafik kapatma üzerindeki kalıcılığı kaybedersiniz ve bu nedenle sonuç olarak yetim siparişler oluşturulabilir veya oluşturulacaktır.

 
BarrowBoy :

Öyleyse MT terminal uygulaması bir 'kapsayıcı' mı - <her şey> için tek bir hWnd ile mi?

Evet. Oldukça tipik bir MDI uygulamasıdır. Araç çubukları, bölmeler ve MDI istemci alanı gibi şeyleri içeren üst düzey bir pencere vardır. İkincisi, daha sonra her grafiği içerir ve her grafik aslında iki pencereden oluşur: içinde çizim alanı olan bir kap. Bunların her birinin kendi hWnd tutamacı vardır. WindowHandle() işlevi çizim alanının tanıtıcısını döndürür ve bu nedenle GetParent() API çağrısını üç kez kullanmak size en üst düzey MT4 penceresinin hWnd'sini verir.

 

fwiw, aşağıda kullanıyorum ve hiçbir zaman kopyalarım olmadı. 10 adede kadar [her tür] çizelgede aynı EA.

Hash işlevine verilen aşırı derecede gereksiz önemsiz gerçeklere bir cevabım yok. Mutfak lavabosu dahil her şeyi ittim. yani, ben matematik insanı değilim ..., sadece tekrarlanmayana kadar çekiç ve yontuldu - 10 grafik profili ile terminal başlangıcında bile hepsi aynı EA ...

Açıkçası, daha iyi ve daha açıklanabilir/mantıksal bir yönteme sahip olmak isterdim... o yüzden onu parçalara ayırmaya başlayın :O)

#define EMPTYSTRING     ""
#define EAIDMIN         1
#define EAIDMAX         21473


  //+------------------------------------------------------------------+
//
int iMakeHash (string s1, string s2=EMPTYSTRING, string s3=EMPTYSTRING, string s4=EMPTYSTRING, string s5=EMPTYSTRING
              ,string s6=EMPTYSTRING, string s7=EMPTYSTRING, string s8=EMPTYSTRING, string s9=EMPTYSTRING, string s10=EMPTYSTRING)
{
  /*
  Produce 32bit string hash code from  a string composed of up to TEN concatenated input strings.
  WebRef: http://www.cse.yorku.ca/~oz/hash.html
  KeyWrd: "djb2"
  FirstParaOnPage:
  "  Hash Functions
    A comprehensive collection of hash functions, a hash visualiser and some test results [see Mckenzie
    et al. Selecting a Hashing Algorithm, SP&E 20(2):209-224, Feb 1990] will be available someday. If
    you just want to have a good hash function, and cannot wait, djb2 is one of the best string hash
    functions i know. it has excellent distribution and speed on many different sets of keys and table
    sizes. you are not likely to do better with one of the "well known" functions such as PJW, K&R[1],
    etc. Also see tpop pp. 126 for graphing hash functions.
  "

  NOTES:
  0. WARNING - mql4 strings maxlen=255 so... unless code changed to deal with up to 10 string parameters
     the total length of contactenated string must be <=255
  1. C source uses "unsigned [char|long]", not in MQL4 syntax
  //
  Downside?
    original code uses UNSIGNED - MQL4 not support this, presume could use type double and then cast back to type int.
  */
  string s = StringConcatenate(s1,s2,s3,s4,s5,s6,s7,s8,s9,s10);
  int iHash = 5381;
  int iLast = StringLen(s)-1;
  int iPos=0;

  while( iPos <= iLast )    //while (c = *str++)  [ consume str bytes until EOS hit {isn't C concise!} ]
  {
    //original C code: hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
    iHash = ((iHash << 5) + iHash) + StringGetChar(s,iPos);    //StringGetChar() returns int
    iPos++;
  }
  return(MathAbs(iHash));
  
}//iMakeHash()




  //+------------------------------------------------------------------+
//
int iMakeExpertId ()
{
  int i1a,i2a,i1b,i2b;
  int iExpertId = EAIDMAX+1;
  while(iExpertId<EAIDMIN || iExpertId>EAIDMAX)
  {
    i1a=TimeLocal(); i2a=GetTickCount();
    Sleep(500);
    i1b=TimeLocal(); i2b=GetTickCount();
    MathSrand(iMakeHash(Symbol()
                        ,DoubleToStr(Period(),Digits)
                        ,DoubleToStr(i2a*WindowBarsPerChart()/Period(),Digits-1)
                        ,DoubleToStr(WindowTimeOnDropped()/i2b,Digits+1)
                        ,StringConcatenate(i2a/Period()
                                          ,Symbol()
                                          ,Period()
                                          ,i1a
                                          ,i2b*WindowBarsPerChart()/Period()
                                          ,i1b/WindowBarsPerChart()
                                          ,WindowTimeOnDropped()
                                          )
                        )
              );

    iExpertId = MathRand();  //here, on 2nd rand call, is even btr (tests seem to say this...)
  }

  return(iExpertId);

}//iMakeExpertId()

daaaaamn... these results are when had diff EAIDMAX! Anyway, just can't get the staff these days 0 lol
  /*test extract:
12:06:22 "EXPERT ID = "19736
12:06:21 "EXPERT ID = "16236
12:06:20 "EXPERT ID = "4633
12:06:19 "EXPERT ID = "26753
12:06:18 "EXPERT ID = "28286
12:06:16 "EXPERT ID = "23335
12:06:15 "EXPERT ID = "4036
12:06:14 "EXPERT ID = "12879
12:06:13 "EXPERT ID = "8095

12:06:08 "EXPERT ID = "7940
12:06:07 "EXPERT ID = "10700
12:06:06 "EXPERT ID = "24889
12:06:05 "EXPERT ID = "16055
12:06:04 "EXPERT ID = "12774
12:06:03 "EXPERT ID = "10058
12:06:02 "EXPERT ID = "29346
12:06:01 "EXPERT ID = "14624
12:06:00 "EXPERT ID = "18432
*/
 
fbj :

fwiw, aşağıda kullanıyorum ve hiçbir zaman kopyalarım olmadı. 10 adede kadar [her tür] çizelgede aynı EA.

Karma işlevine verilen aşırı derecede gereksiz önemsiz gerçeklere bir cevabım yok. Mutfak lavabosu dahil her şeyi ittim. yani, ben matematik insanı değilim ..., sadece tekrarlanmayana kadar çekiç ve yontuldu - 10 grafik profili ile terminal başlangıcında bile hepsi aynı EA ...

Açıkçası, daha iyi ve daha açıklanabilir/mantıksal bir yönteme sahip olmak isterdim... o yüzden onu parçalara ayırmaya başlayın :O)

Beğendim. Özellikle iyi ol' djb2 hash.

 

Çok etkileyici şeyler arkadaşlar :)

MDI kapsayıcıları beni geri alıyor <iç çekiş>

Hala söylüyorum, IMHO, Magic Numbers rastgele uygulanamayacak kadar önemli !

Eminim CB, yeniden başlatmada öngörülebilir kurtarmanın sağlam bir sistemde son derece önemli bir unsur olduğunu onaylayacaktır.

FWIW

-BB-

 

Bu kodla, bir EA, platform kapanırsa kendi siparişlerini tanıyabilir. Global Değişkenleri kullanır, bu nedenle EA'yı PC'ye "bağışık" hale getirmek istiyorsanız, Global Değişkenler yerine dosyaları kullanmak üzere yeniden yazılabilir. Ben de tam zamanında bir pozisyon açan ve bir sonraki çubukta kapatan bir örnek ekledim, uzmanı 1M zaman diliminde yükleyebilir, metatrader'ı kapatıp tekrar açabilirsiniz, bir sonraki çubuğun nasıl olduğunu görmek için bekleyin. EA siparişini kapatır. Çoklu grafiklerle kanıtlanmadı, ne de çoklu siparişlerle kandırıldı, ama bunun hakkında ne düşünüyorsunuz?

 int MagicNumber ;
 
int init ( )
{
   // Unique sting id.    
   string id = WindowExpertName ( ) + Symbol ( ) + Period ( ) ;
    
    
   // If there isn't already a Global Variable with the id in wich search for the MagicNumber create it  
   if ( ! GlobalVariableCheck ( id ) )
   {
      MagicNumber = WindowHandle ( Symbol ( ) , 0 ) ;    
       GlobalVariableSet ( id , MagicNumber ) ;
   }
   else // Just get the MagicNumber for the unique id
   {
      MagicNumber = GlobalVariableGet ( id ) ;
   }
      
}
Dosyalar:
 
jjc wrote >>

Beğendim. Özellikle iyi ol' djb2 hash.

teşekkürler - ama makeexpertid'de bu kadar bilgisiz bir kodlama parçası hakkında gerçekten utangaç hissediyorum ...

Henüz erken ama belki biri kusuru/kusurları fark edebilir...

 
BarrowBoy wrote >>

Çok etkileyici şeyler arkadaşlar :)

MDI kapsayıcıları beni geri alıyor <iç çekiş>

Hala söylüyorum, IMHO, Magic Numbers rastgele uygulanamayacak kadar önemli!

Eminim CB, yeniden başlatmada öngörülebilir kurtarmanın sağlam bir sistemde son derece önemli bir unsur olduğunu onaylayacaktır.


FWIW

-BB-

Hala söylüyorum, IMHO, Magic Numbers rastgele uygulanamayacak kadar önemli!

kesinlikle BB, vip verileri. Bir EA'nın birden çok örneğinin kullanabileceği benzersiz bir veriyi keşfetmeye çalışmak için çok fazla zaman harcadım. Bu veri, açılan tüm dosyaların kurtarma/yeniden başlatma sırasında eşlenebilecek şekilde tekrarlanabilir olması gerekiyordu. Benzersiz bir dosya adını 'bir şekilde' açmak ve yeniden başlatma sırasında sihirli bir şekilde yeniden açmak için grafik EA örnekleri başına herhangi bir sayıda aynı ccy+ olasılığına izin vermek istedim...


Pencere tanıtıcı verileri bu 'faktör X' olabilir mi?

 
fbj :

kesinlikle BB, vip verileri. Bir EA'nın birden çok örneğinin kullanabileceği benzersiz bir veriyi keşfetmeye çalışmak için çok fazla zaman harcadım. Bu veri, açılan tüm dosyaların kurtarma/yeniden başlatma sırasında eşlenebilecek şekilde tekrarlanabilir olması gerekiyordu. Benzersiz bir dosya adını 'bir şekilde' açmak ve yeniden başlatma sırasında sihirli bir şekilde yeniden açmak için grafik EA örnekleri başına herhangi bir sayıda aynı ccy+ olasılığına izin vermek istedim...

MT4 veya kullanıcı her EA'ya bir kimlik atamadan bunun nasıl mümkün olduğunu anlayamıyorum. Veya daha doğrusu, benzersiz bir kimlik oluşturmak ve ardından EA'nın .chr dosyasını kimliği EA'nın harici parametrelerinin bir parçası olarak depolamak için değiştirmek gibi çok kötü bir şey içermeyen bir şey göremiyorum.


Ve genel eğlence için, aşağıdaki tartışmayı hiçbir şekilde ilerletmez, ancak djb2 karma girdisini benzersiz olması garanti edilen bir değerle değiştirir (DLL çağrıları gerektirme pahasına). GUID'ler gibi şeylerde djb2'nin ne kadar iyi olduğunu bilmiyorum, ancak herhangi bir çarpışma olmadan 1.000.000 kimlik oluşturmayı denedim. Ama yine de yeniden başlatma sorununu çözmüyor.


 #import "ole32.dll"
   int CoCreateGuid ( int & Bytes [ ] ) ;
#import

int GenerateMagicNumber ( )
{
   // Generate a 16-byte GUID
   int Bytes [ 4 ] ;
   CoCreateGuid ( Bytes ) ;
   
   // Hash the GUID using djb2
   int iHash = 5381 ;
   for ( int i = 0 ; i < 4 ; i + + ) {
       //original C code: hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
      iHash = ( ( iHash < < 5 ) + iHash ) + Bytes [ i ] ;
   }
   return ( MathAbs ( iHash ) ) ;
}
 
fbj wrote >>

Pencere tanıtıcı verileri bu 'faktör X' olabilir mi?

Herhangi bir siparişi kısmen kapatmıyorsanız, kaynak çifti/zaman aralığı bilgisini saklamak için sipariş yorumunu kullanabilirsiniz..?

Böylece EA, yeniden başlatıldığında, önceden herhangi bir emri olup olmadığını ve bu nedenle hangi sihirli numarayı kullanması gerektiğini çözebilirdi?

not

Yorumları < 25'te tutun ve SOL(OrderComments(), 24) kontrol edin, aksi halde [sl] veya [tp] öğeleri işleri etkileyebilir

<tüm geçmiş> öğesinin Hesap Geçmişi sekmesinde kullanılabilir durumda bırakıldığını varsayar!

FWIW

-BB-