Fehler, Irrtümer, Fragen - Seite 589

 
Ashes:

Man muss über den Tellerrand schauen (c)

Ich sehe keine Gründe, die gegen einen separaten Cloud-Lauf sprechen (außer dem Preis).

Eine eigenständige Ausführung in der Cloud wird in vielen Fällen langsamer sein als auf dem lokalen Kern.
 
joo:
Ein einzelner Lauf in der Cloud wird in vielen Fällen langsamer sein als auf dem lokalen Kern.
Unterhttps://www.mql5.com/ru/forum/1111/page598#comment_125691 finden Sie ein Szenario. Beachten Sie das Wort CAN. Die Einschränkung erscheint weit hergeholt.
 

Es ist ein Problem aufgetreten.

Im Code des Indikators in OnCalculate() gibt es diese Zeile (oder genauer gesagt einige ähnliche Zeilen):

ArrayInitialize(FractalsBuffer,EMPTY_VALUE);
Der FractalsBuffer ist kein Hilfsberechnungspuffer, sondern der Hauptpuffer, der direkt für die grafische Darstellung zuständig ist, so dass er unbedingt verknüpft werden muss:
SetIndexBuffer(0,FractalsBuffer,INDICATOR_DATA);

die bereits durchgeführt wurde. Aber die Bindungsfunktion hat einen direkten Effekt, der manchmal als Nebeneffekt (auf eine schlechte Art) wirkt. Durch CopyBuffer(ind_handle,0,0,amount,FractalsBuffer) wird der Puffer nicht über die gesamte Länge des Zeitrahmens gefüllt, sondern nur teilweise, aus seinem kleinen Segment, durch den Betrag. Aber ArraySize(FractalsBuffer) überzeugt uns eindeutig davon, dass die Größe des Puffers (d.h. der belegte physische Speicher) der Anzahl der Balken des gesamten Verlaufs entspricht, d.h. am Ende wird er bis zum Maximum genutzt, einschließlich des ineffizienten Teils. Wenn Sie später in der Schleife mit den Pufferwerten arbeiten wollen, müssen Sie natürlich nicht den gesamten Puffer durchsuchen - Sie können einfach die notwendigen Grenzen angeben und innerhalb dieser Grenzen arbeiten. Aber erstens hebt das die schreckliche Speicherallokation nicht auf und zweitens ist die unvermeidliche Funktion im Code ArrayInitialize erlaubt es nicht, den Puffer mit dem notwendigen Wert zu initialisieren. müssen Sie Zeit und Strom für eine vollständige Neuinitialisierung aufwenden. Dadurch wird der Indikator merklich langsamer. Und drittens ein Zitat aus der Beschreibung der Funktion ArrayResize: "Andyou should keep in mind that . es ist nicht möglich, die Größe dynamischer Arrays zu ändern, die mit der Funktion SetIndexBuffer() als Indikatorpuffer zugewiesen werden."Wenn wirSetIndexBuffer zugunsteneiner manuellen Manipulation der Puffergröße mit ArrayResize ablehnen, wird der Indikator selbst zusammenbrechen.

Bitte schlagen Sie ein Rezept zur Wiederherstellung vor. Oder betrachten Sie dies als eine Anwendung zur Behebung dieses Problems in der Sprache selbst.
 
x100intraday:

Es ist ein bisschen durcheinander...

1. es ist sinnvoll, den Puffer einmal zu Beginn zu initialisieren if(prev_calculated==0)

2. Sie können festlegen, ab welchem Balken die Daten gezeichnet werden, etwa so: PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,rates_total-amount-1);

3. Alle Werte im Puffer innerhalb des Betrags sollten explizit zugewiesen werden, einmal in der gesamten Historie, und dann werden nur die neuen Werte zugewiesen, dann brauchen sie nicht initialisiert zu werden.

4. Verringern Sie in den Terminaleinstellungen die Anzahl der Balken im Fenster :)

 
Swan:

Es ist ein bisschen durcheinander...

1. es ist sinnvoll, den Puffer einmal zu Beginn zu initialisieren if(prev_calculated==0)

2. Sie können festlegen, ab welchem Balken die Daten gezeichnet werden, etwa so: PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,rates_total-amount-1);

3. Alle Werte im Puffer innerhalb der Menge sollten explizit zugewiesen werden, einmal in der gesamten Geschichte, und dann werden nur die neuen Werte zugewiesen, dann brauchen sie nicht initialisiert zu werden.

4. Verringern Sie in den Terminaleinstellungen die Anzahl der Balken im Fenster :)

1. In der Tat: von der Idee her ist es sinnvoll, es nur einmal zu machen, aber in der Praxis ist es nicht so einfach, alles läuft wirklich. Ich habe einfach den Standardindikator kopiert: C:\Programme\MetaTrader 5\MQL5\Indikatoren\Beispiele\Fractals.mq5. Wie man den Puffer vor neuen Berechnungen auf andere und effektivere Weise leeren kann, weiß ich nicht.

