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

 
Alexey Viktorov:

Nein, Vladimir. Das ist ein bisschen falsch.

In diesem Fall sollten Sie ArraySetAsSeries(array, false); auf ein Array mit dreihundert Elementen anwenden, bei dem iMAOnArray() berücksichtigt wird. Aber wir sollten besser CopyOpen() anstelle der Füllschleife des Arrays verwenden.

Nach meinem Verständnis ist es bei dieser Variante besser, wenn

So wie die Aufgabe gestellt war, habe ich das auch demonstriert. Es ist sehr gut gelungen. Und dann du selbst :)
 
Alexey Viktorov:

Nein, Vladimir. Das ist ein bisschen falsch.

In diesem Fall sollten Sie ArraySetAsSeries(array, false); auf ein Array mit dreihundert Elementen anwenden, bei dem iMAOnArray() berücksichtigt wird. Aber wir sollten besser CopyOpen() anstelle der Füllschleife des Arrays verwenden.

Nach meinem Verständnis ist es bei dieser Variante besser, wenn

Zeigen Sie mir also die "funktionierende" Variante des Codes, der Quellcode des Originals ist hier, Sie versuchen, ihn auf 12 Elemente anstelle der geforderten dreihundert zu reduzieren, und es sollte schließlich zu 3 Indikatorpuffern mit den angegebenen Daten für die Anzeige von mindestens 300 Elementen im Keller führen, Und dann, wenn ein neuer Balken kommt, bzw. 301 und dann wird der Wert gezeichnet werden, aber vergessen Sie nicht, dass in diesem Fall, wenn Sie 0 als Grenze für die Berechnung verwenden, wird nur der neue Balken neu berechnet werden, und die Art der Durchschnitt (Glättung) für den zweiten Puffer ist nicht unbedingt SMA, und kann jede der 4 zur Verfügung.
 
Sergey Efimenko:

Das ist die Frage. Wenn ich nicht das gesamte Array, sondern nur die letzten N Elemente berechnen muss.

Ich verstehe die Logik der Berechnung dieser Funktionen bei der Begrenzung nicht ganz. Ich habe eine Zeitreihe Array (einer der Indikatorpuffer), wenn ich die Anzahl der Elemente gleich 0, keine Fragen, alles wird gezählt und berechnet, aber wenn ich die Anzahl der Elemente in der Berechnung durch die gleichen Verschiebungen beteiligt verringern, bekomme ich nur die primären. Einfach gesagt gibt es ein Array 5000 Elemente (Balken auf dem Diagramm), um Zeit zu sparen, muss ich nur die letzten 300 berechnen, aber wenn ich den Wert 300 im zweiten Parameter angegeben habe, habe ich primär 5000-4700 Elemente, aber auf Offset 300-0, und weitere Werte bei einem Aufruf ändern sich nicht. Welchen Sinn hat die Verwendung dieses Parameters?

Weiß der Teufel. Vergessen Sie es einfach. Wenn Sie die Berechnungen beschleun igen müssen, reduzieren Sie die Anzahl der zu berechnenden Elemente in Ihrer Schleife.

if(prev_calculated==0)limit=300; else ...; 

Es gibt zwei Möglichkeiten: Entweder ist es unmöglich, oder man braucht eine geheime Kombination von Zeitreihen, nicht Zeitreihen, Berechnungsrichtungen.

 
Dmitry Fedoseev:

Weiß der Teufel. Vergessen Sie es einfach. Wenn Sie die Berechnungen beschleunigen wollen, reduzieren Sie die Anzahl der zu berechnenden Elemente in Ihrem Zyklus.

Entweder ist es unmöglich oder man braucht eine geheime Kombination von Zeitreihen, nicht Zeitreihen, Berechnungsrichtung.

Ja, wie ich schon etwas früher geschrieben habe, gibt es nur eine Möglichkeit - eigene Analogien zu den obigen Funktionen zu verwenden, mit denen man mindestens ein Element berechnen kann.

Das Paradoxe an der Situation ist, dass, wenn wir eine ähnliche Vorlage, die Überlagerung der Durchschnitt oder Bollinger Bars auf jeden Indikator (Preis-Linie), gibt es keine solche verlangsamt die anfängliche Berechnung aller Geschichte Bars, wie bei der Verwendung dieser Funktionen in den Code, beim Neustart des Terminals oder Umschalten der TF, so ist es unklar, was dauert so lange, um in diesen Funktionen berechnet werden.

 
Dmitry Fedoseev:

Weiß der Teufel. Vergessen Sie es einfach. Wenn Sie die Berechnungen beschleunigen wollen, reduzieren Sie die Anzahl der zu berechnenden Elemente in Ihrem Zyklus.

Es gibt zwei Möglichkeiten: Entweder ist es unmöglich, oder man braucht eine geheime Kombination von Zeitreihen, nicht Zeitreihen, Berechnungsrichtungen.

Auch ich habe eine solche Konstruktion verwendet.

if (limit > 300)limit=300;

Übrigensist "MovingAverages.mqh" doppelt so schnell wie"iMAOnArray", sogar die alte Version.

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

Использование MovingAverages.mqh в MQL4
Использование MovingAverages.mqh в MQL4
  • www.mql5.com
При вызове в советнике индикатор работает корректно, но если его поместить в тело условного оператора "if", то советник не открывает сделок, хотя логика советника остается та же.
 
Sergey Efimenko:

Ja, wie ich bereits geschrieben habe, gibt es nur eine Möglichkeit - unsere eigenen Analoga der genannten Funktionen zu verwenden, bei denen es möglich ist, mindestens ein Element zu berechnen.

Das Paradoxe an der Situation ist, dass, wenn wir eine ähnliche Vorlage machen, indem wir die MA und Bollinger-Bänder an einen beliebigen Indikator (Preislinie) anhängen, wir nicht eine solche Verlangsamung der anfänglichen Berechnung aller Verlaufsbalken sehen, wie bei der Verwendung dieser Funktionen im Code, beim Neustart des Terminals oder beim Umschalten der TF, so dass es unklar ist, was so lange dauert, in diesen Funktionen zu berechnen.

Wird er auch bei Verwendung von iMAOnArray verlangsamt? So etwas sollte es nicht geben. Wie Sie waren, gab es Verzögerungen von StdOnArray (oder BandsOnArray, ich erinnere mich nicht) die Entwickler nicht zugeben, die Existenz des Fehlers für eine lange Zeit. Dann war das Problem plötzlich behoben und es funktionierte schnell. Wer weiß, vielleicht ist der Fehler ja zurückgekehrt. Wenn iMAOnArray() ebenfalls spürbare Verlangsamungen verursacht, handelt es sich um einen Fehler. Es scheint, dass es vor einigen Monaten Gespräche darüber gab... Aber anscheinend gibt es sie noch.

 
Dmitry Fedoseev:

Die Verlangsamung auch bei Verwendung von iMAOnArray? So sollte es nicht sein. Wie Sie waren zu einer Zeit, gab es eine Verlangsamung von StdOnArray, die Entwickler nicht bestätigen, den Fehler für eine lange Zeit. Dann haben sie es plötzlich repariert und es funktionierte schnell. Wer weiß, vielleicht ist der Fehler ja zurückgekehrt. Wenn iMAOnArray() auch spürbare Verlangsamungen verursacht, handelt es sich um einen Fehler. Es scheint, dass es vor einigen Monaten Gespräche darüber gab... Aber anscheinend gibt es sie noch.

Es ist schwer zu beurteilen, ob es "viel langsamer" oder akzeptabel ist, weil alles von der Länge des Diagramms (Anzahl der Balken) abhängt. Der Haken an der Sache ist, dass wir für die Optimierung nur ein bisschen rechnen müssen, aber eine Begrenzung der Berechnungslänge ist eigentlich unmöglich.
 
Sergey Efimenko:
Es ist schwer zu beurteilen, ob es zu langsam ist oder nicht, weil alles von der Länge des Diagramms (Anzahl der Balken) abhängt. Das Problem ist, dass man für die Optimierung nur einen kleinen Teil berechnen muss und man die Länge der Berechnung nicht durch die tatsächliche Berechnung begrenzen kann.
Führen Sie die Berechnung mitMovingAverages.mqh durch und sie ist sehr schnell.
 
forexman77:
Führen Sie die Berechnung mitMovingAverages.mqh durch und sie wird sehr schnell berechnet.
Und diese Bibliothek berechnet korrekt, wenn Sie die Berechnung nicht für das gesamte Array, sondern nur für dessen letzten Teil (aktuelle Werte) festlegen? Außerdem ist das nur die Hälfte des Problems, aber was ist mit iBandsOnArray?
 
Sergey Efimenko:
Zeigen Sie mir also die "funktionierende" Variante des Codes, der ursprüngliche Code ist hier, den Sie versuchen, auf 12 angezeigte Elemente anstelle der von mir geforderten dreihundert zu reduzieren, und sollte mit 3 Indikatorpuffern mit den angegebenen Daten enden, so dass mindestens 300 Elemente im Keller angezeigt wurden, Und dann, wenn ein neuer Balken kommt, bzw. 301 und dann wird der Wert gezeichnet, aber vergessen Sie nicht, dass in diesem Fall, wenn Sie 0 als Berechnungsgrenze verwenden, nur der neue Balken neu berechnet wird, und die Art des Durchschnitts (Glättung) für den zweiten Puffer ist nicht unbedingt SMA, sondern kann jede der 4 verfügbaren sein.

Hier ist es.

//+------------------------------------------------------------------+
//|                                         Test300AsSeriesFalse.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 clrYellow
#property  indicator_color2 clrGreen
#property  indicator_color3 clrRed
double Buffer[];
double BufferMA[];
double BufferBMA[];
bool firstrun=true;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   firstrun=true;
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,BufferMA,INDICATOR_DATA);
   SetIndexBuffer(2,BufferBMA,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   int i, limit;
   limit = rates_total-prev_calculated-1;
   double buffer[];

   for(i = limit; i >= 0; i--)
     {
      Buffer[i]=open[i];
       ArrayCopy(buffer, Buffer, 0, i, 12);
      BufferMA[i] = iMAOnArray(buffer, 300, 12, 0, MODE_SMA, 0);
      BufferBMA[i] = iBandsOnArray(buffer, 300, 12, 2.0, 0, MODE_UPPER, 0);
      int x=0;
     }
   return(rates_total);
}
//+------------------------------------------------------------------+
Grund der Beschwerde: