Schaffung einer magischen Zahl - Seite 3

 
//|                                                      This_EA.mq4 |
//|                      Copyright © 2010, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+

#define This_EA  101
#define That_EA  102
#define Other_EA 103 // put this list of ea names to each of your ea's header, or...
                     // .. alternatively you can use a number suffix to your ea's file name 
                     // so it can be identified with --> StringSubstr(WindowExpertName(),x,y);
double This_EA_qty;
string magic_prefix;

int init()
  {

   if(GlobalVariableGet(This_EA_qty) >= 0.0){
            GlobalVariableSet("This_EA_qty", This_EA_qty + 1);
   }
   magic_prefix = StringConcatenate(This_EA, DoubleToStr(This_EA_qty,0));

   return(0);
  }

int deinit()
  {

      GlobalVariableSet("This_EA_qty", This_EA_qty - 1);
   
   return(0);
  }

int start()
  {
      double lots, SL, TP; int slip, time_stamp ;
      bool BuyCondition;
   
      if( BuyCondition == true )
      {
         time_stamp  = TimeCurrent(); 
         string magic_name = StringConcatenate(magic_prefix, time_stamp );
         int magic = StrToInteger(magic_name);
         
                                      // Integers range from -2147483648 to 2147483647
                                      // the resulting magic integer would most probably exceed that 
                                      // so we cut the number returned with TimeCurrent() short with 
                                      // MathMod(time_stamp,x) x being years, months not necessary for 
                                      // magic unique-ness. I don't include this calculation, 
                                      // since I'm short in time for testing it...
      
      
         OrderSend(Symbol(),0, lots, Ask, slip, SL, TP, NULL, magic, 0, CLR_NONE);
      }
//----
   return(0);
  }
//+------------------------------------------------------------------+
dauert ein bisschen länger als ich dachte ...
edit : GVget Bedingung != -1.0 bis >= 0.0; edit
 
cameofx:
[...] dauert etwas länger als ich dachte ...

Dies wird immer mehr zu einem Aufguss (Entschuldigung für das Wortspiel) des vorherigen Themas, das ich bereits erwähnt habe: https://www.mql5.com/en/forum/120034. Alles, was mit globalen Variablen zu tun hat, wirft Fragen zu Backup und Disaster-Recovery auf. Wenn der Handel in aller Eile auf einen neuen Server verlagert werden muss, muss entweder ein aktuelles Backup der gvariables.dat vorhanden sein, oder der Benutzer muss in der Lage sein, die globalen Variablen manuell neu zu erstellen.

Ich habe Ihren Code nicht genau studiert, aber ich bin mir auch nicht sicher, was passiert, wenn es mehrere Kopien des EA gibt und MT4 dann neu gestartet wird. Es sieht so aus, als ob der Code davon ausgeht, dass die EAs automatisch in der gleichen Reihenfolge neu geladen werden, in der sie ursprünglich manuell geladen wurden. Mit anderen Worten, mehrere Kopien des EA können bei Neustarts unterschiedliche This_EA_qty-Werte erhalten, und ich kann dann nicht erkennen, wie sie ihre historischen Aufträge in der MT4-Liste korrekt identifizieren. Aber ich könnte mich auch irren.

 
cameofx:
dauert ein bisschen länger als ich dachte ...
edit : GVget Bedingung != -1.0 bis >= 0.0
// TimeCurrent() in seconds since 1970 would most probably exceed that 

TimeCurrent() gibt eine 32 Bit Ganzzahl zurück. Der Datentyp datatime ist ein Alias für den Typ int, int ist auch eine 32-Bit-Ganzzahl.


Die andere Sache, die ich in Ihrem Code nicht verstehe, ist, warum Sie eine andere MN für jeden geöffneten Handel verwenden? Das ist das Gegenteil von dem, wofür MNs gedacht sind. Die Idee einer MN ist, dass man alle Trades eines bestimmten EAs identifizieren kann, indem man sich einfach die MN ansieht. Was ist der Grund für den zufälligen Teil des MNs? Wie würde der Code in Ihrem EA aussehen, der alle offenen Geschäfte dieses EAs schließt oder alle Stopps dieses EAs nachzieht?
 
Wenn ich richtig verstanden habe, besteht Ihre Lösung für 2 verschiedene Experten, die versehentlich die gleiche ID haben, darin, alle Experten-IDs in die Kopfzeile der einzelnen Experten zu setzen. Das ist eine Art von Schmerz im Arsch... Selbst wenn man diesen Teil in eine Include-Datei packen würde, müsste man immer noch alle Experten für jeden neuen Experten, den man erstellt, neu kompilieren.

Die Frage der Persistenz ist immer noch da. Ich weiß nicht, wie das nach einem Neustart des Terminals oder nach dem Wechsel zu einem völlig anderen Terminal funktionieren würde...
 
jjc:

Dies wird immer mehr zu einem Aufguss (Entschuldigung für das Wortspiel) des vorherigen Themas, das ich bereits erwähnt habe: https://www.mql5.com/en/forum/120034. Alles, was mit globalen Variablen zu tun hat, wirft Fragen zur Sicherung und Wiederherstellung im Katastrophenfall auf. Wenn der Handel in aller Eile auf einen neuen Server verlagert werden muss, muss entweder ein aktuelles Backup der gvariables.dat vorhanden sein, oder der Benutzer muss in der Lage sein, die globalen Variablen manuell neu zu erstellen.

Ich habe Ihren Code nicht genau studiert, aber ich bin mir auch nicht sicher, was passiert, wenn es mehrere Kopien des EA gibt und MT4 dann neu gestartet wird. Es sieht so aus, als würde der Code davon ausgehen, dass die EAs automatisch in der gleichen Reihenfolge neu geladen werden, in der sie ursprünglich manuell geladen wurden. Mit anderen Worten, mehrere Kopien des EA können bei Neustarts unterschiedliche This_EA_qty-Werte erhalten, und ich kann dann nicht erkennen, wie sie ihre historischen Aufträge in der MT4-Liste korrekt identifizieren. Aber ich könnte mich auch irren.

Dies ist die Art von Feedback, die ich erwarte... danke Gordon, 7bit & jjc.

Ihre Antworten bedürfen einiger Überlegungen.. aber um schnell zu antworten :

- wenn This_EA expert schon einmal an ein anderes Diagramm angehängt ist, hätte magic_number dann den Wert von : 101-1-time_stamp (Bindestrich der Übersichtlichkeit halber)

- die enthaltenen Informationen wären 101 - Experten-ID; 1 - This_EA-Menge, die im Moment in Betrieb ist; time_stamp - Zeitpunkt des OrderSend

- dann können wir es mit StringSubStr scannen und wissen, dass ein bestimmter Auftrag von This_EA eröffnet wurde, während 1 anderer This_EA angeschlossen war.

 
7bit:

TimeCurrent() gibt eine 32-Bit-Ganzzahl zurück. Der Datentyp datatime ist ein Alias für den Typ int, int ist ebenfalls eine 32-Bit-Ganzzahl.


Die andere Sache, die ich in Ihrem Code nicht verstehe, ist, warum Sie eine andere MN für jeden eröffneten Handel verwenden? Das ist das Gegenteil von dem, wofür MNs gedacht sind. Die Idee einer MN ist, dass man alle Trades eines bestimmten EAs identifizieren kann, indem man sich einfach die MN ansieht. Was ist der Grund für den zufälligen Teil des MNs? Wie würde der Code in Ihrem EA aussehen, der alle offenen Geschäfte dieses EAs schließt oder alle Stopps dieses EAs nachzieht?

Entschuldigung, was ich meinte war, dass der resultierende int magic_name diese Zuweisung überschreiten würde. Ich werde den Kommentar im Code entsprechend verschieben.

Um unsere Wahrnehmung anzugleichen. Ich würde diese Anforderungen für diese 'automatisierte' magic_number vorschlagen. Der MN hätte die folgenden:

- Sie können identifizieren, mit welchem EA - diese spezielle Bestellung mit besagter MN - offen war.

- Ein EA mit dieser Technik - wenn er an mehrere (mehr als 1) angehängt ist - würde nicht dieselbe magische Zahl erzeugen, wenn diese EAs gleichzeitig Aufträge außerhalb einer 1-Sekunden-Spanne öffnen

- Somit würde es keinen Konflikt bei der Auftragsabwicklung geben, aber gleichzeitig kann der Ursprung der MN immer noch zurückverfolgt werden.

- bitte hinzufügen, wenn meine Liste nicht vollständig ist...

 
cameofx:
- Die enthaltenen Informationen wären 101 - Experten-ID; 1 - This_EA-Menge, die im Moment operiert; time_stamp - Zeitpunkt des OrderSend

- dann können wir es mit StringSubStr scannen und wissen, dass eine bestimmte Order von This_EA eröffnet wurde, während 1 andere This_EA angehängt war.

Aber wofür ist der Zeitteil in der MN? Warum nicht einfach die EA-Nummern allein verwenden und auf substr verzichten? Bei der Verwendung von substr müsste der int-Wert in eine Zeichenkette umgewandelt werden, dann müssten einige Zeichenkettenoperationen und ein Zeichenkettenvergleich durchgeführt werden. String-Operationen mit Integer-Zahlen sehen in der Regel dilettantisch aus, weil sie in den meisten Fällen besser gelöst werden könnten, indem man die Informationen in verschiedenen Bits des 32-Bit-Worts kodiert und bitweise Operationen verwendet, um sie zu manipulieren oder zu überprüfen, was um Größenordnungen schneller und eleganter wäre.

Warum nicht einfach einen (EA-Instanz-einzigartigen) int-Wert für die mn verwenden und einen einfachen Integer-Vergleich durchführen, um entweder die ganze Zahl oder bestimmte Bits davon zu vergleichen?

Lassen Sie zum Beispiel die ersten 28 Bits die ID sein und die letzten vier Bits eine Zahl von 0..15, um verschiedene Arten von Geschäften zu identifizieren (zum Beispiel, wenn es 3 verschiedene Arten von Aufträgen öffnen kann : initial, level1, level2 und hedge)

ID = hash & 0xFFFFFFF0  // this has the 4 low bits always zero


// generate the mn for level 1 trades
MN = (ID + 1);
OrderSend(..., MN, "level 1");


// generate the mn for hedge trades
MN = (ID + 15);
OrderSend(..., MN, "hedge the whole mess");


// this strategy may not make any sense, only to illustrate the code:
// close the hedge trades and trail the stops of all levels
for(...){
   if (OrderMagicNumber() & 0xFFFFFFF0 == ID){  // this trade belongs to us
      if (OrderMagicNumber() & 0x0000000F == 15){ // this is a hedge trade
         OrderClose(...)
      }else{ // this is one of the other levels
         Trail(OrderTicket());
      }
   }
}

// or even easier:
MN = (ID + 15); // all our hedge trades have this MN
for(...){
   if (OrderMagicNumber() == MN){
      OrderClose(...)
   }
}
 
gordon:
Wenn ich richtig verstanden habe, besteht Ihre Lösung für den Fall, dass 2 verschiedene Experten versehentlich die gleiche ID haben, darin, alle Experten-IDs in die Kopfzeile jedes Experten zu setzen. Das ist eine Art von Schmerz im Arsch... Selbst wenn man diesen Teil in eine Include-Datei packen würde, müsste man immer noch alle Experten für jeden neuen Experten, den man erstellt, neu kompilieren.

Die Frage der Persistenz ist immer noch da. Ich weiß nicht, wie das nach einem Neustart des Terminals oder nach dem Wechsel zu einem völlig anderen Terminal funktionieren würde...

Nein, haben Sie nicht :) lesen Sie bitte die Kommentare im Code bezüglich WindowExpertName().

Wenn es vom Experten aufgerufen wird, würde es den Experten/Skript/Indikator-Dateinamen ohne ".mq4" oder ".ex4" abrufen. Sie müssen keine Includes einfügen, sondern nur Ihre EAs entsprechend benennen.

PS: Entschuldigung für die spammige Antwort :)

 
7bit:

Aber wozu dient der Zeitteil in der MN? Warum nicht einfach die EA-Zahlen allein verwenden? und nicht substr verwenden? Bei der Verwendung von substr müsste der int in einen String umgewandelt werden, dann einige String-Operationen und ein String-Vergleich, der Zeitteil der MN wird weggeworfen, weil er nie benötigt wird. String-Operationen mit Integer-Zahlen sehen in der Regel dilettantisch aus, weil sie in den meisten Fällen besser gelöst werden könnten, indem man die Informationen in verschiedenen Bits des 32-Bit-Worts kodiert und bitweise Operationen verwendet, um sie zu manipulieren oder zu überprüfen, was um Größenordnungen schneller und eleganter wäre.

Warum nicht einfach einen (EA-Instanz-einzigartigen) int-Wert für die mn verwenden und einen einfachen Integer-Vergleich durchführen, um entweder die ganze Zahl oder bestimmte Bits davon zu vergleichen?

Lassen Sie z.B. die ersten 28 Bits die ID sein und die letzten vier Bits eine Zahl von 0..15, um verschiedene Arten von Trades zu identifizieren (z.B. wenn es 3 verschiedene Arten von Orders öffnen kann: Initial, Level1, Level2 und Hedge)


hmm... Ich verwende den Zeitteil, weil ich dachte, dass die MN für jede von einem EA eröffnete Order einzigartig sein muss in Bezug auf andere Orders, die zur gleichen Zeit mit demselben EA auf verschiedenen Charts eröffnet werden.

Die Prämisse wäre: Wenn ein EA zwei (mehrere) Orders gleichzeitig mit der gleichen magischen Zahl öffnet, können sie nicht die gleiche MN haben, da es sonst zu Konflikten bei der Orderabwicklung und oder

Order-Identifizierung... vielleicht habe ich das fälschlicherweise mit OrderTicket-Grabbing verwechselt (oder nicht?).

- Die Einbeziehung der Strategie in die MN wäre natürlich der nächste Schritt

- Wie ich sehe, übertrifft Ihr Können mich um Lichtjahre: )). Ich habe noch nicht die Fähigkeit, Operationen zu optimieren, deshalb habe ich dies gepostet.. Jetzt weiß ich, dass die Überprüfung mit bitweisen Operationen schneller wäre.

Vielen Dank dafür. Vielleicht muss ich dich später um eine Erklärung bitten :)))

 
cameofx

hmm... Ich verwende den Zeitteil, weil ich dachte, dass die MN für jede von einem EA eröffnete Order einzigartig in Bezug auf andere Orders sein muss

Nein, sie können alles sein, was Sie wollen. genau wie der Kommentar. sehen Sie sie als eine Art numerischen Kommentar. Alle manuellen Trades, die mit der normalen MT4-Benutzeroberfläche geöffnet werden, haben die magische Zahl 0, so dass Sie z. B. eine Schleife über alle Orders ziehen und alle manuellen Trades und Orders schließen/löschen können, während alle EA-Trades unangetastet bleiben.

Alle meine EAs erzeugen ihre eigene Nummer, einzigartig für (EA-Name + Symbol + Zeitrahmen), deshalb habe ich so viel Aufwand betrieben, um eine gute und einfache Hash-Funktion zu finden, um diese Nummer zu erzeugen. Der Hash ist sogar so gut, dass ich die letzten paar Bits dieses Hashes einfach abschneiden kann, um Platz für Unternummern zu schaffen (wenn ich es brauche, aber das brauche ich selten) und es wäre immer noch ziemlich sicher gegen Kollisionen.

Aber die meisten meiner EAs verwenden den Hash direkt und haben keine Unternummerierung, weil sie nur eine Art von Trades haben und alle ihre Trades identisch behandeln.

Zur eindeutigen Identifizierung eines bestimmten Auftrags gibt es immer die Ticketnummer.