Wie verschiebe ich die Struktur der globalen Variablen im Indikator, wenn ich zu einem anderen Zeitrahmen wechsle? - Seite 5

 
fxsaber:

Wenn Sie eine Leistungsmessung schreiben, wäre es interessant, diese zu vergleichen.

Ja. Fahren Sie fort. Setzen Sie Ihren Teil einfach selbst um.
Hier ist mein Teil.
Ich schlage folgenden Testindikator aus dem Ball vor (gelb markiert ist das, was für das Speichern und Wiederherstellen der Array-Struktur zwischen TFs verantwortlich ist):
Beim ersten Aufruf wird das Array aus zufälligen Knoten (standardmäßig 100) innerhalb des Fensters erzeugt und durch eine Bezier-Kurve verbunden.
Wenn die TF geändert wird, werden die mit der Zeit und dem Preis verbundenen Knoten gespeichert und nicht geändert.
Für eine bessere Messung ist es besser, die Anzahl der Knoten auf 1000 zu setzen.

#property indicator_chart_window
#include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164
#include <CVar\StructArr.mqh>
#define  SIZE 100

struct Node {
   datetime time;
   double price;
};
Node line[];

ulong t0 = GetMicrosecondCount();
CStructArr<Node> Var("Bezier",line);
ulong t1=GetMicrosecondCount()-t0;

int OnInit() {
   if (ArraySize(line) == 0) GenerateLine();
   else {
      Print("Востановление данных - " + string(t1)+ " микросекунд");
      Print("Время uint[] -> T[] - " + string(Var.uint_to_t)+ " микросекунд");
   }
   DrawBezier(line);
   return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[]) {
   return(rates_total);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void GenerateLine() {
   ArrayResize(line,SIZE);
   for (int i = 0; i<SIZE; i++) {
      line[i].time = Canvas.TimePos(double(rand() % W.Width));
      line[i].price = Canvas.Price(rand() % W.Height);
   }
   t0 = GetMicrosecondCount();
   Var.Set(line);
   t0 = GetMicrosecondCount()-t0;
   Print("Сохранение данных - " + string(t0)+ " микросекунд");
   Print("Время T[] -> uint[] - " + string(Var.t_to_uint)+ " микросекунд");
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DrawBezier(Node &arr[]) {
   int size = ArraySize(arr);
   if (size>1) {
      Canvas.Erase(0x00FFFFFF);
      int X[],Y[];
      ArrayResize(Y,size);
      ArrayResize(X,size);
      for(int i=0; i<size; i++) {
         X[i] = (int)Canvas.X(line[i].time);
         Y[i] = (int)Canvas.Y(line[i].price);
      }
      Canvas.PolylineSmooth(X,Y,0xFFFF00FF,3);
      Canvas.Update();
   }
}
//+------------------------------------------------------------------+

2021.07.11 04:41:02.705 TestVar (EURUSD,M6)     Сохранение данных - 15 микросекунд
2021.07.11 04:41:02.705 TestVar (EURUSD,M6)     Время T[] -> uint[] - 4 микросекунд
2021.07.11 04:42:03.085 TestVar (EURUSD,M10)    Востановление данных - 317 микросекунд
2021.07.11 04:42:03.085 TestVar (EURUSD,M10)    Время uint[] -> T[] - 4 микросекунд
2021.07.11 04:42:10.012 TestVar (EURUSD,M12)    Востановление данных - 878 микросекунд
2021.07.11 04:42:10.012 TestVar (EURUSD,M12)    Время uint[] -> T[] - 4 микросекунд
2021.07.11 04:42:44.235 TestVar (EURUSD,M30)    Востановление данных - 1061 микросекунд
2021.07.11 04:42:44.235 TestVar (EURUSD,M30)    Время uint[] -> T[] - 8 микросекунд
2021.07.11 04:43:20.556 TestVar (EURUSD,M20)    Востановление данных - 303 микросекунд
2021.07.11 04:43:20.556 TestVar (EURUSD,M20)    Время uint[] -> T[] - 4 микросекунд
2021.07.11 04:43:25.339 TestVar (EURUSD,M15)    Востановление данных - 443 микросекунд
2021.07.11 04:43:25.339 TestVar (EURUSD,M15)    Время uint[] -> T[] - 5 микросекунд


mit SIZE = 1000:

2021.07.11 05:01:32.602 TestVar (EURUSD,M5)     Сохранение данных - 41 микросекунд
2021.07.11 05:01:32.602 TestVar (EURUSD,M5)     Время T[] -> uint[] - 26 микросекунд
2021.07.11 05:01:36.541 TestVar (EURUSD,M6)     Востановление данных - 586 микросекунд
2021.07.11 05:01:36.541 TestVar (EURUSD,M6)     Время uint[] -> T[] - 64 микросекунд
2021.07.11 05:01:38.317 TestVar (EURUSD,M10)    Востановление данных - 648 микросекунд
2021.07.11 05:01:38.317 TestVar (EURUSD,M10)    Время uint[] -> T[] - 35 микросекунд
2021.07.11 05:01:40.534 TestVar (EURUSD,M12)    Востановление данных - 567 микросекунд
2021.07.11 05:01:40.534 TestVar (EURUSD,M12)    Время uint[] -> T[] - 36 микросекунд
2021.07.11 05:01:42.814 TestVar (EURUSD,M15)    Востановление данных - 449 микросекунд
2021.07.11 05:01:42.814 TestVar (EURUSD,M15)    Время uint[] -> T[] - 44 микросекунд
2021.07.11 05:01:45.015 TestVar (EURUSD,M20)    Востановление данных - 728 микросекунд
2021.07.11 05:01:45.015 TestVar (EURUSD,M20)    Время uint[] -> T[] - 59 микросекунд
2021.07.11 05:01:47.536 TestVar (EURUSD,M30)    Востановление данных - 2349 микросекунд
2021.07.11 05:01:47.536 TestVar (EURUSD,M30)    Время uint[] -> T[] - 45 микросекунд
Dateien:
TestVar.mq5  6 kb
StructArr.mqh  3 kb
 

Für MQL wäre es toll, eine Art Zeiger für globale Indikatorvariablen zu haben. Sie würden einmalig und nur bei der Installation des Indikators initialisiert werden.

Zum Beispiel:
int global Var;

. In diesem Fall werden wir nicht alle diese Ressourcen benötigen. Wir sollten aufhören zu träumen und weitermachen.

 
Nikolai Semko:

Hier ist mein Beitrag.

        array out of range in 'iCanvas.mqh' (114,55)
 
Mikhail Nazarenko:

Für MQL wäre es toll, eine Art Zeiger für globale Indikatorvariablen zu haben. Sie würden einmalig und nur bei der Installation des Indikators initialisiert.

Zum Beispiel:
int global Var;

. In diesem Fall werden wir nicht alle diese Ressourcen benötigen. Wir sollten aufhören zu träumen und weitermachen.

Neben PersistentStorage wäre ServerSideStorage schön (um auch kleine Dinge serverseitig zu speichern) und AuthorOwnedCloud (um einige Daten vom Autor verwalten zu lassen)... aber das ist etwas aus dem 21.)

Träum weiter, das ist genug...

 
Nikolai Semko:

Wenn sich die TF ändert, bleiben die mit der Zeit und dem Preis verbundenen Knoten erhalten und ändern sich nicht.

Ist dies ein statistisch signifikantes Maß für das Werfen von Arrays?

 
Taras Slobodyanik:

:)

Es ist seltsam, dass niemand über "Krücken", "Neuerfindung des Rades", "Schwierigkeiten bei der Datenübertragung auf ein anderes Terminal","das Problem muss mit MMS-Mitteln gelöst werden " schreibt...
Es stellt sich heraus, dass metaquot Lösungen sind Krücken und mauvais ton)


Wo ist diese Lösung von MQ?
 

fxsaber:

  array out of range in 'iCanvas.mqh' (114,55)


Sie scheinen eine veraltete Version zu haben.
neueste Version 1.43
https://www.mql5.com/ru/code/22164

Dateien:
iCanvas.mqh  52 kb
 
fxsaber:

Ist dies ein statistisch signifikantes Maß für das Werfen von Arrays?

Niemand hindert Sie daran, Ihre eigenen Anpassungen vorzunehmen.

HH
Und bitte fangen Sie nicht an, über Saiten zu reden.
Bei dieser Art von Aufgaben sind sie irrelevant, deshalb sind sie in meiner Klasse nicht implementiert und meine Struktur kann keine Strings enthalten.
Ich weiß, dass sie in Ihrem Unterricht eingesetzt werden. Aber wir sprechen über etwas anderes.

 
PapaYozh:

Wo ist diese Lösung von MQ?

Ja, natürlich gibt es diese Lösungen nicht.

Also erfinden Benutzer "Krücken" -FileWriteStruct und GlobalVariableSet.
Und die krückenlosesten Lösungen sind natürlich das Schreiben von Variablen in Ressourcen und das Schreiben von Strukturen in globale Variablen)

 
Nikolai Semko:

Sie scheinen eine veraltete Version zu haben.
neueste Version 1.43
https://www.mql5.com/ru/code/22164

Dies ist die Version, bei der der Fehler aufgetreten ist.