Come posso cambiare la struttura della variabile globale nell'indicatore quando mi sposto in un altro timeframe? - pagina 5

 
fxsaber:

Se si scrive una misurazione delle prestazioni, sarebbe interessante confrontare.

Ok. Vai avanti. Implementa la tua parte da solo.
Ecco la mia parte.
Suggerisco il seguente indicatore di test dalla palla (segnato in giallo è ciò che è responsabile del salvataggio e del ripristino della struttura dell'array tra i TF):
Quando viene chiamato per la prima volta, l'array di nodi casuali (100 di default) all'interno della finestra viene generato e collegato tramite curva di Bezier.
Quando il TF è cambiato, i nodi legati al tempo e al prezzo sono salvati e non cambiati.
Per una migliore misurazione, è meglio fare il numero di nodi 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 микросекунд
File:
TestVar.mq5  6 kb
StructArr.mqh  3 kb
 

Per MQL sarebbe fantastico avere un qualche tipo di puntatore per le variabili indicatori globali. Verrebbero inizializzati una volta sola e solo quando si installa l'indicatore.

Per esempio:
int global Var;

. In questo caso non avremo bisogno di tutte queste risorse. Smettiamo di sognare e andiamo avanti.

 
Nikolai Semko:

Ecco il mio pezzo.

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

Per MQL sarebbe fantastico avere un qualche tipo di puntatore per le variabili indicatori globali. Verrebbero inizializzati una volta sola e solo quando si installa l'indicatore.

Per esempio:
int global Var;

. In questo caso non avremo bisogno di tutte queste risorse. Smettiamo di sognare e andiamo avanti.

Oltre a PersistentStorage, ServerSideStorage sarebbe bello (per memorizzare anche piccole cose sul lato server) e AuthorOwnedCloud (per far gestire alcuni dati dall'autore)... ma è qualcosa del 21° secolo :-).

Sogna, basta così...

 
Nikolai Semko:

Quando il TF cambia, i nodi legati al tempo e al prezzo vengono mantenuti e non cambiano.

Si tratta di una misura statisticamente significativa del lancio della matrice?

 
Taras Slobodyanik:

:)

È strano che nessuno scriva di "stampelle", "reinvenzione di una ruota", "difficoltà di trasferimento dei dati a un altro terminale","il problema deve essere risolto con mezzi MQL "...
Si scopre che le soluzioni metaquot sono stampelle e mauvais ton)


Dov'è questa soluzione di MQ?
 

fxsaber:

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


Sembra che tu abbia una versione non aggiornata.
ultima versione 1.43
https://www.mql5.com/ru/code/22164

File:
iCanvas.mqh  52 kb
 
fxsaber:

Si tratta di una misura statisticamente significativa del lancio della matrice?

nessuno vi impedisce di fare i vostri aggiustamenti.

HH
E per favore non cominciate a parlare di corde.
In questo tipo di compiti sono irrilevanti, ecco perché non sono implementati nella mia classe e la mia struttura non può contenere il tipo stringa.
So che sono implementati nella sua classe. Ma stiamo parlando di qualcos'altro.

 
PapaYozh:

Dov'è questa soluzione di MQ?

Sì, certo, queste soluzioni non esistono affatto.

Così gli utenti inventano delle "stampelle" -FileWriteStruct e GlobalVariableSet.
E le soluzioni più prive di stampelle, naturalmente, sono scrivere le variabili nelle risorse, più scrivere le strutture nelle variabili globali)

 
Nikolai Semko:

Sembra che tu abbia una versione non aggiornata.
ultima versione 1.43
https://www.mql5.com/ru/code/22164

Questa versione è quella che ti ha dato l'errore.