Helfen Sie mir, das Programmieren zu lernen. - Seite 3

 
Tio Nisla:
Ich wollte schon früher hinzufügen, dass, wenn einefunc()-Funktion neben der Rückgabe eines Betrags oder etwas anderem noch andere Manipulationen vornimmt, z.B. Handelsparameter berechnet, eine solche Verwendung schwer zu fangende Artefakte verursacht und den Autor eines Codes in einen Stupor versetzen könnte: "Ht? Wie kommt es, dass er viermal auftaucht? O_o F$#@!!! Sollte es nicht dreimal da sein? Warum belügt mich mein EA?". Das habe ich "Shithcod" genannt, worüber ein Experte bis in die Haarwurzeln empört war. Ich habe es nicht erwähnt, weil es offensichtlich ist, aber Sie haben es für mich getan. Aber Sie haben nicht berücksichtigt, dass die Adressierung über einen dynamisch berechneten Index ohne Neuinitialisierung des Arrays etwas anderes ist. Im nackten System führt dies in der Regel zu GPF, in Plus mit intelligenten Zeigern und Arrays zu einer Exception und ihrem Handler. In mql ist nicht klar, wohin das führt.

Was sind "schwer fassbare Artefakte"? Ist es eine religiöse Sache? Du denkst es dir aus und glaubst es?

 
Aleksandr Slavskii:

Meine Herren, Persönlichkeiten, aber lassen Sie uns die Wahrheit herausfinden.

Ich sehe im Beispiel, dassPositionsTotal()bei jeder Schleifeniteration aufgerufen wird.

Aber Dimitri, im Gegenteil, du sagst, dass der Compiler es anders macht - das verstehe ich nicht. Erklären Sie das.

Wenn Sie sagen wollen, dass die FunktionPositionsTotal() die Positionen nicht jedes Mal neu berechnet, sondern einfach den Wert einer Variablen zurückgibt, die die Anzahl der offenen Positionen enthält, dann haben Sie recht, es macht keinen Sinn, eine weitere Variable zu deklarieren, aber was hat der Compiler dann damit zu tun?

Und wenn diese Funktion die offenen Positionen jedes Mal neu berechnet, dann stellt sich heraus, dass der Compiler verstehen muss, ob der Wert dieser Funktion weitere Berechnungen beeinflusst und entweder eine Funktion oder eine Variable verwendet.

Ich scheine es nicht richtig zu machen.

Es wird jedes Mal neu berechnet oder nicht neu berechnet, aber der Aufruf von PositionTotal() ist definitiv kostspielig. Und das lässt sich durch ein einfaches Experiment leicht beweisen. Aber anstatt ein Killer-Experiment zu liefern, das mich in Stücke reißen würde, kommen sie mit ausgefallenen Argumenten und "schwer zu findenden Artefakten". Sie können den Beispielcode auf der ersten Seite finden, die Sie kennen, und sehen, wie er dort aussieht))) Er wurde absichtlich geändert, bevor er in das Forum aufgenommen wurde (großer Beifall). Und das nur, um unnötige Belastungen für einen Anfänger zu vermeiden.

Und der Compiler, ich meinte, dass er den Code optimiert und die Variable direkt aufruft, statt über eine Funktion:

int x;

for(;i<x;)

и

for(;i<F();)

int F(){return(x);}

Dies ist bei der Funktion ArraySize() deutlich zu sehen; man kann nicht zwischen dem Aufruf einer Funktion und der Verwendung einer Variablen mit dieser Funktion unterscheiden. Bei PositionsTotsl() ist dies jedoch leider nicht der Fall.

Übrigens können Sie auch der Deklaration von Variablen innerhalb einer Schleife auf den Grund gehen, was ebenfalls die Geschwindigkeit verringert. Was kommt nicht an die Wurzel? Sie wissen nichts davon? Obwohl wir auch hier streiten können, gibt es einen Unterschied zwischen 4 und 5.

 

