CopySeries

Ottiene le Timeseries sincronizzate dalla struttura MqlRates per il simbolo-periodo specificato e la quantità specificata. I dati vengono ricevuti nella serie di array indicati. Gli elementi sono conteggiati dal presente al passato, il che significa che la posizione di partenza uguale a 0 significa la barra corrente.

copyseries

Se la quantità  di dati da copiare è sconosciuta, si consiglia di utilizzare gli array dinamici come array riceventi, poichè se la quantità  di dati eccede ciò che un array può contenere, questo può causare il tentativo di ridistribuire l'array per adattarsi a tutti i dati richiesti.

Se si ha la necessità di copiare una quantità  predeterminata di dati, si consiglia di utilizzare un buffer allocato staticamente per evitare riallocazioni di memoria inutili.

La proprietà dell'array ricevente — as_series=true or as_series=false — verrà  ignorato: durante la copia, l'elemento Timeseries più vecchio verrà copiato all'inizio della memoria fisica allocata per l'array.

int  CopySeries(
   string           symbol_name,       // nome del simbolo
   ENUM_TIMEFRAMES  timeframe,         // periodo
   int              start_pos,         // posizione iniziale
   int              count,             // quantità da copiare
   ulong            rates_mask,        // combinazione di flag per specificare la serie richiesta
   void&            array1[],          // array per ricevere i dati della prima Timeseries copiata
   void&            array2[]           // array per ricevere i dati della seconda Timeseries copiata
   ...
   );

Parametri

symbol_name

[in] Simbolo.

timeframe

[in]  Periodo.

start_pos

[in] Indice del primo elemento copiato.

count

[in] Numero di elementi copiati.

rates_mask

[in] Una Combinazione di flag dell'enumerazione ENUM_COPY_RATES.

array1, array2,...

[out] Array del tipo appropriato per ricevere le Timeseries dalla struttura MqlRates. L'ordine degli array passati alla funzione deve corrispondere all'ordine dei campi nella struttura MqlRates.

Valore Restituito

Il numero degli elementi copiati o -1 in caso di errore.

Nota

Se l'intero intervallo dei dati richiesti è fuori dai dati disponibili sul server, la funzione restituisce -1. Se i dati richiesti sono oltre TERMINAL_MAXBARS (il numero massimo di barre sul grafico), la funzione restituisce ugualmente -1.

Quando si richiedono dati da un indicatore, la funzione restituisce immediatamente -1 se le Timeseries richieste non sono ancora costruite o devono essere scaricate dal server. Tuttavia, questo avvierà il download/costruzione dei dati.

Quando si richiedono dati da un Expert Advisor o uno script, verrà avviato il download dal server se il terminale non dispone dei dati appropriati localmente, o la costruzione delle timeseries necessarie inizia se i dati possono essere costruiti dallo storico locale, ma non sono ancora pronti. La funzione restituisce la quantità di dati che è pronta nel momento in cui scade il timeout, tuttavia il download dello storico continua e la funzione restituisce più dati durante la successiva identica richiesta.

Differenza tra CopySeries e CopyRates

La funzione CopySeries consente di ottenere solo le timeseries necessarie in diversi array specificati durante una chiamata, mentre tutti i dati timeseries saranno sincronizzati. Ciò significa che tutti i valori negli array risultanti ad un determinato indice N apparterranno alla stessa barra sulla coppia Simbolo/Timeframe specificati. Pertanto, non è necessario che il programmatore si assicuri della sincronizzazione di tutte le Timeserie ricevute dall'orario di apertura della barra.

A differenza di CopyRates, che restituisce il set completo di timeseries come array MqlRates, la funzione CopySeries consente al programmatore di ottenere solo le timeseries richieste come array separati. Questo può essere fatto specificando una combinazione di flag per selezionare il tipo di timeseries. L'ordine degli array passati alla funzione deve corrispondere all'ordine dei campi nella struttura MqlRates:

struct MqlRates
  {
   datetime time;         // periodo d'inizio
   double   open;         // prezzo di apertura
   double   high;         // prezzo massimo del periodo
   double   low;          // prezzo minimo del periodo
   double   close;        // prezzo di chiusura
   long     tick_volume;  // tick volume
   int      spread;       // spread
   long     real_volume;  // volume degli scambi
  }

Pertanto, se è necessario ottenere i valori delle timeseries di time, close ereal_volume per le ultime 100 barre del Simbolo/Timeframe corrente, è necessario utilizzare la seguente chiamata:

datetime time[];
double   close[];
long     volume[];
CopySeries(NULL,0,0,100,COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_VOLUME_REAL,time,close,volume);

Attenzione all'ordine degli array "time, close, volume" — deve corrispondere al l'ordine dei campi della struttura MqlRates. L'ordine dei valori nel rates_mask non ha importanza. La maschera potrebbe essere la seguente:

COPY_RATES_VOLUME_REAL|COPY_RATES_TIME|COPY_RATES_CLOSE

Esempio:

//--- parametri di input
input datetime InpDateFrom=D'2022.01.01 00:00:00';
input datetime InpDateTo  =D'2023.01.01 00:00:00';
input uint     InpCount   =20;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(void)
  {
//--- array per ottenere timeseries dalla struttura dei prezzi MqlRates
   double   open[];
   double   close[];
   float    closef[];
   datetime time1[], time2[];
//--- richiesta dei prezzi di chiusura ad un array double
   ResetLastError();
   int res1=CopySeries(NULLPERIOD_CURRENT0InpCount,
                       COPY_RATES_TIME|COPY_RATES_CLOSEtime1close);
   PrintFormat("1. CopySeries  returns %d values. Error code=%d"res1GetLastError());
   ArrayPrint(close);
  
//--- ora richiediamo anche i prezzi di apertura; utilizza array float per i prezzi di chiusura
   ResetLastError();
   int res2=CopySeries(NULLPERIOD_CURRENT0InpCount,
                       COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_OPENtime2openclosef);
   PrintFormat("2. CopySeries  returns %d values. Error code=%d"res2GetLastError());
   ArrayPrint(closef);
//--- Confrontare i dati ricevuti
   if((res1==res2) && (time1[0]==time2[0]))
     {
      Print("  | Time             |    Open      | Close double | Close float |");
      for(int i=0i<10i++)
        {
         PrintFormat("%d | %s |   %.5f    |   %.5f    |   %.5f   |",
                     iTimeToString(time1[i]), open[i], close[i], closef[i]);
        }
     }
//--- Risultato
 1. CopySeries restituisce 20 valori. Error code=0
 [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
 [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
 2. CopySeries restituisce 20 valori. Error code=0
 [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
 [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
   | Time             |    Open      | Close double | Close float |
 0 | 2023.03.01 17:00 |   1.06660    |   1.06722    |   1.06722   |
 1 | 2023.03.01 18:00 |   1.06722    |   1.06733    |   1.06733   |
 2 | 2023.03.01 19:00 |   1.06734    |   1.06653    |   1.06653   |
 3 | 2023.03.01 20:00 |   1.06654    |   1.06520    |   1.06520   |
 4 | 2023.03.01 21:00 |   1.06520    |   1.06573    |   1.06573   |
 5 | 2023.03.01 22:00 |   1.06572    |   1.06649    |   1.06649   |
 6 | 2023.03.01 23:00 |   1.06649    |   1.06694    |   1.06694   |
 7 | 2023.03.02 00:00 |   1.06683    |   1.06675    |   1.06675   |
 8 | 2023.03.02 01:00 |   1.06675    |   1.06684    |   1.06684   |
 9 | 2023.03.02 02:00 |   1.06687    |   1.06604    |   1.06604   |
//---
  }

Vedere anche

Strutture e classi, CopyRates