Fehler, Irrtümer, Fragen - Seite 3151

 
Artyom Trishkin #:

Es gab schon immer eine Überprüfung: if(limit>1) limit=rates_total-1. Dies gilt für Fälle, in denen kein i+irgendetwas in der Berechnung vorkommt. Wenn ja, dann müssen diese "wie viele-etwas" in das Konstrukt aufgenommen werden: limit=rates_total-1-some-something.

Ohne sie würde es immer zu einem Array Overrun kommen. Denn rates_total ist nichts anderes als Bars(). Wenn es also 5000 Balken gibt und wir den Index 5000 ansprechen, fallen wir außerhalb der Grenzen des Arrays (die Berechnung der Balken beginnt bei Null).

In Ihrem Beispiel ist die Berechnung des Grenzwertes falsch:

Das sollte so sein:

Danach wird geprüft, ob das Limit>1 ist.

Und wenn die Grenze größer als eins ist, dann ist die Grenze = rates_total-1

Danke, Artem, und Entschuldigung für die Aufregung.
Richtig, es sollte einen Scheck geben, ich habe ihn nur vergessen.
Ich habe noch einen Kommentar im Code
//Check and calculate the number of calculated bars.
Offenbar hat das Kopieren mein Missverständnis verursacht.
Mit dem Scheck funktioniert alles, wie es sollte. Ich danke Ihnen.

 
Roman #:

Danke Artem!
Richtig, es sollte eine Prüfung geben, die ich vergessen hatte.
Mit dem Scheck funktioniert alles einwandfrei. Ich danke Ihnen.

Bitte sehr. Korrigieren Sie die Berechnung. Das ist nicht richtig - ich habe es oben betont.

int limit = rates_total-1-prev_calculated;

-1 sollte nicht hier sein.

Wenn rates_total 5000 ist und die beim vorherigen Aufruf von OnCalculate() berechneten Balken ebenfalls 5000 sind (prev_calculated), dann ist die Grenze gleich -1. Dementsprechend wird die Schleife gar nicht erst ausgeführt.

Wenn Sie auswählen möchten, wie der Indikator gelesen werden soll (durch Ticks auf dem Null-Balken oder nur bei der Eröffnung eines neuen Balkens), dann geben Sie eine Variable ein, die angibt, wie dies geschehen soll:

int end = (jeder Tick ? WRONG_VALUE : 0);

die Schleife wird wie folgt aussehen: for(int i=limit; i>end; i--) { //... }

und die Grenzwertberechnung wird korrekt sein, und die Schleife wird so sein, wie Sie sie haben wollen.

 

Korrekter Code.

i>=0 für jeden Tick

i>0 für neuen Balken

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,       
                 const int prev_calculated,   
                 const int begin,             
                 const double& price[])      
{
   ArraySetAsSeries(price, true);
   ArraySetAsSeries(IndBuff, true);
   
   //-------------------------------------------------------------------------
   //Расчёт и проверка количества просчитываемых баров
   int limit = rates_total-prev_calculated;
   
   if(limit>1) 
      limit = rates_total-1;
   

   //-------------------------------------------------------------------------
   //Расчёт индикатора
   for(int i=limit; i>=0; i--)
   {

      IndBuff[i] = price[i]; 

   }
   

   return(rates_total);
}
 
Nikolai Semko #:
Oder

Du hast nicht einmal gefragt, was du tun sollst... Sind die Telepathen aus dem Urlaub zurück? ;)

 
Roman #:

Korrekter Code.

i>=0 für jeden Tick

i>0 für einen neuen Balken

ArraySetAsSeries(IndBuff, true);

Dies wird besser in OnInit() verschoben

 
Artyom Trishkin #:

Du hast nicht einmal gefragt, was du tun sollst... Sind die Telepathen aus dem Urlaub zurück? ;)

