Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 1177

 

Hallo!

Können Sie mir bitte sagen, wie ich den Indikator so einstellen kann, dass er nur beim Öffnen des Balkens und nicht bei jedem Tick funktioniert, und wie ich ihn nicht jedes Mal (bei jedem neuen Balken) über die gesamte Historie laufen lassen kann?

Ich möchte den Indikator als Alternative zum bisherigen Indikator verwenden.

Rostislav


 
Rost17: Können Sie mir bitte sagen, wie ich den Indikator so einstellen kann, dass er nur beim Öffnen des Balkens und nicht bei jedem Tick funktioniert, und wie ich ihn nicht jedes Mal (bei jedem neuen Balken) durch die gesamte Historie laufen lassen kann?
Datetime t;
Zunächst zu den Balken. Wenn ein neuer Balken gebildet wird, wird ein neuer Wert in Time[0] geschrieben - die Zeit, zu der der Balken geöffnet wird.
OnCalculate(...)
{
if(Time[0] == t) return(0); // Wenn dieser Balken abgearbeitet ist --> exit
t = Time[0];

Jetzt für die gesamte Historie: es wird langsam
 
STARIJ:
datetime t;
Zunächst zu den Bars. Wenn wir einen neuen Balken bilden, schreiben wir einen neuen Wert in Time[0] - die Zeit, zu der der Balken geöffnet wird.
OnCalculate(...)
{
if(Time[0] == t) return(0); // wenn dieser Takt abgearbeitet ist --> exit
t = Zeit[0];

Und nun zur ganzen Geschichte: Sie wird sich verlangsamen

Vielen Dank für die schnelle Antwort. Was ich frage ist, wie man es NICHT verlangsamen und durch die Geschichte laufen, wenn ein neuer Balken erscheint, sondern nur verarbeiten die neue Bar ...

Nun ist es folgendermaßen aufgebaut: for(int i=limit-1; i>=0; i--) und so wie ich es verstehe, bedeutet es, dass bei jeder Öffnung eines Balkens alle Werte der gesamten Historie neu berechnet werden, während man nur mit dem letzten Balken arbeiten sollte...

 
Rost17: Ich möchte wissen, wie man es NICHT verlangsamt und nicht den gesamten Verlauf durchläuft, wenn ein neuer Balken erscheint, sondern nur den neuen Balken verarbeitet...

Auf diese Weise wird der letzte Balken berechnet:

//| Bears Power                                                      |
//+------------------------------------------------------------------+
int OnCalculate(.....)
  {
   int limit=rates_total-prev_calculated; // Количество баров, которые будем считать = ВсегоБаров - РанееПросчитано
   if(rates_total<=InpBearsPeriod) return(0);

   if(prev_calculated>0) limit++; // Если давно считаем, то захватим и предыдущий бар для точности
   for(int i=0; i<limit; i++)
     {
      ExtTempBuffer[i]=iMA(NULL,0,InpBearsPeriod,0,MODE_EMA,PRICE_CLOSE,i);
      ExtBearsBuffer[i]=low[i]-ExtTempBuffer[i];
     }
   return(rates_total);
  }
 
STARIJ:

Schauen wir uns zuerst die Zeile an

Um es für mich klarer zu machen, habe ich es so umgeschrieben.

Aha!!! Jetzt beginne ich zu verstehen... In der Schleife ändert sich die Variable a von 1 auf 6. Bei den Werten dieser Variablen 1, 5 und 6 gibt es keine Aktion. Dann einfach

Oder in Ihrem Stil.

Das Ergebnis wird dasselbe sein, aber es wird schneller laufen!

Jetzt müssen Sie die Funktion Statistic loswerden, ihren Körper dreimal hintereinander schreiben, die formalen Parameter in jedem der drei Teile durch aktuelle Parameter ersetzen und doppelte Variablendeklarationen entfernen. Der gesamte Code wird etwas länger, aber die Ausführung ist schneller. Es macht Sinn, print() zu verwerfen - wer genau wird zu diesem Zeitpunkt das Nachrichtenprotokoll durchsehen? - Oder ersetzen Sie sie durch Alert(), um sie auf dem Bildschirm anzuzeigen. Außerdem gibt es eine Variable namZz2 - ändert sich ihr Wert?


Ich muss stats() anstelle von stats() verwenden. Dummerweise weiß ich, dass ich dreimal umschreiben kann, wie Sie gesagt haben, aber das Problem ist, dass das Ergebnis der Erfassung von Statistiken höchstwahrscheinlich mehr Arrays hinzufügen muss und ich früher oder später zu den ursprünglichen zurückkehren werde. Deshalb biete ich Ihnen einfache Wege an, die ich bereits kenne, und die mich leider an den Anfang führen werden. Deshalb schaue ich nach vorne, damit ich in Zukunft nicht mehr darauf zurückkommen muss!

for(int a=1;a<6;a++)
{
   if(a==2){Statistic(mZz2,namZz2);}
   if(a==3){Statistic(mZz3,namZz3);}
   if(a==4){Statistic(mZz4,namZz4);}
}

wie man diesen Code in den Statistiker einfügt!? eine einzige Prozedur zu sein, die Sie am Anfang, wie ich die Frage erklärte, bitte anschauen!

 
STARIJ:

So wird er für den letzten Balken berechnet:

Herzlichen Dank! Ich habe eine sehr alte Indikatorquelle. Könnten Sie es so einrichten, dass es nicht jedes Mal die gesamte Historie neu berechnet, nur bei Bar-Close arbeitet und den Pfeil nur auf den Bar setzt, nach dem das Signal erschien? Nun, und im neuen Stil, mit OnCalculate... Ich bin bereit, Ihnen die Kosten für Ihre Zeit zu erstatten... Wenn Sie dem zustimmen, wie kann man das am besten machen? Kann ich sie Ihnen in einer privaten Nachricht schicken oder wohin?
 
Игорь:

Hier ist ein Auszug aus dem Arbeitscode! Wie kann man sie in einer ungültigen Statistik ohne dazwischenliegende ungültige Statistik sammeln? Ich müsste den gesamten Code überarbeiten, um alle Arrays in einem einzigen zusammenzufassen, und versuchen, es von dort aus zu lösen!

Der von Ihnen zitierte Auszug aus Ihrem Arbeitscode ist entweder falsch oder Ihre Statistic()-Funktion tut nichts anderes als drucken, wenn sie von Stat() aus aufgerufen wird.

Auf jeden Fall wird es gleich nach der Rückkehr aufhören;.

Bitte geben Sie uns den gesamten Code, damit wir verstehen, was Sie wollen.

 

Für das Protokoll. Es gibt zu viele Threads im Forum, die Neulingen bei MQL4 helfen.

Dieser Thread wird nicht mehr unterstützt und ist geschlossen.


Bitte richten Sie alle Fragen an eines der folgenden aktiven Themen:

https://www.mql5.com/ru/forum/160683

https://www.mql5.com/ru/forum/160587

Alle weiteren Beiträge in diesem Thema werden gelöscht.


 
Hilfe kann ein bereits gekaufter Auftrag seinen Kaufpreis in 2 Stunden ändern
 
Ich möchte ein Bild einer Minecraft-Figur und eine Spitzhacke in meinen Händen, wenn ich profitabel bin.
Grund der Beschwerde: