¿Cómo puedo cambiar la estructura de la variable global en el indicador al pasar a otro marco temporal? - página 5

 
fxsaber:

Si escribes una medida de rendimiento, sería interesante comparar.

De acuerdo. Adelante. Sólo tienes que poner en práctica tu parte.
Aquí está mi parte.
Sugiero el siguiente indicador de prueba de la bola (marcado en amarillo es lo que se encarga de guardar y restaurar la estructura del array entre TFs):
Cuando se llama por primera vez, el array de nodos aleatorios (100 por defecto) dentro de la ventana se genera y se conecta por curva Bezier.
Cuando se modifica la TF, los nodos vinculados a la hora y al precio se guardan y no se modifican.
Para una mejor medición, es mejor hacer que el número de nodos sea 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 микросекунд


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

Para MQL sería genial tener algún tipo de puntero para las variables indicadoras globales. Se inicializarían una vez y sólo al instalar el indicador.

Por ejemplo:
int global Var;

. En este caso no necesitaremos todos estos recursos. Dejemos de soñar y sigamos adelante.

 
Nikolai Semko:

Aquí está mi pieza.

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

Para MQL sería genial tener algún tipo de puntero para las variables indicadoras globales. Se inicializarían una vez y sólo al instalar el indicador.

Por ejemplo:
int global Var;

. En este caso no necesitaremos todos estos recursos. Dejemos de soñar y sigamos adelante.

Además de PersistentStorage, ServerSideStorage estaría bien (para almacenar incluso pequeñas cosas en el lado del servidor) y AuthorOwnedCloud (para permitir que algunos datos sean gestionados por el autor)... pero es algo del siglo XXI :-).

Sueña, es suficiente...

 
Nikolai Semko:

Cuando la TF cambia, los nodos vinculados al tiempo y al precio se mantienen y no cambian.

¿Es esta una medida estadísticamente significativa de la distribución de las matrices?

 
Taras Slobodyanik:

:)

Es extraño que nadie escriba sobre las "muletillas", la "reinvención de la rueda", las "dificultades de transferencia de datos a otro terminal","el problema debe resolverse por medios MQL "...
Resulta que las soluciones metaquot son muletas y mauvais ton)


¿Dónde está esta solución de MQ?
 

fxsaber:

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


Parece que tiene una versión obsoleta.
última versión 1.43
https://www.mql5.com/ru/code/22164

Archivos adjuntos:
iCanvas.mqh  52 kb
 
fxsaber:

¿Es esta una medida estadísticamente significativa de la distribución de las matrices?

nadie te impide hacer tus propios ajustes.

HH
Y por favor, no empieces a hablar de cuerdas.
En este tipo de tareas son irrelevantes, por eso no están implementadas en mi clase y mi estructura no puede contener tipo string.
Sé que están implementados en su clase. Pero estamos hablando de otra cosa.

 
PapaYozh:

¿Dónde está esta solución de MQ?

Sí, por supuesto, estas soluciones no existen en absoluto.

Así que los usuarios inventan "muletas" -FileWriteStruct y GlobalVariableSet.
Y las soluciones más libres de muletas, por supuesto, son la escritura de variables en recursos, además de la escritura de estructuras en variables globales)

 
Nikolai Semko:

Parece que tiene una versión obsoleta.
última versión 1.43
https://www.mql5.com/ru/code/22164

Esta versión es la que te dio el error.