Schaffung einer magischen Zahl - Seite 4

 
7bit:

Nein, sie können alles sein, was Sie wollen. genau wie der Kommentar. sehen Sie sie als eine Art von numerischem 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 unberührt bleiben.

Zur eindeutigen Identifizierung einer bestimmten Order gibt es die Ticketnummer.

danke für die Aufklärung und den Austausch Ihrer Ansichten. Übrigens, ich habe viel gelernt.

 
7bit:
/**
* Rotate a 32 bit integer value bit-wise 
* the specified number of bits to the right.
* This function is needed for calculations
* in the hash function makeMacicNumber()
*/
int bitRotate(int value, int count){
   int i, tmp, mask;
   mask = MathPow(2, count) - 1;
   tmp = value & mask;
   value = value >> count;
   value = value | (tmp << (32 - count));
   return(value);
}

Ich brauche MathPow() nicht, warum hat das niemand gesehen?
/**
* Rotate a 32 bit integer value bit-wise 
* the specified number of bits to the right.
* This function is needed for calculations
* in the hash function makeMacicNumber()
*/
int bitRotate(int value, int count){
   int i, tmp, mask;
   mask = (0x00000001 << count) - 1;
   tmp = value & mask;
   value = value >> count;
   value = value | (tmp << (32 - count));
   return(value);
}
Ich aktualisiere jetzt das erste Posting.
 
7bit:
Ich brauche MathPow() nicht, warum hat das niemand gesehen?

Hierfür gibt es drei Hauptgründe:

  • Jeder, der bereits eine Hashing-Funktion verwendet, wird sie wahrscheinlich nicht durch Ihren Code ersetzen und sich daher nicht für die Details Ihres Codes interessieren.
  • Jeder, der derzeit keine Hashing-Funktion verwendet, aber denkt, dass es eine gute Idee sein könnte, wird Code wie den Ihren wahrscheinlich einfach als vertrauenswürdig ansehen und sich nur darum kümmern, ob er funktioniert oder nicht, und nicht darum, wie elegant oder optimiert er ist.
  • Ihr Ersatz von MathPow() durch eine bitweise Operation spart wesentlich weniger als eine Millisekunde pro Aufruf von makeMagicNumber(). Sie deuten an, dass makeMagicNumber() nur einmal während der Lebensdauer eines EA aufgerufen wird, und zwar in init(). Daher spart Ihre Änderung weniger als eine Millisekunde pro EA-Lebenszeit. Es ist eine völlig triviale Änderung (und verringert wohl die Klarheit des Codes).
 
jjc: verringert wohl die Klarheit des Codes

Ich würde nicht sagen, dass es die Klarheit verringert. Meine Hauptabsicht ist Klarheit, Eleganz und Genauigkeit, nicht Leistung.

Ich könnte auch Potenz, Multiplikation, Division (und Modulo) verwenden, um die eigentliche Bitverschiebung durchzuführen, ohne irgendwelche bitweisen Operatoren zu verwenden. Aber um der Eleganz (und auch der Klarheit) willen sollte ich es entweder ausschließlich mit dem einen oder dem anderen machen, aber nicht gemischt. Und da der Sinn der Funktion darin besteht, Bits zu verschieben, würde ich den Code nur verwirren, wenn ich Bitverschiebungen mit Multiplikationen durchführe.

Auch wenn Addition und Multiplikation mit ganzen Zahlen durchgeführt werden können, verwendet die MathPow()-Funktion intern Logarithmen, riecht nach Annäherung und ist unglaublich komplex im Vergleich zu dem, wofür ich sie brauche, sie verwendet und gibt einen doppelten Wert zurück, und das hat in einer Integer-Funktion, die nur n Bits verschieben soll, nichts zu suchen.

Vielleicht hätte ich die Frage stellen sollen , warum ich das nicht gesehen habe. Warum habe ich MathPow() überhaupt benutzt? Ich weiß es nicht. Das letzte Mal, dass ich Assembler gemacht habe, ist 15 Jahre her, heute bin ich es gewohnt, über Probleme in höheren Abstraktionen nachzudenken. Vielleicht war das der Grund. Irgendwo in meinem Gehirn gibt es eine starke Verbindung mit dem n-ten Bit als 2^n, ich habe das einfach aufgeschrieben, ohne eine Sekunde darüber nachzudenken. Ein Assembler-Programmierer hätte das nie getan. Linksverschiebung ist Multiplikation mit 2, Multiplikation mit 2 ist Linksverschiebung.

 
Hey Jungs, nur neugierig, warum Sie mehr als ein Experte laufen die gleichen tf, und Symbol mit den gleichen Einstellungen benötigen würde?

Meine Lösung für Persistenz ist es, die 32 Bits des int zu verwenden, um die tf's zu halten, die ich verwende (10 von ihnen), die Expertenversion oder Handelsmethode, die den Auftrag geöffnet (ich habe 4 von denen). Noch viele Bits zu ersparen, wenn ich brauchte. Ich verwende die bitweisen Operationen und einige Konvertierungsfunktionen, um dies zu handhaben. Ich weiß, dass andere dies oder etwas ähnliches tun, aber da dies nicht genug für Ihre Situationen zu sein scheint, versuche ich immer noch, meinen Kopf um die Frage zu wickeln, die ich gestellt habe.
 
7bit:

Wie würde in Ihrem Beispiel das Symbol() Teil des MN werden? Sie haben eine EA-Nummer und eine Timeframe-Nummer, aber was ist mit dem Symbol?

Das würde es nicht, aber das Money Management, das ich verwende, basiert auf der MN. In diesem Fall müssen sie also alle gleich sein, damit das MM alle offenen Trades berücksichtigt. Ich gebe immer den EA einschließlich der Version und der Prioritätseinstellungen, die ich verwende, in das Feld "Trade Comment" ein, damit ich weiß, welche Version und welchen TimeFrame der EA, den ich entwickle, verwendet und im MQL4 Strategy Tester protokolliert, und ich kann sie nach Trade#, Währungspaar oder Kommentarfeld sortieren. Wenn ich mir das Journal ansehe, zeigt es mir, für welche Währung der Handel ist. Wenn ich sie zur Analyse nach Excel übertrage, kann ich sie nach jedem beliebigen Feld sortieren.
Ich kann die Vorteile Ihres Ansatzes erkennen und werde ihn vielleicht irgendwann in der Zukunft anwenden. Da ich aber ein NuB bin, verwende ich MM aus der Codebasis von MQL4.Com. An diesem Punkt meiner Lernkurve im Programmieren ist MM also nicht meine Priorität. Wenn ich jedoch eine bessere Methode finde, die ich einbinden kann, werde ich das tun, bis MM auf meiner Prioritätenliste ganz oben steht und ich nichts dagegen habe, es zu verwenden. Wir NuBs brauchen jede Hilfe, die wir bekommen können!
Was den Namen und/oder die Versionsnummer angeht, so erlaubt MN nur Zahlen und keine Buchstaben.
Ich habe mir Ihren Code nicht angesehen, aber ich gehe davon aus, dass Ihr Algorithmus den Namen in einen Teil Ihres MN umwandelt, in diesem Fall würde er Ihnen nicht sofort sagen, welches Währungspaar Sie ansprechen.
 
FourX:
Ihr Algorithmus wandelt den Namen in einen Teil Ihrer MN um, so dass Sie nicht sofort erkennen können, um welches Währungspaar es sich handelt.

Er konvertiert zuverlässig jede Zeichenkette in eine eindeutige Ganzzahl. Diese Konvertierung ist eine Einbahnstraße, aber ich muss sie nie zurück konvertieren.

Alles, was ich wissen muss, ist, dass diese Geschäfte mit derselben Nummer zusammengehören. Es handelt sich lediglich um eine ID-Nummer, mit der sich alle Abschlüsse dieser spezifischen EA/Symbol/TF-Kombination mit nur einem einzigen if() in der Schleife leicht finden lassen. Das Einzige, was man über diese Nummer wissen muss, ist, dass sie für jede EA/Symbol/Zeitrahmen-Kombination eindeutig ist und dass sie deterministisch ist und sich nicht ändert, wenn mein PC abstürzt.

Alle Geschäfte, die logisch zusammengehören, haben die gleiche MN. Wenn ich zu einem späteren Zeitpunkt wissen möchte, auf welchem Symbol sie getätigt wurden (z. B. für eine Statistik am Ende des Monats), kann ich einfach OrderSymbol() für diese Aufträge verwenden.

 
circlesquares wrote >>
Hey Jungs, nur neugierig, warum Sie brauchen mehr als ein Experte läuft die gleiche tf, und Symbol mit den gleichen Einstellungen?

Meine Lösung für die Persistenz ist es, die 32 Bits des int zu verwenden, um die tf's zu halten, die ich verwende (10 von ihnen), die Expertenversion oder Handelsmethode, die den Auftrag eröffnet (ich habe 4 von denen). Noch viele Bits zu ersparen, wenn ich brauchte. Ich verwende die bitweisen Operationen und einige Konvertierungsfunktionen, um dies zu handhaben. Ich weiß, dass andere dies oder etwas ähnliches tun, aber da dies nicht genug für Ihre Situationen zu sein scheint, versuche ich immer noch, meinen Kopf um die Frage zu wickeln, die ich gestellt habe.


Ich kann nicht für andere sprechen, aber ich habe einen EA, der eine Weile dauern kann, um eine Bestellung zu schließen, und es verpasst neue Einstiegspunkte, weil es noch nicht von der vorherigen Bestellung geschlossen ist. Ich möchte, dass er jeden Einstieg unabhängig behandelt und jeden Handel nach den Regeln des jeweiligen Handels verfolgt (gleitender Sl, Schließen der Hälfte, wenn tp zuerst erreicht wird, usw.).
 
joetrader:


Ich kann nicht für andere sprechen, aber ich habe einen EA, der eine Weile brauchen kann, um eine Order zu schließen, und er verpasst neue Einstiegspunkte, weil die vorherige Order noch nicht geschlossen ist. Ich möchte, dass er jeden Einstieg unabhängig behandelt und jeden Handel nach den Regeln des jeweiligen Handels verfolgt (gleitender Sl, Schließen der Hälfte, wenn tp zuerst erreicht wird, usw.).

Ich verstehe. Sie müssen also auf die Antwort des Servers warten, während Sie in der Zwischenzeit andere Aufträge öffnen könnten?

Aber stoppt der Handelskontext nicht alle auftragsbezogenen Aktionen, wenn er beschäftigt ist?

Ich denke, solange es funktioniert, ist das alles, was wirklich zählt.

 

Es geht nicht so sehr um die Reaktion des Servers, sondern nur darum, dass ein Auftrag offen bleibt. So könnte der EA ein Kaufsignal erhalten und kaufen, und dann offen bleiben. Ein paar Stunden später kommt ein weiteres Kaufsignal, aber da der EA bereits eine offene Position hat, kauft er nicht, weil er darauf wartet, den ersten Auftrag zu schließen. Aber es gibt keinen Grund anzunehmen, dass das erste Kaufsignal profitabler ist als das zweite oder dass es etwas bringt, auf die Schließung des ersten zu warten, bevor der EA weitere Aufträge eröffnet. Aber ich arbeite noch daran, also ist es für mich noch Theorie :)