Fehler, Irrtümer, Fragen - Seite 3121

 
x572intraday #:
Wenn Sie es wissen, sagen Sie es mir bitte. Wenn Sie eine neue Version eines bestehenden Codes in CodeBase hochladen, wird dann das Verbot, erneut abzustimmen, für die früheren Entwickler zurückgesetzt und sie können erneut für die neue Version abstimmen? Ich selbst bezweifle das stark, aber wenn es möglich wäre, wäre es fair, die vorherige Bewertung anstelle der neuen zurückzusetzen (die hypothetisch nicht niedriger als die vorherige sein sollte), da sich der Code weiterentwickelt und die neue Version den Wähler vielleicht mehr zufrieden stellt, während die alte Bewertung für den alten Code ungültig würde. (Allerdings wächst mit dem Funktionsumfang auch der Code, so dass es zu neuen Fehlern und Pannen kommen kann, die noch störender sind. Es kann alles passieren... und die neue Punktzahl könnte niedriger sein, aber das ist in Ordnung für mich).

Hören Sie auf, sich über die niedrige Bewertung Ihrer ...codes die Haare zu raufen. Wenn eine Person Ihrem Code die Note 1 gibt, bedeutet das nicht, dass er so ist, wie er ist. Nun, schreiben Sie ihn mindestens 100 Mal neu... und alle 100 Mal wird dieser Code so bewertet werden. Ist das so schwer zu verstehen?

 
Alexey Viktorov #:

Hören Sie auf, sich über die niedrige Bewertung Ihrer ...codes die Haare zu raufen. Wenn eine Person Ihrem Code die Note 1 gibt, bedeutet das nicht, dass er so ist, wie er ist. Nun, wiederholen Sie es mindestens 100 Mal... und alle 100 Mal wird dieser Code so bewertet werden. Ist das so schwer zu verstehen?

Vielleicht spiegelt Ihr Lebenslauf die Realität der Wahl wider, und das ist traurig. Aber ich bin nicht traurig über mich selbst - diese virtuellen Sterne kann man nicht mit Tee trinken und in mein Portemonnaie stecken, ich bin enttäuscht über das Konzept der Art und Weise, wie die Produkte neuen Nutzern präsentiert werden, und mache mir Sorgen um sie. Wenn es keine verlässlichen Bewertungen gibt, können die Nutzer einfach nicht effektiv nach dem Kriterium "Sortieren nach Bewertung" nach dem gewünschten Produkt suchen. Es stellt sich heraus, dass das Bewertungssystem ein leeres System ist, und man bleibt auf der Suche nach dem richtigen Produkt anhand des Namens/der Beschreibung, anstatt auf die nutzlose Anzahl von Sternen zu vertrauen. Andernfalls werden sie einfach weiter Sachen rausfischen... was an der Oberfläche schwimmt (zu Recht oder zu Unrecht) und was sie wirklich brauchen, wird übersehen. Ich habe nur vorgeschlagen, dass dies geändert werden sollte, um mehr Nachdenklichkeit zu erzeugen. Aber wenn niemand gegen diese Realität ankämpfen will, wasche ich meine Hände in Unschuld.

 
x572intraday #:

Ihre Zusammenfassung mag die Realität der Wahl widerspiegeln, und das ist enttäuschend. Aber ich bin nicht traurig über mich - diese virtuellen Sterne kann man nicht mit Tee trinken und in mein Portemonnaie stecken, ich bin enttäuscht über das Konzept der Art und Weise, wie die Produkte neuen Nutzern präsentiert werden, und mache mir genau darüber Gedanken. Wenn es keine glaubwürdige Bewertung gibt, können die Nutzer einfach nicht effektiv nach dem Kriterium "Sortieren nach Bewertung" nach dem gewünschten Produkt suchen. Es stellt sich heraus, dass das Bewertungssystem ein leeres System ist, und man bleibt auf der Suche nach dem richtigen Produkt anhand des Namens/der Beschreibung, anstatt auf die nutzlose Anzahl von Sternen zu vertrauen. Andernfalls werden sie einfach weiter Sachen rausfischen... was an der Oberfläche schwimmt (zu Recht oder zu Unrecht) und was sie wirklich brauchen, wird übersehen. Ich habe nur vorgeschlagen, dass dies geändert werden sollte, um mehr Nachdenklichkeit zu erzeugen. Aber wenn niemand gegen diese Realität ankämpfen will, wasche ich meine Hände in Unschuld.

