Automatische magische Zahl - Seite 4

 
cloudbreaker:

Das hat mich auf den Gedanken gebracht, dass es sinnvoll wäre, (in aller Kürze) zu dokumentieren:

1. Kriterien für die Entscheidung über die Einführung magischer Zahlen

2. Kriterien für die Entscheidung über die automatische Generierung magischer Zahlen

3. Kriterien für die Entscheidung über die Implementierung einer Persistenzschicht

4. Kriterien für die Entscheidung über Globals vs. Dateizugriff für Persistenz

Kurze, ganz persönliche Antworten...


(2) hängt von einer Reihe von Faktoren ab, u.a. davon, ob der Benutzer in der Lage sein möchte, die magischen Zahlen zu kontrollieren, so dass er sie als eine Möglichkeit verwenden kann, die Ergebnisse verschiedener Strategien zusammenzufassen.

(3) ist etwas, das ich vermeiden würde, wenn ich könnte, aber ich kann es fast nie (siehe "Externe Variablen und Zeitrahmenwechsel"). Es wäre schön, wenn MT4 Hilfe bei der Speicherung und Wiederherstellung des Status von EAs bieten würde. Aber das tut er nicht.

(4) führt zu einer ziemlich starken persönlichen Präferenz: Ich mag keine Globals. Benutzer können sie löschen; die Speicherung ist auf Zahlen beschränkt; und das Format von gvariables.dat ist undurchsichtig. Ich bevorzuge Dateien, die, wenn nötig, mit einem Texteditor geändert werden können.


- Ich habe nur noch 8 Beiträge, bevor ich eine kleine Pause einlege.

Wie ich sehe, hast du die magische Zahl erreicht. Wenigstens wird es dort, wo du bist, warm sein...

 

Ich habe auf diese Idee auf und ab gearbeitet, und ich habe es endlich zu tun, was ich wollte. Hier ist eine magische Zahl Generator, der den ASCII-Code des Symbols nimmt, und fügt es auf den Zeitrahmen und einen benutzerdefinierten Code, um eine magische Zahl, die einzigartig für den Zeitrahmen, Symbol und EA zu generieren. Wenn ich eine Möglichkeit wüsste, wie der EA seinen eigenen Namen lesen kann, würde ich den ASCII-Code anstelle des benutzerdefinierten Codes verwenden. Mit dieser Schwäche, ich denke, es erfüllt die Kriterien oben obwohl - es wäre gerade in Ordnung mit einem Systemabsturz, weil es die gleiche Zahl, die es zuvor bei System-Neustart ausgewählt würde. Die Schwäche, die ich sehen könnte, ist, dass es doppelte magische Zahlen auswählen würde, wenn mehr als eine Instanz des gleichen EA auf dem gleichen Zeitrahmen und Symbol handeln.

Hier ist, was ich habe:

string GetSymbol=Symbol();
int MNSymbol,MNSymbolCalc,MagicNumber;
for(int a=0;a<6;a++)//Das Symbol() in einen ASCII-String umwandeln und jedes Zeichen in MNSymbol hinzufügen
{
MNSymbolCalc=StringGetChar(GetSymbol, a);
MNSymbolCalc=((MNSymbolCalc-64)*(MathPow(10,(a))));//Subtrahiere 64, da ASCII-Zeichen bei 65 beginnen, multipliziere das Ergebnis der Einfachheit halber mit der a-ten Potenz (ist aber unnötig)
MNSymbol = MNSymbol+MNSymbolCalc;
}
int MNPeriod=Period();

int MNEACode=100000;//Machen Sie diese Zahl für jeden EA unterschiedlich, um zu verhindern, dass zwei verschiedene Arten von EA's die gleiche Magic Number wählen
MagicNumber=MNSymbol+MNPeriod+MNEACode;

 

JT, ja... Vervielfältigungsprobleme sind der Stoff, aus dem Albträume sind ;)


Wie bei Ihnen und vermutlich bei vielen anderen ist das Problem der Einzigartigkeit ein ständig wiederkehrendes Thema, das immer wieder angegriffen wird, aber irgendwie nie richtig zu sein scheint !