2. Ich habe diese Möglichkeit noch nicht untersucht, aber es sieht so aus, dass der Indikator nicht in einer unnötigen Zone gezeichnet wird, aber die Größe des Indikatorpuffers wird nicht begrenzt. Außerdem bin ich viel eher bereit, mit einem Puffer zu arbeiten, der dicht mit nützlichen Daten gefüllt ist, ohne jeglichen freien Spielraum, da ich sonst Begrenzungen einführen muss (über die ich in einem früheren Beitrag berichtet habe), und das passt nicht zu einem orthodoxen Algorithmus: von vier Puffern werden drei in einer Schleife mit denselben Begrenzungen gescannt, und für einen Puffer muss ich mir Zeit nehmen und eine separate Kurvenschleife mit anderen Begrenzungen machen, die ich kaum je unterbringen kann. Obwohl, ja, man kann auch auf Krücken krabbeln...

3) Was meinen Sie mit ausdrücklich? Ich spreche mich keineswegs dafür aus, nicht explizit zuzuweisen. Es könnte sehr gut sein, dass ich mir das ausdrücklich zu eigen mache. Erklären? Was das Laden nur neuer Werte angeht, so verwende ich das natürlich, das nennt man hier einen sparsamen Algorithmus.

4. Diese Idee wurde vor dem Verfassen des letzten Beitrags verworfen, da der Indikator einige letzte (neue) Balken der Historie benötigt, während ich persönlich (visueller Aspekt) alle oder fast alle Balken benötige. Mein menschliches Interesse an den historischen Balken ist größer als das Interesse eines technischen Indikators an ihnen. Ich möchte mir die Balken ansehen und den Indikator in einem Diagramm zeichnen. Eine Laune? Ein gewöhnliches Bedürfnis.

 
x100intraday:

1. Wirklich: Auf der Ideenebene macht es nur Sinn, es einmal zu tun, aber in der Praxis ist es nicht so einfach, alles läuft wirklich. Ich habe einfach den Standardindikator kopiert: C:\Programme\MetaTrader 5\MQL5\Indikatoren\Beispiele\Fractals.mq5. Wie man den Puffer vor neuen Berechnungen auf andere und effektivere Weise leeren kann, weiß ich nicht.

   if(prev_calculated<7)// if(prev_calculated==0)// if(prev_calculated<1)// вопщем одинаково)
      //Initialize только при первом запуске. нуу или при случае какогнить ахтунга)
      {
      limit=2;//цикл начинается со второго элемента индикаторного массива
      //--- clean up arrays//в принципе здесь не очистка массива, 
                        //а значения EMPTY_VALUE  присваивается 0 и 1 элементу массивов, мм.. и на последних трёх барах)
                        //остальные определяются далее в цикле..
      ArrayInitialize(ExtUpperBuffer,EMPTY_VALUE);
      ArrayInitialize(ExtLowerBuffer,EMPTY_VALUE);
      }
   else limit=rates_total-5;//иначе - в цикле пересчитываются только два последних значения

//зы: при появлении нового бара - новый элемент массива вроде как не определен, насколько мне известно не гарантируется, что он будет  ==EMPTY_VALUE
2. Ich habe diese Möglichkeit noch nicht untersucht, aber es sieht so aus, dass der Indikator nicht in einer unnötigen Zone gezeichnet wird, aber die Größe des Indikatorpuffers wird nicht begrenzt. Außerdem bin ich viel eher bereit, mit einem Puffer zu arbeiten, der dicht mit nützlichen Daten gefüllt ist, ohne jeglichen freien Spielraum, da ich sonst Begrenzungen einführen muss (über die ich in einem früheren Beitrag berichtet habe), und das passt nicht zu einem orthodoxen Algorithmus: von vier Puffern werden drei in einer Schleife mit denselben Begrenzungen gescannt, und für einen Puffer muss ich mir Zeit nehmen und eine separate Kurvenschleife mit anderen Begrenzungen machen, die ich kaum je unterbringen kann. Obwohl, ja, man kann auch auf Krücken krabbeln...

Nun, ja, das sollte es.

Die Größe des Indikatorpuffers wird nur durch die Anzahl der Takte bestimmt.

Auf die eine oder andere Weise wird eine bestimmte Größe festgelegt werden müssen... Warum eine gekrümmte Schleife mit unterschiedlichen Begrenzungen machen, wenn man eine gerade Schleife mit den gleichen Begrenzungen machen kann?)

Mit anderen Worten, Sie sollten die Schleifengröße angeben, nicht die Array-Größe... Andernfalls wird der Indikator auf Krücken beruhen


3) Was meinen Sie mit "ausdrücklich"? Ich kann absolut nicht garantieren, dass ich sie nicht ausdrücklich zuweise. Es kann gut sein, dass ich das ausdrücklich tue. Erklären? Was das Laden nur neuer Werte angeht - natürlich verwende ich das, es wird hier ein sparsamer Algorithmus genannt.
      //---- Upper Fractal
      if(High[i]>High[i+1] && High[i]>High[i+2] && High[i]>=High[i-1] && High[i]>=High[i-2])
         ExtUpperBuffer[i]=High[i];//условие выполняется - присваиваем значение
      else ExtUpperBuffer[i]=EMPTY_VALUE;//не выполняется - таки тоже присваиваем значение)
//нет зависимости от Initialize, всем элементам в цикле явно присваивается значение.

Was den sparsamen Algorithmus betrifft, so bin ich mir nicht sicher, ob Sie ihn verwenden.

Der Indikator wird einmal für alle Balken berechnet - d.h. er kann etwas träge sein, wenn er bei einem agromadischen Verlauf gestartet wird.

Anschließend werden ein paar Werte neu berechnet - alles sollte funktionieren :)

 
Cmu4:

Was ist der Fehler bei den Indikatoren? Sie erscheinen und verschwinden dann wieder. Nur die, die sich in einem separaten Fenster befinden!!!

Hier ist ein Screenshot, der zeigt, wann die Indikatoren verschwunden sind. Sie verschwinden ab und zu und tauchen dann wieder auf... willkürlich. Es gibt auch ein Video...

Achtung, die Basisindikatoren verschwinden!!! Es bedeutet, dass der Fehler signifikant ist. Das gleiche Problem tritt bei benutzerdefinierten Indikatoren auf.

Meine Herren Entwickler, beheben Sie diesen Fehler, bitte, das ist irgendwie nicht schön...

Leider ist der Screenshot nicht zu sehen.

Welcher Server? Welcher Zugangsserver? Welches Datum/Uhrzeit? Wurde die Geschichte zu diesem Zeitpunkt ausgelagert?

Passiert es jetzt wieder? Können Sie die Terminalprotokolle für dieses Datum anhängen?

 

Liebe Entwickler, ich habe einen unangenehmen Fehler (Makel) im MQL5-Compiler gefunden.

Wenn Sie ein bedingtes Konstrukt der folgenden Form verwenden

if (Bedingung) ;

{ operator_1

......

Operator_N }

Beim Kompilieren des Codes werden keine Fehler oder Warnungen erzeugt.

Da aber direkt nach der Bedingung ein " ; " (mit oder ohne Leerzeichen) steht, wird {operator_1...operator_N} immer ausgeführt.

MQL4 zeigt eine Warnung an. Ich möchte, dass MQL5 auch Fehler oder Warnungen anzeigt! (Ich habe einen halben Tag verloren, um herauszufinden, was mit meinem Code nicht stimmt)

Vielen Dank für Ihr Feedback!

 
Fia:

Liebe Entwickler, ich habe einen unangenehmen Fehler (Makel) im MQL5-Compiler gefunden.

Wenn Sie ein bedingtes Konstrukt der folgenden Form verwenden

if (Bedingung) ;

{ operator_1

......

Operator_N }

Beim Kompilieren des Codes werden keine Fehler oder Warnungen erzeugt.

Da aber direkt nach der Bedingung ein " ; " (mit oder ohne Leerzeichen) steht, wird {operator_1...operator_N} immer ausgeführt.

MQL4 zeigt eine Warnung an. Ich möchte, dass MQL5 auch Fehler oder Warnungen anzeigt! (Ich habe einen halben Tag verloren, um herauszufinden, was mit meinem Code nicht stimmt)

Vielen Dank für Ihr Feedback!


In diesem Fall ist alles gültig. ; ist ein leerer Operator.

Wir werden über Ihren Vorschlag (Erteilung einer Vorwarnung) nachdenken, aber das hat im Moment nicht die höchste Priorität.

Документация по MQL5: Основы языка / Операторы / Оператор-выражение
Документация по MQL5: Основы языка / Операторы / Оператор-выражение
  • www.mql5.com
Основы языка / Операторы / Оператор-выражение - Документация по MQL5
 
alexvd:

In diesem Fall ist alles gültig. ; ist ein leerer Operator.

Wir werden über Ihren Vorschlag nachdenken, aber er hat im Moment nicht die höchste Priorität.

Ich hoffe, Sie werden nicht vergessen, es in MQL4 zu tun, da es logischerweise in MQL4 getan wurde.


Könnten Sie uns bitte raten, zwei schwebende Aufträge zu berücksichtigen (Preis, Art und Volumen ihrer Ausführung sind gleich)?

Wenn der Preis erreicht wird, werden beide Ereignisse ausgelöst, und wie wird das OnTrade()-Ereignis in diesem Fall funktionieren?

Werden insbesondere ausstehende Aufträge, die ausgeführt wurden, in einem OnTrade()-Ereignis in die Historie aufgenommen oder wird es zwei Aufrufe geben? (meine Protokolle zeigen aus irgendeinem Grund einen Anruf)

Vielen Dank für Ihre Antwort!