Fragt PositionsTotal() nicht jedes Mal nach der Anzahl der offenen Positionen? Oder vielleicht ist es optimiert und speichert den Wert in eine Konstante mit einer Aktualisierungsmarkierung und gibt immer die gleiche Zahl zurück, wenn sie sich nicht ändert)?

Es muss eine interne Optimierung dieser Funktion geben. Die Entwickler sind nicht dumm, wenn sie eine so wichtige und potenziell kostspielige Funktion nach dem Motto "es wird schon gehen" einrichten.

Diejenigen, die sich darüber empören, mögen bitte prüfen, wie viel Zeit und Ressourcen es kostet, beide Varianten derselben Schleife auszuführen.

Es gibt keinen Grund, mit Kacke zu werfen.


Ich würde gerne den Quellcode von PositionsTotal() aus rein akademischem Interesse sehen.


Wenn man darüber nachdenkt, wäre es am einfachsten, eine globale Variable des Terminals zu erstellen, die diesen Wert speichert. Und nur diesen Wert zurückgeben. Und um sie beim Öffnen oder Schließen von Positionen zu aktualisieren - um die Variable sicher zu machen und sie zu synchronisieren, so dass, Gott bewahre, nichts dort geschrieben wurde.

Ich denke, dass es so gemacht wird.

Nun, die Daten über die Positionen selbst sind wahrscheinlich in einigen Datenstrukturen gespeichert, so dass es möglich war, sie zu erhalten, ohne sich unnötig an Server zu wenden. Im Allgemeinen denke ich, dass alles normal ist, was die Produktivität in jeder Variante von Call for/ betrifft.


Und der Codestil ist ästhetisch schön oder nicht, das entscheidet jeder für sich selbst)

 
Nikolay Mitrofanov:

Wer auch immer sich darüber empört, möge bitte prüfen, wie viel Zeit und Ressourcen es kostet, beide Varianten desselben Zyklus zu betreiben.

Es gibt keinen Grund, mit Kacke zu werfen.

Ich hoffe, das war nicht an mich gerichtet, denn ich zweifle nicht an der Autorität von Dmitriy.AuchTio Nislascheint schon lange zu programmieren, aber


Ich lerne noch, deshalb frage ich.

 

PositionsTotal() ist knifflig, sie muss immer die richtige Zahl zurückgeben und ihren Wert ändern, sobald sich die Anzahl der Positionen ändert. Daher ist es unwahrscheinlich, dass sie jemals so schnell sein wird wie eine einfache Variable oder ArraySize().

 
Aleksandr Slavskii:

...


Ich lerne noch, deshalb frage ich ja.

Wenn Sie lernen, sollten Sie sich nicht mit diesen Kleinigkeiten aufhalten. Konzentrieren Sie sich auf die Fähigkeit, Ihre Idee in Code umzusetzen (oder einen unbestimmten Prozess in eine Abfolge von Aktionen). Und dann kann der Code nach Belieben angepasst werden.

 
Dmitry Fedoseev:

Wenn Sie lernen, brauchen Sie sich um diese Details nicht zu kümmern. Konzentrieren Sie sich darauf, Ihre Idee in Code umzusetzen (oder einen unbestimmten Prozess in eine Folge von Aktionen). Und dann kann der Code nach Belieben angepasst werden.

Ich finde es gut, wenn man versucht, es zu verstehen und tiefer zu graben.

Wenn der Programmierer nicht auf kleine Dinge achtet, gewöhnt er sich an, den Code so zu schreiben, wie er es für richtig hält. Und dann bedeutet das Kämmen des Codes doppelte Arbeit, und zwar oft nicht nur für den Autor, sondern auch für diejenigen, die noch das Glück haben, mit dem Code zu arbeiten.

Warum sollte man sich die Mühe machen, Code zu schreiben, wenn man es auch richtig und gut machen kann und die Details versteht?)

Ihr Rat ist... nun ja... IMHO


Ihr Rat ist gut für einen erfahrenen Programmierer (mit starkem Selbstvertrauen), der dann aufräumen kann, weil er oder sie weiß, wo und was aufgeräumt werden muss.

 
Nikolay Mitrofanov:

Ich finde es gut, wenn jemand versucht, zu verstehen und tiefer zu graben...

Wenn der Programmierer nicht auf Kleinigkeiten achtet, gewöhnt er sich an, den Code auf die falsche Weise zu schreiben. Und dann bedeutet das Kämmen des Codes doppelte Arbeit, und zwar oft nicht nur für den Autor, sondern auch für diejenigen, die noch das Glück haben, mit dem Code zu arbeiten.

Warum sollte man sich die Mühe machen, Code zu schreiben, wenn man es auch richtig und gut machen kann und die Details versteht?)

Ihr Rat ist... nun ja... IMHO


Ihr Rat ist gut für einen erfahrenen Programmierer (stark selbstbewusst), der dann durchkämmen kann, weil er weiß, wo und was gekämmt werden muss.

Für Anfänger umso mehr - es ist besser, wenigstens irgendwie, aber ein Problem zu lösen, statt sich auf einem Niveau von Forengezänk wie "wie kann man hier ohne const schreiben, und hier ohne static, usw., usw. oder - oh Mann, wenn du diese Frage stellst, dann kommst du besser gar nicht in die Nähe von Programmierung".

Es vergeht keine Woche, in der mir nicht jemand einen Indikator schickt, um einen Code wie diesen zu korrigieren: for(int i=0;i<Bars;i++). Und Sie reiben hier Probleme auf, die Ihnen Geschwindigkeit geben könnten... Nun, 30 %.

Selbst effiziente EAs (im Sinne der Testgeschwindigkeit) sind eher ein Problem ihres Algorithmus, der jedes Mal für jede spezifische Strategie neu geboren wird, als ein Problem der syntaktischen Feinheiten.

 
Dmitry Fedoseev:

Für Anfänger umso mehr - es ist besser, das Problem wenigstens irgendwie zu lösen, als auf einem Niveau von Forengezänk wie "wie kann man hier ohne const schreiben, und hier ohne static, usw., usw. oder - oh Mann, wenn du diese Frage stellst, dann solltest du besser gar nicht an die Programmierung herangehen".

Es vergeht keine Woche, in der mir nicht jemand einen Indikator schickt, um einen Code wie diesen zu korrigieren: for(int i=0;i<Bars;i++). Und Sie reiben hier Probleme auf, die zu einer Beschleunigung führen können... Nun, 30 %.

Wenn ein unerfahrener Programmierer eine Frage im Forum stellt, bedeutet das, dass er die Antwort wissen will, dass er interessiert ist und sie braucht. Ich habe sogar einen Thread erstellt, um Ratschläge zu erhalten.

Wenn ich den Sinn des Themas richtig verstanden habe, ging es bei der Umsetzung seiner Idee nicht darum, "es einfach richtig zu machen, sondern es so gut und richtig wie möglich zu machen". Das ist gut. Das ist richtig.

"Irgendwie" ist bei jeder Tätigkeit ein schrecklicher Ansatz.

Erst herausfinden, dann mit Wissen handeln - das ist der beste Ansatz.

 
Nikolay Mitrofanov:

Wenn ein unerfahrener Programmierer eine Frage im Forum stellt, bedeutet das, dass er die Antwort wissen will, dass er interessiert ist und sie braucht. Er hat sogar einen Thread erstellt, um Ratschläge einzuholen.

Wenn ich den Autor des Threads richtig verstanden habe, dann geht es bei der Umsetzung seiner Idee nicht mehr um "mach was du willst, damit es funktioniert", sondern sofort um die bestmögliche und korrekte Umsetzung. Das ist gut. Das ist richtig.

"Irgendwie" ist bei jeder Tätigkeit ein schrecklicher Ansatz.

Erst zu verstehen, dann mit Wissen zu handeln ist das Beste.

Mit welchem Wissen? Wenn dieser Algorithmus nicht in der Natur vorkommt, sondern selbst erfunden werden muss, dann ist es der Algorithmus, der alles bestimmt.