Comment modifier la structure de la variable globale de l'indicateur lors du passage à une autre période ? - page 5

 
fxsaber:

Si vous écrivez une mesure de performance, il serait intéressant de la comparer.

Ok. Allez-y. Il suffit de mettre en œuvre votre partie vous-même.
Voici ma partie.
Je propose l'indicateur de test suivant de la boule (le jaune est ce qui est responsable de la sauvegarde et de la restauration de la structure du tableau entre les TF) :
Lors du premier appel, le tableau de nœuds aléatoires (100 par défaut) à l'intérieur de la fenêtre est généré et relié par une courbe de Bézier.
Lorsque le TF est modifié, les nœuds liés au temps et au prix sont sauvegardés et ne sont pas modifiés.
Pour un meilleur comptage, il est préférable de faire en sorte que le nombre de nœuds soit de 1000.

#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 микросекунд


avec 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 микросекунд
Dossiers :
TestVar.mq5  6 kb
StructArr.mqh  3 kb
 

Pour MQL, il serait formidable d'avoir une sorte de pointeur pour les variables indicatrices globales. Ils seraient initialisés une fois et seulement lors de l'installation de l'indicateur.

Par exemple :
int global Var ;

. Dans ce cas, nous n'aurons pas besoin de toutes ces ressources. Arrêtons de rêver et avançons.

 
Nikolai Semko:

Voici ma pièce.

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

Pour MQL, il serait formidable d'avoir une sorte de pointeur pour les variables indicatrices globales. Ils seraient initialisés une fois et seulement lors de l'installation de l'indicateur.

Par exemple :
int global Var ;

. Dans ce cas, nous n'aurons pas besoin de toutes ces ressources. Arrêtons de rêver et avançons.

En plus de PersistentStorage, ServerSideStorage serait bien (pour stocker même les petites choses du côté serveur) et AuthorOwnedCloud (pour laisser certaines données être gérées par l'auteur)... mais c'est quelque chose du 21ème siècle :-).

Rêve, c'est assez...

 
Nikolai Semko:

Lorsque le TF change, les nœuds liés au temps et au prix sont conservés et ne changent pas.

S'agit-il d'une mesure statistiquement significative de la distribution de l'assortiment ?

 
Taras Slobodyanik:

:)

Il est étrange que personne ne parle de "béquilles", de "réinvention d'une roue", de "difficultés de transfert des données vers un autre terminal", de"le problème doit être résolu par des moyens MQL "...
Il s'avère que les solutions métaquot sont des béquilles et des mauvais tons).


Où se trouve cette solution de MQ ?
 

fxsaber:

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


Vous semblez avoir une version obsolète.
dernière version 1.43
https://www.mql5.com/ru/code/22164

Dossiers :
iCanvas.mqh  52 kb
 
fxsaber:

S'agit-il d'une mesure statistiquement significative de la distribution de l'assortiment ?

personne ne vous empêche de faire vos propres ajustements.

HH
Et s'il vous plaît, ne commencez pas à parler de cordes.
Dans ce type de tâches, ils ne sont pas pertinents, c'est pourquoi ils ne sont pas implémentés dans ma classe et ma structure ne peut pas contenir de type string.
Je sais qu'ils sont mis en œuvre dans votre classe. Mais nous parlons d'autre chose.

 
PapaYozh:

Où se trouve cette solution de MQ ?

Oui, bien sûr, ces solutions n'existent pas du tout.

Les utilisateurs inventent donc des "béquilles" -FileWriteStruct et GlobalVariableSet.
Et les solutions les plus simples, bien sûr, sont d'écrire les variables dans les ressources, et d'écrire les structures dans les variables globales).

 
Nikolai Semko:

Vous semblez avoir une version obsolète.
dernière version 1.43
https://www.mql5.com/ru/code/22164

Cette version est celle qui vous a donné l'erreur.

Raison: