MT4 iMAOnArray und iBandsOnArray Auswirkungen der Anzahl der Elemente auf die Berechnungen - Seite 6

 

Ich habe nicht umsonst einen Taschenrechner oder Excell vorgeschlagen. Es ist hilfreich zu verstehen, wie dieser Mist funktioniert. Sie können nur dann eine Anzahl von Elementen ungleich Null zur Berechnung verwenden, wenn Sie bereits ein fertiges Array haben. Angenommen, Sie haben ein Array mit 1000 Elementen und möchten nur die letzten 100 Elemente mitteln. Wir haben zwei Möglichkeiten: diese 100 Elemente in ein benutzerdefiniertes Array umzuwandeln und neu zu berechnen oder die Schleife von 100 bis 0 und nicht 0, sondern 100 Elemente im Array zu verwenden.

Hier stellt sich jedoch das Problem, dass sich die Größe des Feldes ändert, was bei Indikatoren unvermeidlich ist.

Auch hier habe ich über andere Möglichkeiten gesprochen, die Anzahl der Elemente für die Berechnung zu begrenzen. Nun, Sie können die Bedingung iMAOnArray() nur setzen, wenn (rates_total-i >= rates_total-100); und nur die letzten 100 Balken werden neu berechnet und alles ist in Ordnung, wenn ein neuer Balken ankommt.

int i, limit;
   limit = prev_calculated == 0 ? rates_total-1 : rates_total-prev_calculated;

   for(i = limit; i >= 0; i--)
     {
      Buffer[i]=open[i];
      if(rates_total-i >= rates_total-100)
      BufferMA[i] = NormalizeDouble(iMAOnArray(Buffer, 0, 5, 0, MODE_LWMA, i), _Digits);
      
     }

return(rates_total);


 
Alexey Viktorov:

Ich habe nicht umsonst einen Taschenrechner oder Excell vorgeschlagen. Es ist hilfreich zu verstehen, wie dieser Mist funktioniert. Sie können nur dann eine Anzahl von Elementen ungleich Null zur Berechnung verwenden, wenn Sie bereits ein fertiges Array haben. Angenommen, Sie haben ein Array mit 1000 Elementen und müssen nur die letzten 100 Elemente mitteln. Wir haben zwei Möglichkeiten: diese 100 Elemente in ein benutzerdefiniertes Array umzuwandeln und neu zu berechnen, oder die Schleife von 100 bis 0 zu verwenden und die Anzahl der Elemente nicht in 0, sondern in 100 umzuwandeln.

Hier stellt sich jedoch das Problem, dass sich die Größe des Feldes ändert, was bei Indikatoren unvermeidlich ist.

Auch hier habe ich über andere Möglichkeiten gesprochen, die Anzahl der Elemente für die Berechnung zu begrenzen. Stellen Sie die Bedingung so ein, dass iMAOnArray() nur gelesen wird, wenn (rates_total-prev_calculated-i >= 100); dann werden nur die letzten 100 Balken neu berechnet und alles ist in Ordnung, wenn ein neuer Balken eintrifft.


Sagen Sie mir, sind Sie Programmierer oder machen Sie es als Hobby oder aus Notwendigkeit? Ich brauche keine Excel-Tabelle oder ein Blatt Papier, um zu verstehen, wie es funktioniert, und Barabaschka hat alle "Schwierigkeiten" auf dem Screenshot vorhin demonstriert. Gehen wir der Reihe nach vor.

1. iMAOnArray (wie auch iBandsOnArray) kann in zwei Versionen arbeiten, es kann das gesamte Array lesen und es richtig tun (aber es hat sich während der primären Berechnung verlangsamt) oder es kann einen Teil des Arrays lesen, aber es wird es nur für die ersten Elemente tun, trotz der Tatsache, dass die Verschiebung für die letzten angegeben ist. Das heißt, ich habe versucht, die Berechnung auf die Balken zu beschränken, aber ich muss immer noch entweder das gesamte Array berechnen (d.h. die ursprüngliche Version des "Bremsens"), oder eine Variante ähnlich der Ihren mit dem Kopieren des Puffers und der Neuberechnung aller Elemente dieses Puffers erstellen, die, wie in meinen früheren Beiträgen beschrieben, nicht das richtige Ergebnis für komplexe Glättungsmethoden liefert und auch die Zeit der Datenverarbeitung im Allgemeinen erhöht.

2. das von Ihnen beschriebene Problem bei Indikatoren mit der Größenänderung des Arrays tritt nur auf, wenn das Array nicht zu den Indikatorpuffern gehört, d.h. das von Ihnen beschriebene "Herumtanzen" wirkt sich auch negativ aus, denn wenn man auf den primären Quellcode zurückgeht, lag das Problem nur in der langsamen Berechnung und nur im ersten Schritt.

3. Die von Ihnen angebotene Variante mit der Neuberechnung nur eines Teils der Felder auf 100 (N) Balken führt wiederum zu einem Verlust an allgemeiner Produktivität und unnötigen Problemen bei der Implementierung mit dem Kopieren von Feldern oder unnötigen Neuberechnungen. Außerdem sind auf Ihrem Screenshot und im obigen Code alle Berechnungen durchgeführt (ich vermute, irgendwo im internen Array, das ist höchstwahrscheinlich der Grund für die primären Verzögerungen), andernfalls würde diese Art der Glättung erste gefüllte Ergebnisse anders gemacht haben, und Sie haben einfach nicht das Puffer-Array mit ihnen gefüllt. Da der Parameter 0 für die Array-Größe bei der Berechnung der Funktion ausdrücklich besagt, dass alle Daten gelesen werden sollen, liegt hier der Haken.

Der einzige Weg, es richtig zu machen, ist, meine eigene Funktion zu verwenden, die so funktioniert, wie sie sollte, und nicht alle Daten (N Teil davon) neu berechnet, wenn ein neuer Balken kommt, sondern sie nur liest, zumal ich eine solche Mittelwertbildungsfunktion in vielen meiner Produkte habe und verwende. Die Frage in diesem Forumsthema war, wie man die Standardfunktionen von MT4 "übertreffen" kann, ohne die Verarbeitungsgeschwindigkeit und das Ergebnis zu verschlechtern. Wenn ich der obigen Meldung Glauben schenke, wirddie "Standardabweichung" auf dem Array ungebremst berechnet, oder ich kann als Notlösung meine eigene Abweichungsberechnung schreiben, zumal die Formeln für die Berechnung hier in der Dokumentation für jeden verfügbar sind.

 

So viele Buchstaben... Und das alles nur, um der vorgeschlagenen Option nicht zuzustimmen.

Danke für die Idee, zumindest habe ich herausgefunden, wie es funktioniert, ansonsten habe ich mich nicht mit den Feinheiten dieser Funktionen befasst, da ich es nicht nötig hatte.

Wenn Ihnen das nicht gefällt, verwenden Sie selbst geschriebene Texte.

 
Alexey Viktorov:

So viele Buchstaben... Und alles zielt nur darauf ab, die vorgeschlagene Option abzulehnen.

Danke für die Idee, zumindest habe ich herausgefunden, wie es funktioniert, ansonsten habe ich mich nicht mit den Feinheiten dieser Funktionen befasst, weil ich es nicht nötig hatte.

Wenn Ihnen das nicht gefällt, verwenden Sie selbst geschriebene Texte.

Nun, warum auf der Meinungsverschiedenheit, auf der ErklÀrung, warum es nicht notwendig ist, so zu machen, weil, den Code zu schreiben, der an die Bremsfunktionen oder den Code gebunden ist, der die zusÀtzlichen Schleifen des Kopierens schafft - ist nicht immer die richtige Option, obwohl, manchmal, und weniger mÌhsam :)
Und es geht nicht um "mögen"/"nicht mögen", sondern in der Tatsache, dass die Funktionen nicht genau funktionieren, wie es sollte, weil in der Tat, die Schaffung von Analoga ist wie das Rad neu zu erfinden, aber in diesem speziellen Fall können wir nicht ohne sie tun.

Ich habe Schlussfolgerungen für mich selbst vor mehreren Seiten gemacht, aber Ihre Art und Weise, vielleicht, wird jemand zu verstehen, dass diese Situation bereits hier gelöst worden, und was ich tun muss, um dieses Problem zu lösen, so viele Buchstaben :)

 

Bei der letztgenannten Variante gibt es kein Kopieren oder zusätzliche Zyklen. Und die MODE_LWMA-Berechnungsmethode, über die Sie und Dimitri zuvor gesprochen haben, kann nicht korrekt neu berechnet werden.

Sehen Sie sich den Code und den Screenshot an. Im Screenshot, MA-Periode 5 wie im Code, MODE_LWMA-Methode und achten Sie auf die Anzahl der berechneten Balken, auf das Zusammenfallen von MA- und Indikatorwerten mit iMAOnArray() im Keller. Wenn Sie alle Balken neu berechnen wollen oder nur 100. Wenn es keine Änderungen gibt, bedeutet dies, dass andere Berechnungen langsam sind.

 
Eine absolute Katastrophe!
 
Sergey Efimenko:

Sagen Sie mir, sind Sie Programmierer oder machen Sie es als Hobby oder aus Notwendigkeit...?

In der Vergangenheit hat er immer wieder behauptet, er sei kein Programmierer, sondern ein Amateur und könne deshalb gemobbt werden.
 
Alexey Viktorov:

Bei der letztgenannten Variante gibt es kein Kopieren oder zusätzliche Zyklen. Und die MODE_LWMA-Berechnungsmethode, über die Sie und Dimitri zuvor gesprochen haben, kann nicht korrekt neu berechnet werden.

Sehen Sie sich den Code und den Screenshot an. Im Screenshot, MA-Periode 5 wie im Code, MODE_LWMA-Methode und achten Sie auf die Anzahl der berechneten Balken, auf das Zusammenfallen von MA- und Indikatorwerten mit iMAOnArray() im Keller. Wenn Sie alle Balken neu berechnen wollen oder nur 100. Wenn es keine Änderungen gibt, bedeutet dies, dass andere Berechnungen langsam sind.

Die letztgenannte Variante ist im Wesentlichen identisch mit der ursprünglichen. Wie ich bereits geschrieben habe, wird bei der Array-Größe 0 immer noch als Ganzes gezählt. Meine erste Lösung, um die Berechnungszeit zu verkürzen, noch vor der Erstellung des Forum-Threads, war, die Anzahl der Balken zu begrenzen, aber leider hatte dies keinen Einfluss auf die Produktivität; dann begann ich, mit der Länge des Arrays für iMAOnArray zu experimentieren, und erst da verstand ich die Komplexität der Situation. Dann und nur dann, nachdem ich fast alle einfachen Varianten ausprobiert hatte, einschließlich der Änderung der Array-Indexierung für verschiedene Kombinationen, habe ich dieses Thema erstellt. Nun, danach erhielt ich einige Antworten, von denen einige bestätigten, dass auch andere sie ausprobiert hatten und jeder von ihnen eine eigene Funktion gefunden hatte. Deshalb habe ich nach deinem Code gefragt, weil ich anfangs wusste, dass es klappen würde :) Nichts für ungut :) Vielleicht überwinden einige der Benutzer diese "Harke", wenn sie diesen Thread lesen. :)
 
Dmitry Fedoseev:
In der Vergangenheit hat er selbst angefangen zu plappern, dass er kein Programmierer, sondern ein Amateur sei und deshalb schikaniert werden könne.

Es war eher eine rhetorische Frage :)

PS Meine Herren, lassen Sie uns tolerant miteinander umgehen. Schließlich sind wir alle nur aus einem Grund hier - um den Markt "abzuzocken". :) Lassen Sie uns also ohne Ablenkungen auf dieses Ziel hinarbeiten. Jeder von uns hat seine eigenen Schwierigkeiten, und Funktionen Wahrnehmung, sondern nur in einem Streit geboren Wahrheit, obwohl, wie sie sagen, wie Napoleon: "Zu argumentieren, zu wissen, dass Sie falsch sind - dumm, zu argumentieren, zu wissen, dass Sie Recht haben, bedeuten. Deshalb streite ich auch nie."

 
Sergey Efimenko:
Die letztgenannte Option unterscheidet sich im Wesentlichen nicht vom Original. Wie ich bereits geschrieben habe, wird das Array auch dann vollständig gezählt, wenn seine Größe 0 ist. Meine erste Lösung, noch vor der Erstellung des Forum-Threads, war es, die Anzahl der Balken zu begrenzen, aber leider wirkte sich das nicht auf die Produktivität aus; dann begann ich, mit der Länge des Arrays für iMAOnArray zu experimentieren, und da sah ich die Komplexität der Situation. Dann und nur dann, nachdem ich fast alle einfachen Varianten ausprobiert hatte, einschließlich der Änderung der Array-Indexierung für verschiedene Kombinationen, habe ich dieses Thema erstellt. Nun, danach erhielt ich einige Antworten, von denen einige bestätigten, dass auch andere sie ausprobiert hatten und jeder von ihnen eine eigene Funktion gefunden hatte. Deshalb habe ich nach deinem Code gefragt, weil ich anfangs wusste, dass es klappen würde :) Nichts für ungut :) Vielleicht überwinden einige der Benutzer diese "Harke", wenn sie diesen Thread lesen. :)

Heißt das, dass die Funktion iMAOnArray() nach if(rates_total-i >= rates_total-100);, wenn nur noch 100 Balken zu berechnen sind, zunächst das GANZE Array neu berechnet?

Grund der Beschwerde: