Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Ich kann mich nur immer wieder wiederholen. Das gibt es sicherlich bereits, man brauch nur etwas suchen und dann verwenden oder den Code kopieren - spart Zeit, Ärger, Frust und viel Arbeit.
Danke für die Erklärung mit den Takten.
Leider muss ich zugeben, dass mir das GNU Zeug zu hoch ist. Mein Ziel ist auch, MQL5 einigermaßen zu lernen und nicht unbedingt andere Sprachen. In der Gnu Doku weiß ich gar nicht wo ich anfangen soll. Die Information mit den Takten habe ich da nicht so auf Anhieb gefunden.
Also gut. Dass der Compiler die Befehle der höheren Sprache in Binärcode umsetzt ist so ziemlich klar. Wo ich Probleme habe sind die konkreten kleinen Vor- und Nachteile von bestimmten ungewohnten Schreibweisen.
Die Konstanten, gut das kann man dann auch mit Eingabeparametern machen, oder nicht? Gibt es was zu beachten bezüglich & Zeichen bei der Übergabe von Variableln?
Das hier ist nicht so einfach zu verstehen:
value = (value * (cond == Null)) + (value * (cond != Null));
Zunächst mal sieht es von der Formel her aus wie Quantenmechanik: Der eine Term mit der Bedingung die nicht zutrifft wird gleich null während der andere wo sie zutrifft einen Wert annimmt bzw der Wert wird mit eins multipliziert (Schrödingergleichung?). Es irritiert mich aber, dass es ebenso umgekehrt funktioniert... wie kann es ein if Statement ersetzen, wenn das Ergebnis immer gleich ist? Was wir brauchen sind doch entweder oder? Welcher Wert ist mit value eigentlich gemeint?
Muss es nicht eher so heißen: result = (value1 * (cond == Null)) + (value2 * (cond != Null)); ?Ich sage jetzt mal konkreter:
if(Ask>MA[0]) {Trade.Buy(...);} wie würde man das umsetzen? Es gibt ja hier mehrere Werte Ask und MA[0] bzw. man könnte sagen Ask-MA[0] ist ein Wert, der positiv sein muss wenn ein Kaufkontrakt eröffnet werden soll. Nur wie verknüpfe ich das dann mit dem Kaufbefehl?
Oder warte...Beispiel:
(Trade.Buy()*(Ask>MA[0])
(Trade.Sell()*(Bid<MA[0]) Würde das so gehen?
Oder vielleicht so:
void CheckTradingConditions(const int& bid, const int& ask)
{
(Trade.Buy()*(Ask>MA[0]))+((Trade.Sell()*(Bid<MA[0]))+(return;)
}
oder mit
const uint x = Ask>MA[0] ? Trade.Buy(...) : Null
Wäre das so richtig?
Ich verstehe. Lass mich dir Beispielcode geben.
Sagen wir du willst einen gleitenden Durchschnitt aus einer Zahlenserie errechnen der NULL-Werte ausschließt. Erstes Beispiel ist mit "Conditional Breaks" und das Zweite ist ohne.
Und hier nun eine Version ohne Conditional Breaks:
Ähnlich verhält es sich auch bei einem Funktionsaufruf, allerdings gibt es hier ein paar Voraussetzungen. Die unter bestimmten Bedingungen zu rufende Funktion muss einen Wert zurück geben. Void-Funktionen gehen nicht.
Beispiel für einen Non-Conditional Funktionsaufruf:
BTW, Referenzen können nicht als const deklariert werden, da diese bei Natur geändert werden können/sollen... Warum sollte eine Funktion eine Referenz entgegennehmen, wenn diese nicht geändert werden darf?
Daher geht folgendes nicht:
Ich hoffe diese Beispiele bringen das etwas deutlicher ans Licht.
Zum Messen der Unterschiede der verschiedenen Arten der Evaluierung des Codeablaufs kann folgender Snippet eingefügt werden:
Sollte die Ausgabe NULL sein, dann liege es daran, dass der Code zu schnell ausgeführt wurde.
Eine Schleife kann dann helfen, den Code mehrfach auszuführen, sodass genug zeit vergeht um einen Wert zu erhalten.
Der MQL Compiler ist von einem C/C++ Compiler abgeleitet worden und daher habe ich auf die Doku vom GNU verwiesen. Das meiste Verhalten ist identisch, jedoch mit Einschränkungen.
Die Ausführungszeiten für einen Assembler Befehl sind in der ISA zu finden. - Allerdings sind das nur die Zeiten für einen Assembler Befehl. Für einen tieferen Einblick ist es notwendig zu wissen welche Assembler Befehle der Compiler verwendet um eine zB For-Schleife abzubilden.
Es gibt Online Compiler die einem den Assembly anzeigen. Daran kann man dann die ungefähre Abfolge auslesen und diese dann in der ISA nachschlagen. Dann ist es möglich zu sehen wie viel Zeit die CPU für einen Anweisungsblock benötigen wird.
Ich glaube der entscheidende Unterschied zwischen Quantenmechanik und arithmetischer Logik ist der zeitliche Ablauf. Die CPU arbeitet eine Sequenz immer in der gegebenen Reihenfolge ab. Bei "Schrödingers Katze" war/ist das nicht der Fall, es geschieht ein Informationsaustausch im selben Augenblick. Hier ist der entscheidende Unterschied, denke ich.
Ich verstehe. Lass mich dir Beispielcode geben.
Sagen wir du willst einen gleitenden Durchschnitt aus einer Zahlenserie errechnen der NULL-Werte ausschließt. Erstes Beispiel ist mit "Conditional Breaks" und das Zweite ist ohne.
Und hier nun eine Version ohne Conditional Breaks:
Ähnlich verhält es sich auch bei einem Funktionsaufruf, allerdings gibt es hier ein paar Voraussetzungen. Die unter bestimmten Bedingungen zu rufende Funktion muss einen Wert zurück geben. Void-Funktionen gehen nicht.
Beispiel für einen Non-Conditional Funktionsaufruf:
BTW, Referenzen können nicht als const deklariert werden, da diese bei Natur geändert werden können/sollen... Warum sollte eine Funktion eine Referenz entgegennehmen, wenn diese nicht geändert werden darf?
Daher geht folgendes nicht:
Ich hoffe diese Beispiele bringen das etwas deutlicher ans Licht.
Zum Messen der Unterschiede der verschiedenen Arten der Evaluierung des Codeablaufs kann folgender Snippet eingefügt werden:
Sollte die Ausgabe NULL sein, dann liege es daran, dass der Code zu schnell ausgeführt wurde.
Eine Schleife kann dann helfen, den Code mehrfach auszuführen, sodass genug zeit vergeht um einen Wert zu erhalten.
Der MQL Compiler ist von einem C/C++ Compiler abgeleitet worden und daher habe ich auf die Doku vom GNU verwiesen. Das meiste Verhalten ist identisch, jedoch mit Einschränkungen.
Die Ausführungszeiten für einen Assembler Befehl sind in der ISA zu finden. - Allerdings sind das nur die Zeiten für einen Assembler Befehl. Für einen tieferen Einblick ist es notwendig zu wissen welche Assembler Befehle der Compiler verwendet um eine zB For-Schleife abzubilden.
Es gibt Online Compiler die einem den Assembly anzeigen. Daran kann man dann die ungefähre Abfolge auslesen und diese dann in der ISA nachschlagen. Dann ist es möglich zu sehen wie viel Zeit die CPU für einen Anweisungsblock benötigen wird.
Ich glaube der entscheidende Unterschied zwischen Quantenmechanik und arithmetischer Logik ist der zeitliche Ablauf. Die CPU arbeitet eine Sequenz immer in der gegebenen Reihenfolge ab. Bei "Schrödingers Katze" war/ist das nicht der Fall, es geschieht ein Informationsaustausch im selben Augenblick. Hier ist der entscheidende Unterschied, denke ich.
Ja danke für die Erklärung und die Mühe.
BTW, mir ist ein Fehler aufgefallen, naja, so zu sagen...
Ich habe gesagt, es macht keinen Sinn eine Referenz als const zu deklarieren. Dies ist nicht ganz richtig.
Ein Beispiel ist diese Funktion:
Hintergrund ist ganz einfach, dies sorgt dafür, dass das Array array[] beim Funktionsaufruf nicht kopiert wird, was natürlich viel schneller ist. Und es stellt sicher, dass die gerufene Funktion das Array nicht ändern kann. Somit ist eine Konsistenz gegeben.
Beispiel für einen Non-Conditional Funktionsaufruf:
Okay, ich bin gerade dabei mir jetzt ein paar von den Sachen, die Du angemerkt hast, draufzuschaffen.
Jetzt habe ich endlich die Zeit gefunden, diese Prinzipien auszuprobieren und zu verinnerlichen.
Ich glaubte, verstanden zu haben, dass man "&&" zwischen boolschen Ausdrücken anstandslos gegen "*" austauschen könne, da es sich um Einsen und Nullen handelt, die man miteinander multiplizieren kann. Doch an dieser Stelle gab es bei meinem Experiment ein Problem. Anscheinend kann man das doch nicht einfach austauschen, es verhält sich nicht gleich.
Ist aber jetzt ziemlich off-topic hier, darum würde ich mich freuen, wenn Du Zeit und Lust hättest, mal in dem anderen Thread vorbeischauen.
https://www.mql5.com/de/forum/370021
Gruß