:)
Artem, man muss kein Telepath sein, um zu sehen, dass der Mann sich vor ein paar Minuten angemeldet hat und das erste, was er gesehen hat, war "Bugs, bugs, questions"
Offensichtlich fragt er, ob er etwas kostenloses Geld bekommen kann, und will nicht zu viel Ärger machen...

 
Nikolai Semko #:

:)
Artem, man muss kein Telepath sein, um zu sehen, dass der Mann sich vor ein paar Minuten angemeldet hat und das erste, was er sah, "Fehler, Fehler, Fragen" war
. Er fragt offensichtlich, ob er etwas Geld umsonst bekommen kann, und dass er sich nicht zu sehr anstrengen soll...

Vielleicht hat er beschlossen, sich mit Bentley etwas dazuzuverdienen, indem er in einen Nachhilfelehrer investiert? :)

 
Artyom Trishkin #:

Vielleicht hat er beschlossen, etwas Geld für seinen Bentley zu verdienen, indem er in einen Tutor investiert und hart als Programmierer arbeitet. :)

Das glaube ich nicht, Artem.
Wenn er das Potenzial eines Programmierers hätte, würde er keine Mehrdeutigkeit und Unsicherheit zulassen.
:)
 
Roman #:

Wissen Sie, was am ärgerlichsten ist? Dass jedes Verhalten stillschweigend und ohne Vorwarnung hintergangen wird.
Und dann werden Menschen verletzt. Ich habe genug von diesem Metatrader.

Das Design eines Indikatorenzyklus ist einfach aus den alten Tagen durch Copy-Paste-Methode (und krumme Autovervollständigung) ohne Nachdenken entlehnt.

Mit der aktuellen Schnittstelle ist alles ganz einfach:

for(int bar=prev_calculated>0?prev_calculates-1:0 ; bar<rates_total; bar++) {

   int i=rates_total-1; // i используем если обращения как ArraySetSeries(x,true), иначе bar

   ....

}

return rates_total;

Der Push mit prev_calculated-1 ist in diesem Fall erforderlich, wenn Sie den letzten Balken bei jedem Aufruf neu berechnen müssen.

 
Maxim Kuznetsov #:

Es ist nur so, dass das Design des Indikatorenzyklus aus den alten Tagen des Copy-Paste (und der krummen Autovervollständigung) übernommen wurde, ohne darüber nachzudenken.

Mit der aktuellen Schnittstelle ist alles ganz einfach:

for(int bar=prev_calculated>0?prev_calculates-1:0 ; bar<rates_total; bar++) {

   int i=rates_total-1; // i используем если обращения как ArraySetSeries(x,true), иначе bar

   ....

}

return rates_total;

Das Crowding mit prev_calculated-1 ist in diesem Fall erforderlich, wenn Sie den letzten Balken bei jedem Aufruf neu berechnen müssen.

Ja, ich habe mich ein wenig über diese Aussage aufgeregt.
Gerade dann, wenn etwas funktioniert hat und jetzt nicht mehr, fangen die nervösen Ticks an ))
Und man fängt an, alles doppelt zu überprüfen und grundlos den Absturz zu beschuldigen und vergisst dabei eine Besonderheit, an die man sich natürlich nicht erinnert.
Und daran ist das Kopieren schuld. Ich denke, dass viele damit konfrontiert wurden.

Ich möchte vorschlagen, dass die Entwickler eigene Vorlagen für Indikatoren und EAs erstellen.
Sie können sie dann im Assistenten auswählen.

m

Einige C/C++-Editoren verfügen über diese Funktion.
Es ist sehr praktisch, die grundlegenden Vorlagen hinzuzufügen, mit denen Sie hauptsächlich arbeiten, und sie dann im Assistenten zu laden.
Standard-MQL-Vorlagen sind nicht ganz dasselbe.
Natürlich können wir sagen, dass wir Vorlagen schreiben und sie dann kopieren können.
Und wieder kommen wir auf das heimtückische Wort "copy-paste" zurück. Und die Tatsache, dass wir es automatisieren und dem Programmierer das Leben leichter machen können, wird nicht berücksichtigt.