Otomatik Sihirli Numara - sayfa 4

 
cloudbreaker :

Belgelemenin faydalı olacağını düşünmemi sağladı (çok kısaca):

1. Sihirli sayıları uygulamaya karar verme kriterleri

2. Otomatik sihirli sayı oluşturmayı kullanmaya karar verme kriterleri

3. Kalıcılık katmanı uygulamaya karar verme kriterleri

4. Kalıcılık için küresellere karşı dosya erişimine karar verme kriterleri

Kısa, tamamen kişisel cevaplar...


(2), kullanıcının sihirli sayıları farklı stratejilerden elde edilen sonuçları bir arada gruplandırmanın bir yolu olarak kullanabilmeleri için kontrol edebilmek isteyip istemediği de dahil olmak üzere, herhangi bir sayıda faktöre bağlıdır.

(3) yapabilseydim kaçınacağım bir şey ama neredeyse asla yapamam (bkz. 'dış değişkenler ve zaman çerçevesi değişikliği?' ). MT4'ün EA'ların durumunu sürdürme ve kurtarma konusunda yardım sağlaması güzel olurdu. Ama öyle değil.

(4) oldukça güçlü bir kişisel tercihe yol açar: Küreselleri sevmiyorum. Kullanıcılar bunları silebilir; depolama sayılarla sınırlıdır; ve gvariables.dat biçimi belirsiz. Gerekirse son çare olarak bir metin düzenleyici kullanılarak değiştirilebilen dosyaları tercih ederim.


- Biraz ara vermeden önce sadece 8 mesajım kaldı.

Sihirli sayıya ulaştığını görüyorum. En azından bulunduğun yer sıcak olacak...

 

Bu fikir üzerinde defalarca çalıştım ve sonunda istediğimi yaptım. İşte sembolün ASCII kodunu alan ve onu zaman çerçevesine ve zaman çerçevesine, sembole ve EA'ya özgü sihirli bir sayı oluşturmak için özel bir koda ekleyen bir sihirli sayı üreteci. EA'nın kendi adını okumasının bir yolunu bilseydim, özel kod yerine bunun ASCII'sini kullanırdım. Bu zayıflıkla, yukarıdaki kriterlere uyduğunu düşünüyorum - bir sistem çökmesi için gayet iyi olurdu çünkü sistem yeniden başlatıldığında daha önce seçtiği sayıyı seçecektir. Görebildiğim zayıflık, aynı zaman diliminde ve sembolde aynı EA'nın birden fazla örneğini alıp satarsa yinelenen sihirli sayıları seçecek olmasıydı.

İşte sahip olduklarım:

string GetSymbol=Symbol();
int MNSymbol,MNSymbolCalc,MagicNumber;
for(int a=0;a<6;a++)//Simge()'yi bir ASCII dizgisine çevirin ve her karakteri MNSymbol'a ekleyin
{
MNSymbolCalc=StringGetChar(GetSymbol, a);
MNSymbolCalc=((MNSymbolCalc-64)*(MathPow(10,(a))));//64 b/c ASCII karakterleri 65'ten başlar, sonucu netlik için a-th gücüyle çarpın (gerekli olmasa da)
MNSymbol = MNSymbol+MNSymbolCalc;
}
int MNPeriod=Period();

int MNEACode=100000;//İki farklı EA türünün aynı Sihirli Sayıyı seçmesini önlemek için bu sayıyı her EA için farklı yapın
MagicNumber=MNSymbol+MNPeriod+MNEACode;

 

JT, evet... çoğaltma 'sorunları' kabus gibi;)


Sizin ve benim pek çok kişiden şüphelendiğimiz gibi, benzersizlik sorunu, her zaman ve her zaman saldırıya uğrayan, ancak bir şekilde asla doğru görünmeyen sürekli tekrar eden bir temadır!

Bu ileti dizisinde daha önce yayınlanan kodum, kullanımda olabilecek aşağıdaki ile değiştirildi (iyi bir kahkahadan başka bir nedenden dolayı :).

*** Yerleşik çağrı yoluyla kullanılabilen EA ad dizesine dikkat edin.

Çoklu ccy yapma çabalarında, kullanılan yerel işlevler vardır. yani, boş gerçekleri kontrol etmek için her zaman aynı fonksiyon başlık kodunu kodlamaktan bıktım: ccy,per

dolayısıyla benim _Symbol() ve _Period() kullanımım. Hız/boyut hususları, MT4 yorumlayıcısında bile, endişelenecek enerjilere değmez ...