Lassen Sie uns einen Blick auf Ihren Code werfen.

   int calculated=iBars(_Symbol,PArray[0]);

   if(calculated<=0)
      return(0);

   if(!GlobalVariableGet(_Symbol+": PSR_bars_calculated") || calculated!=GlobalVariableGet(_Symbol+": PSR_bars_calculated") ||
      calculated>GlobalVariableGet(_Symbol+": PSR_bars_calculated")+1)
   {
      if(!GlobalVariableGet(_Symbol+": PSR_SingleActuation") || (GlobalVariableGet(_Symbol+": PSR_SingleActuation") &&
         calculated!=GlobalVariableGet(_Symbol+": PSR_bars_calculated")))
      {
         for(int p=0; p<ArraySize(PArray); p++)
         {

Jeder Tick löst den Zugriff auf globale Variablen aus, jeweils 4 Anfragen.

Daraus folgt, dass Sie diesen Code NICHT auf Ihrem persönlichen Rechner verwenden können, sondern an einem anderen Ort, an dem Sie Ihre Festplatte nicht schonen.

In einer Schleife in einer Schleife während der Suche 3 mal ArraySize aufgerufen werden sollte , während es zwei von ihnen sind, ist dies eine zusätzliche Belastung für den Prozessor, das ist auch unerwünscht, Code Leistung sinkt.

DeInite löscht Objekte auf eine seltsame Art und Weise, hier ist nichts falsch, aber es ist ein schlechtes Beispiel für Anfänger, wenn Sie es normal machen, sollten Sie ein Präfix beim Erstellen von Objekten eingeben undsie ohne übermäßige Neuberechnungen löschen.

Ich gebe 2 Punkte für Ihren Code.

Für die Arbeit des Indikators - ich weiß es nicht, ich habe es nicht laufen.

Zielsetzung?

 
Vitaly Muzichenko #:

Schauen wir uns Ihren Code einmal an.

Bei jedem Tick wird der Zugriff auf globale Variablen ausgelöst, jeweils 4 Anfragen

Daraus folgt, dass Sie diesen Code NICHT auf Ihrem persönlichen Rechner verwenden können, sondern an einem anderen Ort, an dem Sie Ihre Festplatte nicht schonen.

In einer Schleife in einer Schleife während der Suche 3 mal ArraySize aufgerufen werden sollte , während es zwei von ihnen sind, ist dies eine zusätzliche Belastung für den Prozessor, das ist auch unerwünscht, Code Leistung sinkt.

DeInite löscht Objekte auf eine seltsame Art und Weise, hier ist nichts falsch, aber es ist ein schlechtes Beispiel für Anfänger, wenn Sie es normal machen, sollten Sie ein Präfix beim Erstellen von Objekten eingeben undsie ohne übermäßige Neuberechnungen löschen.

Ich gebe 2 Punkte für Ihren Code.

Für die Arbeit des Indikators - ich weiß es nicht, ich habe es nicht laufen.

Zielsetzung?

1. Bei jedem Tick gibt es einen Aufruf an den GP, so dass bei jedem Tick und auch bei jeder Neuinitialisierung (z. B. bei Übergängen durch TFs) der wichtigste und schwerere Code inOnCalculate() nicht ausgeführt wird und der Indikator schneller arbeitet. Die Berechnung neuer Daten - nur beim Auftreten eines neuen Tiefstwertes D1, was viel seltener ist, als bei jedem Tick.

2. Ich habe den Code gründlich überarbeitet, aber ich habe einige unnötige Vergleichsoperationen in if() belassen, weil ich sicher weiß, dass sie die Leistung nicht beeinträchtigen werden.

3. Das mit dem MUSS nicht sein, das ist stark übertrieben. Sie können es herunterladen und sich selbst davon überzeugen: der Indikator fliegt.

4. Ich wusste nicht, dass die GPs auf den AF heruntergeladen und dann jedes Mal, wenn sie in einer laufenden MT5-Sitzung aufgerufen werden, von derselben Stelle gelesen werden. Ich denke immer noch, dass sie einmal vom LCD in den RAM gelesen werden, wenn ich das Terminal starte und dort leben, und der Indikator greift auf sie im RAM zu, nicht auf das LCD.

5. Ich glaube nicht, dass ArraySize() eine teure Funktion ist. Und selbst wenn es teuer ist, werden Sie es in diesem speziellen Code nicht bemerken. Ich würde diese Funktion wahrscheinlich in meinem ersten Indikator optimieren, wo sie recht häufig verwendet wird, während der Indikator selbst viel komplexer und ressourcenintensiver ist.

6. In OnDeinit() verwende ich:

ObjectsDeleteAll(0,StringSubstr(EnumToString(PArray[p]),7)+" "+line_types[lt]+" l",0,-1);

wobei gerade dort das Präfix " l" entfernt wird (bei der Erstellung der Objekte wurden die Namen " label" und " line" verwendet.

7. Sie haben nun getan, was ein Benutzer, der den Code heruntergeladen und verstanden hat, tun sollte. Sie haben die Fehler gefunden - auch das gehört zum MMS-Lernen.

8. Fazit: 1.) mein Hauptargument für den nicht-idealen Code dieses Indikators - Einfachheit, Kompaktheit und Geschwindigkeit... plus perfekte Arbeit; 2.) mein zweites Hauptargument des unvollkommenen Codes - das Fehlen selbst schlechter Analoga in Bezug auf Geschwindigkeit und Vielseitigkeit (siehe die Diskussion über die Originale anderer) und die Verfügbarkeit von Verbesserungen im Vergleich zum Original, das übrigens eng ist und nicht in kompakte Schleifen gefaltet ist, was die große Anzahl ähnlich wiederholter Blöcke betrifft.

9. Trotz Punkt 7 haben Sie den Code eines anderen nicht wirklich verstanden. Ihre Punktzahl von 2 ist zu niedrig. Ich würde Ihnen nicht empfehlen, Softwareprodukte nach ihrem Code zu bewerten. Ich werde nichts über Objektivität sagen, weil es unmöglich ist, von einem einzelnen Nutzer Objektivität zu erwarten. Eine objektive Einschätzung (Bewertung) ist nur als Summe der Einschätzungen mehrerer vernünftiger Nutzer möglich und muss nicht unbedingt hoch sein.

 
x572intraday #:

1. Bei jedem Tick gibt es einen Verweis auf den GP, so dass bei jedem Tick sowie bei jeder Neuinitialisierung (z. B. bei Übergängen durch TFs) nicht der gesamte Haupt- und schwerere Code inOnCalculate() ausgeführt wird, und der Indikator schneller arbeitet. Die Berechnung neuer Daten - nur beim Auftreten eines neuen Tiefstwertes D1, was viel seltener ist, als bei jedem Tick.

2. Ich habe den Code gründlich überarbeitet, aber ich habe einige überflüssige Vergleichsoperationen in if() belassen, weil ich sicher weiß, dass sie die Leistung nicht beeinträchtigen werden.

3. Über das MUSS - stark übertrieben. Sie können den Indikator herunterladen und sich selbst davon überzeugen, dass er fliegt.

4. Ich wusste nicht, dass die GPs auf die Festplatte übertragen und dann bei jedem Zugriff innerhalb einer laufenden MT5-Sitzung von dort gelesen werden. Ich denke immer noch, dass sie einmal von der Festplatte in den RAM gelesen werden, wenn ich das Terminal starte und dort leben, und der Indikator greift auf sie im RAM zu, nicht auf der Festplatte.

5. Ich glaube nicht, dass ArraySize() eine teure Funktion ist. Und selbst wenn es teuer ist, werden Sie es in diesem speziellen Code nicht bemerken. Ich würde diese Funktion wahrscheinlich in meinem ersten Indikator optimieren, wo sie recht häufig verwendet wird, während der Indikator selbst viel komplexer und ressourcenintensiver ist.

6. In OnDeinit() verwende ich:

wobei gerade dort das Präfix " l" entfernt wird (bei der Erstellung der Objekte wurden die Namen " label" und " line" verwendet.

7. Sie haben nun getan, was ein Benutzer, der den Code heruntergeladen und verstanden hat, tun sollte. Sie haben die Fehler gefunden - auch das gehört zum MMS-Lernen.

8. Fazit: 1.) mein Hauptargument für den nicht-idealen Code dieses Indikators - Einfachheit, Kompaktheit und Geschwindigkeit... 2.) mein zweites Hauptargument des unvollkommenen Codes - das Fehlen von Analoga in Bezug auf Geschwindigkeit und Vielseitigkeit (siehe die Diskussion über das Original eines anderen) und die Verfügbarkeit von Verbesserungen im Vergleich zum Original, das übrigens eng ist und nicht in kompakte Schleifen in Form einer großen Anzahl von ähnlich wiederholten Blöcken gefaltet ist.

9. Trotz Punkt 7 haben Sie den Code eines anderen nicht wirklich verstanden. Ihre Punktzahl von 2 ist zu niedrig. Ich würde Ihnen nicht empfehlen, Softwareprodukte nach ihrem Code zu bewerten. Ich werde nichts über Objektivität sagen, weil es unmöglich ist, von einem einzelnen Nutzer Objektivität zu erwarten. Eine objektive Schätzung (Bewertung) ist nur als Summe der Schätzungen einiger vernünftiger Nutzer möglich und muss nicht unbedingt hoch sein.

Das Löschen nach Präfix geht wie folgt: ObjectsDeleteAll(0, "pref_"); // "pref_label" und " pref_line"

Fügen Sie zumindest die erste Zeile zu OnCalculate hinzu, um die Adresse bei einem neuen Balken und nicht bei jedem Tick wie jetzt zu verwenden

 
Vitaly Muzichenko #:

Löschen nach Präfix, etwa so: ObjectsDeleteAll(0, "pref_"); // "pref_label" und " pref_line"

Fügen Sie zumindest die erste Zeile zu OnCalculate hinzu, damit die Referenz bei einem neuen Balken erfolgt und nicht bei jedem Tick, wie es jetzt der Fall ist

Übrigens, zu Punkt 7: Ich bin selbst in der MQL5-Dokumentation auf Fehler gestoßen, die seit vielen Jahren nicht mehr korrigiert werden.

 
Vitaly Muzichenko #:

Das Löschen nach Präfix funktioniert folgendermaßen: ObjectsDeleteAll(0, "pref_"); // "pref_label" und " pref_line"

Es so zu löschen, wie Sie es vorschlagen, ist nicht sinnvoll, weil der Anfang des Präfixes dynamisch ist: entweder{D1}, oder {W1}, oder{MN1} und dann kommt ein unveränderliches Präfix wie " l...". Sie können dynamische und statische Präfixe vertauschen und sie je nach Version sicher entfernen, aber es ist nicht sinnvoll, weil es unbequem ist, Informationen als "R1{D1}" zu nehmen, während es bequemer ist,"{D1} R1" zu verwenden. Ich habe das alles schon vor langer Zeit durchdacht und genau so gemacht.

 
x572intraday #:

Es gibt keine sinnvolle Möglichkeit, es auf die von Ihnen vorgeschlagene Weise zu löschen, da der Anfang des Präfixes dynamisch ist: entweder{D1} oder {W1} oder{MN1}, und dann gibt es ein unveränderliches Präfix wie " l...". Sie können dynamische und statische Präfixe vertauschen und sie je nach Version sicher entfernen, aber es ist nicht sinnvoll, weil es unbequem ist, Informationen als "R1{D1}" zu nehmen, während es bequemer ist,"{D1} R1" zu verwenden. Ich habe das alles schon vor langer Zeit durchdacht und genau so gemacht.

DrawTheLine("pref"+line_types[lt], St
 
Vitaly Muzichenko #:

Aber ja, im Prinzip könnte man das tun. Ich habe mich oben kurz erklärt, weil ich damals darüber nachdachte:

ObjectSetString(0,tf+" "+LineType+" label",OBJPROP_TEXT,"{"+tf+"}   "+LineType);

nicht über Objektnamen. Das Diagramm liest genau das, was mitOBJPROP_TEXTfür Beschriftungen festgelegt wurde, aber Objektnamen können auf eine weniger lesbare Weise unterzeichnet werden, da sie versteckt sind und selten gelesen werden.

Auf der anderen Seite, in der "Liste der Objekte" (Strg+b) ist es besser, lesbare Objektnamen zu sehen, daher ist meine Methode vorzuziehen. Darüber hinaus gibt es Fälle, in denen Objektnamen extrem lang sein müssen, so dass ein zusätzliches"pref_" völlig inakzeptabel wäre.
 
x572intraday #:

Im Prinzip könnte man das aber tun. Ich habe mich oben kurz erklärt, weil ich damals darüber nachdachte:

nicht über Objektnamen. Das Diagramm liest genau das, was mitOBJPROP_TEXTfür Beschriftungen festgelegt wurde, aber Objektnamen können weniger lesbar gezeichnet werden, da sie versteckt sind und selten gelesen werden.

Auf der anderen Seite, in der "Liste der Objekte" (Ctrl+b) ist es wünschenswert, lesbare Objektnamen zu sehen, daher ist meine Version immer noch vorzuziehen. Darüber hinaus gibt es Fälle, in denen Objektnamen extrem lang sein müssen, so dass ein zusätzliches"pref_" völlig inakzeptabel ist.

und wenn jemand noch ein Programm mit grafischen Objekten hat, wird Ihre Art von Präfix "l" < wo einfach löschen durch Präfix " l" (die Namen "label" und "line" wurden verwendet, wenn Objekte erstellt wurden >

Erledigt alle Objekte, die mit"l" beginnen, in einem Drittanbieterprogramm. Dies ist keine gute Lösung