Mein früher in diesem Thread veröffentlichter Code wurde durch den folgenden ersetzt, der vielleicht von Nutzen ist (und sei es nur, um mal wieder zu lachen :).

***Beachten Sie den EA-Namensstring, der über den Aufruf des Builtins verfügbar ist.

In dem Bestreben, mehrere ccy,per zu erzeugen, werden lokale Funktionen verwendet, d.h. ich hatte es satt, immer den gleichen Funktions-Header-Code zu codieren, um auf leere actuals zu prüfen: ccy,per

daher meine Verwendung von _Symbol() und _Period(). Geschwindigkeit/Größe Überlegungen imho, auch auf MT4 Interpreter ist einfach nicht wert die Energien, um sich mit...

Wie auch immer, vielleicht gibt das einen Denkanstoß...


Meine Argumentation für das untenstehende [und in der Funktion dokumentierte] Vorgehen ist:

Dies ist ein praktischer Weg, um sicherzustellen, dass, wenn ein EA bei einem CCY,PER anhält, er bei einer späteren Wiederholung mit demselben CCY,PER

eine identische giExpertId (auch bekannt als Magic#) generiert wird. Das bedeutet, dass er die Verwaltung der ausstehenden Trades im Pool wieder aufnehmen kann...

Ein anderer EA mit demselben Namen kann in derselben Chart-Umgebung ausgeführt werden, ohne dass die Gefahr besteht, dass Werte dupliziert werden.

Daher werden OrderPools Tickets mit einer EA-spezifischen Magic# haben, die nur ein EA-Mapping seiner Tickets erlauben.


Ihre Bemerkung zu >1 "gleichnamigen" EA auf demselben Chart ist in der Tat ein Problem. Ich habe schließlich beschlossen, dass ich, wenn ich diesen Fehler mache, einen Tritt in den Hintern verdiene, weil ich so unüberlegt bin... lol

Letztendlich gibt es, wie dieser Thread zeigt, zahllose Ideen/Methoden, jede mit ihren Stärken und Schwächen.

Es läuft alles darauf hinaus, [mindestens] ein einziges Datum zu erhalten, wenn ein EA läuft, und das ist [für mich] das Kernproblem.

Ich habe nie viel darüber nachgedacht, dass ein EA/CT-Absturz zu einem Neustart führen könnte und dass man dort weitermachen könnte, wo man aufgehört hat. Das ist jetzt kein Problem mehr, solange der EA seine EAid/Magic# mit Daten generiert, die für seine R/T-Chart-Umgebung einzigartig sind. Es wird immer die gleiche Nummer generiert...

na ja, viel Spaß!


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

Obwohl ich persönlich die manuelle Einstellung der magischen Zahl bevorzuge, ist Ihre Lösung recht elegant. Schöner Code.


Eine Korrektur - String-Konstanten haben eine maximale Länge von 255, String-Variablen können viel größer sein, siehe -> https://www.mql5.com/en/forum/123551.

 

Danke Gordon, der Code scheint zu funktionieren ok, aber am Ende ist sicherlich nicht kugelsicher sollte ich laufen gleichen EA auf dem gleichen Chart-Umgebung - so ja... manuell Einstellung von magic# ist die ultimative narrensichere Methode - kein Zweifel daran!


Für mich waren Strings schon immer eine Qual. Dennoch ist fast alles möglich, wenn man schrittweise eine Reihe von Tools aufbaut, von denen jedes die Funktionalitäten der darunter liegenden Tools nutzt.

Außerdem erinnere ich mich, dass irusoh1 sagte/erinnerte man, dass "das ist es" so leben mit ihm ... Nun, ich erinnere mich immer an den ersten Absatz in seinem Posting und denke *immer* daran, wenn ich mit MT an einen Punkt komme, an dem ich den Willen zu leben verliere :))


Die MQL4 online/offline spricht über grundlegende Datentypen. Der String-Link in beiden geht zu String-Konstanten und wir alle wissen, was diese Doku-Seite sagt... d.h. 255Byte.

Ich verstehe vollkommen, was Sie sagen, aber der 29373-Thread ist, wie auch die MQL4-Laufzeitbehandlung von Strings, nicht schlüssig und - wie jjc und zweifellos viele andere erfahren haben - etwas zweifelhaft