Her neyse, belki bu düşünce için yiyecek verir...


aşağıda [ve doc'd in function] yapma nedenim:

Bu, bir EA'nın bir CCY'de durması halinde, daha sonra aynı CCY,PER'e karşı yeniden çalıştırıldığında, bunu sağlamanın kullanışlı bir yoludur.

özdeş giExpertId (aka, Magic#) üretecektir. Havuzdaki olağanüstü işlemleri yönetmeye devam edebileceği anlamına gelir...

Adlandırılmış başka bir EA, değerlerin kopyalanmasından korkmadan aynı grafik ortamında çalışabilir.

Bu nedenle, OrderPools, EA'ya özgü bir büyü# ile biletlere sahip olacak ve bu, yalnızca biletlerin EA başına eşlenmesine izin verecektir.


Aynı ccy,per üzerinde >1 'aynı adlı' EA hakkındaki yorumunuz gerçekten bir sorun. Sonunda HEY'e karar verdim! gerçek ol... eğer bu hatayı yaparsam, o zaman bu kadar düşüncesiz olduğum için arkadan bir tekmeyi hak ederim, lol

sonunda, bu başlıkta gösterildiği gibi, her birinin güçlü ve zayıf yönleri olan zilyonlarca fikir/yöntem vardır.

her şey bir EA çalıştığında [en az] bir benzersiz veri elde etmeye başlar ve bu [bana] temel sorundur.

Yeniden başlatmaya yol açan EA/CT çökmesi ve kaldığı yerden devam etme konusunda solucanlar kutusu hakkında fazla düşünmedim. EA, R/T grafik ortamına özgü verilerle EAid/magic#'i otomatikleştirdiği sürece artık bu hallediliyor. Hep aynı sayıyı üretecek...

iyi eğlenceler!


 int iMakeExpertId ( string sSymbol = "" , int iPeriod = EMPTY )
{

   return ( iMakeHash ( _Symbol ( sSymbol ) , getPeriodStr ( _Period ( iPeriod ) ) , WindowExpertName ( ) ) ) ;

} //iMakeExpertId()
//
//
//


//+------------------------------------------------------------------+
//
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 int 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
  2. When you hash a value, you cannot 'unhash' it. Hashing is a one-way process.
     Using traditional symetric encryption techniques (such as Triple-DES) provide the reversible encryption behaviour you require.
     Ref:http://forums.asp.net/t/886426.aspx subj:Unhash password when using NT Security poster:Participant
  //
  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 {myWord! isn't C concise! Pity MQL4 is"!"} ]
   {
     //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()
 
fbj :
   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

Ben şahsen sihirli sayının manuel olarak ayarlanmasını tercih etsem de, çözümünüz oldukça zarif. Güzel kod.


Bir düzeltme - dize sabitlerinin maksimum uzunluğu 255'tir, dize değişkenleri çok daha büyük olabilir, bkz. -> https://www.mql5.com/en/forum/123551 .

 

Teşekkürler Gordon, kod iyi çalışıyor gibi görünüyor , ama sonuçta aynı EA'yı aynı grafik ortamında çalıştırmam gerekir mi kesinlikle kurşun geçirmez değil - yani evet... manüel olarak sihir# ayarı kusursuz kusursuz bir yöntemdir - buna hiç şüphe yok!


Benim için ipler her zaman arkada bir acı olmuştur. Yine de çoğu şey, örneğin her biri daha düşük seviyeli araçların işlevlerini kullanan bir dizi aracı aşamalı olarak oluşturmak yoluyla mümkündür.

Ek olarak, irusoh1'in birine 'işte bu' dediğini/hatırlattığını hatırlıyorum, onunla yaşa... Şey, benim için, onun yazı içeriğindeki ilk paragrafı her zaman hatırlıyorum ve ne zaman işaret etsem *daima* aklımdadır. Gevşek yaşamak için MT :))


MQL4 çevrimiçi/çevrimdışı, temel veri türleri hakkında konuşur. Her ikisinde de dize bağlantısı, dize sabitlerine gider ve hepimiz o belge sayfasının ne dediğini biliyoruz... yani, 255 bayt.

Ne dediğinizi tamamen anlıyorum, ancak 29373 iş parçacığı, dizelerin MQL4 çalışma zamanı işlemesi gibi, sonuçsuz ve jjc olarak ve şüphesiz diğer birçok kişinin deneyimlediği gibi - biraz şüpheli

8byte yapı formatının tam kullanımını destekleyecek herhangi bir belge bulunamıyor, eğer daha uzun dizileri destekleyecek belgeler varsa, ilgi çekici olacaktır.

Her neyse, geçmişte dizeleri kullanırken çözülemez sorunlar yaşadım, bu yüzden sadece belgelerin söylediklerine bağlı kalmayı ve bunun etrafında çalışmayı - gerekirse - tercih ediyorum.

 
fbj :

MQL4 çevrimiçi/çevrimdışı, temel veri türleri hakkında konuşur. Her ikisinde de dize bağlantısı, dize sabitlerine gider ve hepimiz o belge sayfasının ne dediğini biliyoruz... yani, 255 bayt.

Ne dediğinizi tamamen anlıyorum, ancak 29373 iş parçacığı, dizelerin MQL4 çalışma zamanı işlemesi gibi, sonuçsuz ve jjc olarak ve şüphesiz diğer birçok kişinin deneyimlediği gibi - biraz şüpheli

8byte yapı formatının tam kullanımını destekleyecek herhangi bir belge bulunamıyor, eğer daha uzun dizileri destekleyecek belgeler varsa, ilgi çekici olacaktır.

Her neyse, geçmişte dizeleri kullanırken çözülemez sorunlar yaşadım, bu yüzden sadece belgelerin söylediklerine bağlı kalmayı ve bunun etrafında çalışmayı - gerekirse - tercih ediyorum.

Maksimum 255'e bağlı kalmak, açıkçası güvenli çözümdür, ancak bu sınırı göz ardı eden oldukça fazla kodum var ve hiçbir zaman herhangi bir sorunla karşılaşmadım. Ama sonra tekrar bu kod çoğunlukla kritik değildir.

Belgelerin bu konuyla ilgili biraz belirsiz olduğunu biliyorum, ancak Rusça forumlara göz atmaya çalışırsanız (Google translate ile) moderatörlerden birinin, dize değişkenlerinin 255 bayttan fazlasını desteklediğine dair resmi bir yorumunu okuduğumu hatırlıyorum, ancak yapabilirim' Şimdi onu bulamıyor gibiyim... Eh, sanırım "işte bu" ve bununla yaşamak zorundayız :)

 
fbj :

8byte yapı formatının tam kullanımını destekleyecek herhangi bir belge bulunamıyor, eğer daha uzun dizileri destekleyecek belgeler varsa, ilgi çekici olacaktır.

Her neyse, geçmişte dizeleri kullanırken çözülemez sorunlar yaşadım, bu yüzden sadece belgelerin söylediklerine bağlı kalmayı ve bunun etrafında çalışmayı - gerekirse - tercih ediyorum.

" Bir dize sabitinin uzunluğu 0 ile 255 karakter arasındadır. Dize sabiti daha uzunsa, sağdaki gereksiz karakterler reddedilecek ve derleyici buna göre uyaracaktır.

Dahili temsili 8 baytlık bir yapıdır. Yapının ilk öğesi, hat için dağıtılan arabelleğin boyutunu içeren uzun bir tamsayıdır. Yapının ikinci öğesi, satırı içeren ara belleğin 32 sıra adresidir. "

MetaEditor sözlüğünden alıntılanmıştır Veri Türleri - Dize sabitleri

ilginç şeyler arkadaşlar...

 

Bu iş parçacığının eski olduğunu biliyorum, ancak herkesin bir "sihirli sayı" veya ona ne demek istiyorsanız onu almak için kendi yolu olduğunu görüyorum. Ayrıca orada EA'nın kendi adını okuyabilmesini isteyen birini gördüm... işte EA'mın adını almak için kullandığım şey bu

Bunu EA'nın en üstüne yerleştirin:

#define EAName "EA adını buraya yazın"

Açık siparişleri kontrol ettiğinizde şunu yerleştirin:

if (OrderType() <= OP_SELL && OrderSymbol() == Symbol() && OrderComment() == EAName && OrderMagicNumber() == MagicNumber)

Ticaretiniz yapıldığında, sahip olduğunuzdan emin olun, böylece EAName'i şöyle bir yorum için yerleştirir:

Bilet = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, EAName, MagicNumber, 0, Blue);

O zaman sihirli bir sayı istiyorsanız, EA'yı aynı çift üzerinde fakat aynı anda farklı TF'ler üzerinde çalıştırmak istiyorsanız .......... sadece şunu kullanın:

int MagicNumber = Dönem();

Neden: