[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 4. - pagina 523

 
Lisi4ka330:

Cari esperti, non c'è un errore nel libro di testo?

Ecco il mio ragionamento:

All'inizio del codice viene chiamata la funzioneint ArrayCopyRates che copia i dati delle barre del grafico corrente in un array bidimensionale di tipo RateInfo[][6] e restituisce il numero di barre copiate o -1 in caso di fallimento secondo l'esempio di questa funzione:

la barra corrente è la barra con indice 0-0 , quindi, tornando al codice originale, copiamo l'elemento con indice 0-0 (la barra corrente) dell'array1, a array2 con indice 0-0, otteniamo le ultime 10 barre (dove l'ultima barra è quella corrente, quella con indice [0]), il che è contrario a quanto abbiamo scritto nel tutorial... e rispettivamente, copiando l'elemento con indice Bars*6-60,60 dell'array1 nell'array2 con indice iniziale dell'elemento 0 otteniamo informazioni sulle barre dalla storia.


Senza fare dichiarazioni altisonanti, verifichiamolo nella pratica:

//+------------------------------------------------------------------+
//|                                                       массив.mq4 |
//|                                                  Copyright 2012, |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012,"
#property link      "https://forum.mql4.com/ru/46980/page525"
#property show_inputs
extern string s=" -----номер бара--------";
extern int a=9;//номер 10 последних баров 
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{if(a<10)
{double array1[][6];double array2[10][6];
  ArrayCopyRates(array1);
  ArrayCopy(array2,array1,0,Bars*6-60,60);
// теперь array2 содержит 10 последних баров из истории(имеется в виду,что последний бар-это текущий бар,бар с индексом [0])
Alert("Контрольный бар - ",a," время - ",TimeToStr(array2[a][0]),"  цена открытия - ",array2[a][1]);}return(0);}
 
Roll:


Senza fare affermazioni di alto profilo, mettiamolo alla prova:

Sì, in pratica risulta che l'elemento con indice Bars*6-60,60 è la barra corrente... allora come lo spieghi nell'esempio:

double array1[][6];
ArrayCopyRates(array1,"EURUSD", PERIOD_H1);
Print("Текущий бар ",TimeToStr(array1[0][0]),"цена открытия ", array1[0][1]);
La barra corrente è array1[0][0] e dopo aver copiato l'array diventa array1[Bars*6-60,60][0]... si scopre che da qualche parte c'è la rinumerazione... Naturalmente, il risultato è chiaro dopo aver usato la funzione nella pratica... ma la logica è incasinata, secondo me)))
 
Lisi4ka330:

Sì, in pratica risulta che l'elemento con indice Bars*6-60,60 è la barra corrente ...


Questa è la sua conclusione.
 
Roll:


Senza fare affermazioni di alto profilo, mettiamolo alla prova:

#property show_inputs
extern string s=" -----номер бара--------";
extern int a=9;//номер 10 последних баров 
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{if(a<10)
{double array1[][6];double array2[10][6];
  ArrayCopyRates(array1);
  ArrayCopy(array2,array1,0,Bars*6-60,60);
// теперь array2 содержит 10 последних баров из истории(имеется в виду,что последний бар-это текущий бар,бар с индексом [0])
Alert("Контрольный бар - ",a," время - ",TimeToStr(array2[a][0]),"  цена открытия - ",array2[a][1]);}return(0);}

Quindi ecco un elemento specifico dell'arrayTimeToStr(array2[a][0]).

Che l'uscita sia corretta, sono d'accordo. Ma cosa c'entra Bars*6-60? Quale valore viene sostituito a Bar durante il calcolo? Se le barre, come si ottengono le ultime 10 barre?

Si può notare che non sono l'unico che non ha capito questo sul forum, ma molti altri.

Si scopre che il numero di tutte le barre moltiplicato per 6 e meno 60. Da dove abbiamo preso 6? Non ha alcun senso.

 
hoz:

Quindi ecco un elemento specifico dell'arrayTimeToStr(array2[a][0]).

L'uscita è corretta, sono d'accordo. Ma cosa c'entra Bars*6-60... Quale valore viene sostituito a Bar durante il calcolo? Se le barre, come si ottengono le ultime 10 barre?

Come potete notare, non sono l'unico a non averlo capito sul forum, molti altri non l'hanno capito.



int Bars -- Numero di barre sul grafico corrente.

 
hoz:

Si scopre che il numero di tutte le barre moltiplicato per 6 e meno 60. Da dove abbiamo preso il 6? Non ha alcun senso.

Riferimento MQL4 - Operazioni sulle matrici - ArrayCopyRates
 
Roll:



int Bars -- Numero di barre sul grafico corrente.


Allora da dove vengono gli ultimi 10?

int Bars = 10 000;

Allora Bars*6 - 60 = 10 000*6 - 60 = 60 000 - 60 = 59 960;

Il valore di59 960 è maggiore del valore di Bars. E significa già che è fuori dalla matrice. E il 10 non si trova da nessuna parte...

 
hoz:

Si scopre che il numero di tutte le barre moltiplicato per 6 e meno 60. Da dove abbiamo preso il 6? Non ha alcun senso.

Per evitare di aggravare la confusione, voglio correggere l'errore che ho fatto nella risposta precedente - la notazione "array1[Bars*6-60,60][0]" non è corretta, perché Bars*6 è il numero totale di elementi in array1.Ogni barra ha 6 proprietà, supponiamo di avere 30 barre, moltiplicando per 6 otteniamo il numero di elementi nel primo array - 180. Il secondo array ha solo 60 "celle" libere (cioè 10 x 6 proprietà), quindi dobbiamo selezionare solo 60 elementi dal primo array da copiare. Esprimendo [Bars*6-60,60] sottraiamo 60 dal totale, cioè 180 - 60 = 120, cioè 120 elementi del primo array saranno scritti nell'elemento zero del secondo, 121 nel primo, e così via. Un'altra domanda è come risulta che le informazioni sulle ultime barre formate non sono scritte all'inizio del primo array, ma alla fine... Ma apparentemente la risposta si trova nel codice della funzione, e non ha senso scavare più a fondo...
 
hoz:


Allora da dove vengono gli ultimi 10?

int Bars = 10.000;

Allora Bars*6 - 60 = 10 000*6 - 60 = 60 000 - 60 = 59 960 -- errore!!!

Il valore di59 960 è maggiore del valore di Bars. E questo significa già che ha superato i limiti dell'array. E il 10 non si vede da nessuna parte.


Victor, non preoccuparti, ci arriverai. "L'esperienza è figlia di duri errori..." Andare dal semplice al complesso, non il contrario:

"PROGRESSO (dal lat. progressus - movimento in avanti), una direzione di sviluppo caratterizzata da una transizione dall'inferiore al superiore, dal meno perfetto al più perfetto. Si può parlare di progresso in relazione al sistema nel suo insieme, ai suoi singoli elementi, alla struttura dell'oggetto in sviluppo. Il concetto di progresso è l'opposto del concetto di regresso.

REGRESS (dal latino regressus - movimento inverso), il tipo di sviluppo che è caratterizzato dal passaggio da un livello superiore a uno inferiore. Il contrario del progresso".

 
Roll:


Victor, non preoccuparti, sei in vantaggio. "L'esperienza è figlia degli errori..." Andare dal semplice al complesso, non il contrario:

"Il progresso (dal latino progressus - movimento in avanti), la direzione dello sviluppo, caratterizzato dal passaggio dall'inferiore al superiore, dal meno perfetto al più perfetto. Il progresso può essere riferito al sistema nel suo insieme, ai suoi singoli elementi, alla struttura dell'oggetto in sviluppo. Il concetto di progresso è l'opposto del concetto di regresso.

REGRESS (dal latino regressus - movimento inverso), il tipo di sviluppo che è caratterizzato dal passaggio da un livello superiore a uno inferiore. Il contrario del progresso".


perché non spiegarlo semplicemente alla persona? Aiutarla a progredire? e tutto questo parlare di regressione è più che altro la nerdaggine di un insegnante...