Ich kann keine Dokumentation finden, die die volle Nutzung des 8-Byte-Strukturformats unterstützt; sollte es eine Dokumentation zur Unterstützung längerer Strings geben, wäre das von Interesse.

Wie auch immer, ich habe in der Vergangenheit hatte unlösbare Probleme mit Strings, so dass ich nur lieber zu halten, was die Dokumente sagen und arbeiten rund um sie - wenn nötig.

 
fbj:

Die MQL4 online/offline spricht über grundlegende Datentypen. Der String-Link in beiden geht zu String-Konstanten und wir alle wissen, was die Doku-Seite sagt... z.B. 255 Bytes.

Ich verstehe vollkommen, was Sie sagen, doch der 29373 Thread ist, wie auch die MQL4 Laufzeitbehandlung von Strings, nicht schlüssig und wie jjc und zweifellos viele andere erfahren haben - etwas zweifelhaft

Ich kann keine Dokumentation finden, die die volle Nutzung des 8-Byte-Strukturformats unterstützt; sollte es eine Dokumentation zur Unterstützung längerer Strings geben, wäre das von Interesse.

Wie auch immer, ich habe in der Vergangenheit unlösbare Probleme mit Strings gehabt, also ziehe ich es vor, mich an das zu halten, was die Dokumentation sagt und es zu umgehen - wenn nötig.

Sticking to max 255 ist offensichtlich die sichere Lösung, obwohl ich eine ganze Menge Code, der diese Grenze ignoriert und ich habe nie in irgendwelche Probleme laufen. Aber auch dieser Code ist meist unkritisch.

Ich weiß, dass die Dokumentation zu diesem Thema etwas unklar ist, aber wenn man versucht, die russischen Foren zu durchsuchen (mit Google translate), erinnere ich mich, einen offiziellen Kommentar von einem der Moderatoren gelesen zu haben, dass String-Variablen mehr als 255 Bytes unterstützen, aber ich kann ihn jetzt nicht finden... Nun gut, ich schätze, "das war's" und wir müssen damit leben :)

 
fbj:

Ich kann keine Dokumentation finden, die die volle Nutzung des 8-Byte-Strukturformats unterstützt. Sollte es eine Dokumentation zur Unterstützung längerer Strings geben, wäre das von Interesse.

Wie auch immer, ich hatte in der Vergangenheit unlösbare Probleme bei der Verwendung von Strings, also ziehe ich es vor, mich an das zu halten, was in der Dokumentation steht und es zu umgehen - wenn nötig.

"Die Länge einer Stringkonstante liegt zwischen 0 und 255 Zeichen. Wenn die Stringkonstante länger ist, werden die überflüssigen Zeichen auf der rechten Seite verworfen, und der Compiler gibt eine entsprechende Warnung aus.

Ihre interne Darstellung ist eine Struktur von 8 Bytes. Das erste Element der Struktur ist eine lange Ganzzahl, die die Größe des Puffers für die Zeile enthält. Das zweite Element der Struktur ist die 32-stellige Adresse des Puffers, der die Zeile enthält."

Zitiert aus dem MetaEditor-Wörterbuch Data Types - String constants

Faszinierendes Zeug, Leute...

 

Ich weiß, dieser Thread ist alt, aber ich sehe, dass jeder seinen eigenen Weg hat, um eine "magische Zahl" oder wie auch immer Sie es nennen wollen, zu erhalten. Ich habe auch gesehen, dass jemand wollte, dass sein EA seinen eigenen Namen lesen kann... nun, das ist, was ich benutze, um den Namen meines EA zu erhalten

Fügen Sie dies am Anfang des EA ein:

#define EAName "EA-Name hier einfügen"

Wenn Sie nach offenen Aufträgen suchen, fügen Sie dies ein:

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

Wenn Ihr Handel platziert wird, stellen Sie sicher, dass Sie den EANamen für einen Kommentar wie diesen platzieren:

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

Wenn Sie dann eine magische Zahl benötigen, die Sie verwenden würden, wenn Sie den EA auf dem gleichen Paar, aber verschiedenen TFs zur gleichen Zeit laufen lassen wollen, verwenden Sie einfach this:

int MagicNumber = Period();