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

 
evillive:

int Mas[];


poi riempire il ciclo, se necessario, usare

ArrayResize(Mas,size);

ArrayInitialize(Mas,0);

"poi riempire il ciclo".
Se non è troppo disturbo, un piccolo esempio, per favore?
 
Leo59:
"then loop fill"
Se non è troppo disturbo, un piccolo esempio, posso?


 double MACDBuffer[]; int x=20;       // если известен размер буфера то              
 ArrayResize( MACDBuffer,x);         // то можно и просто  MACDBuffer[20], но  MACDBuffer[] нельзя.
 double min,max;
 int start(){
    for(int i=0; i<20; i++)
      MACDBuffer[i]=iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,0,MODE_EMA,PRICE_CLOSE,i);
    min=ArrayMinimum(MACDBuffer);
    max=ArrayMaximum(MACDBuffer);
    Print(min,"____",max);
 }

Vi è stato detto che per riempire un array dinamico MACDBuffer[], dovreste renderlo statico con ArrayResize() (altrimenti il risultato dell'assegnazione sarà sempre zero),

e, per assicurare la stabilità nell'adeguatezza dei calcoli, è meglio inizializzare l'array con ArrayInitialize().

 
ALXIMIKS:


Vi è stato detto che per riempire un array dinamico MACDBuffer[], dovreste renderlo statico con ArrayResize() (altrimenti il risultato dell'assegnazione sarà sempre zero),

e inoltre, per assicurare la stabilità dell'adeguatezza dei calcoli, è meglio inizializzare l'array con ArrayInitialize().


Grazie!
La questione è che c'è un Expert Advisor funzionante.
int CD=0; //numero d'ordine di una transazione chiusa
double Balance=0; // risultato di un trade chiuso
double Mas[]; // array di valori per i risultati di un trade chiuso


Come riempire Mas[] con i risultati delle transazioni chiuse in int Start()?

Forse bisogna scrivere qualcosa in init() e deinit()? Un inizializzatore o qualcos'altro?
Come sarebbe il codice corretto?

 
Leo59:
L'essenza della questione è che c'è un Expert Advisor in esecuzione.
int CD=0; // numero sequenziale di una transazione chiusa
double Balance=0; // risultato di un trade chiuso
double Mas[]; // array di valori per i risultati di un trade chiuso


Come in int Start() riempire Mas[] con i risultati dei trade chiusi?

Forse devo aggiungere qualcosa in init() e deinit()? Un inizializzatore o qualcos'altro?
Come sarebbe il codice corretto?

Ognuno ha una nozione diversa di "diritto".

Forse volete Mas[CD]=Balance nell'inizializzazione e l'assegnazione a Mas[CD]=Balance all'inizio quando cambiate il valore di CD?

O forse volete avere un array bidimensionale dove tutti i dati necessari (saldo, tempo, punti, capitale massimo, capitale minimo ....) sarebbero memorizzati per ogni transazione.

 
ALXIMIKS:


Vi è stato detto che per riempire un array dinamico MACDBuffer[], dovreste renderlo statico con ArrayResize() (altrimenti il risultato dell'assegnazione sarà sempre zero),

e inoltre, per assicurare la stabilità dell'adeguatezza dei calcoli, è meglio inizializzare l'array con ArrayInitialize().

ArrayResize() cambia la dimensione dell'array. In mql4 tutti gli array sono statici per default.
 
artmedia70:
ArrayResize() cambia la dimensione dell'array. In mql4 tutti gli array sono statici per default.

Mi sbagliavo. Il tutorial lo conferma:

Se la dimensione di una matrice unidimensionale da inizializzare non è specificata, viene determinata dal compilatore, in base alla dimensione della sequenza di inizializzazione. L'inizializzazione delle matrici può anche essere fatta usando la funzione standard ArrayInitialize(). Tutti gli array sono statici, cioè hanno una forma statica, anche se non specificata esplicitamente durante l'inizializzazione. Significa che tutti gli elementi dell'array mantengono i loro valori nell'intervallo tra le chiamate della funzione in cui l'array è dichiarato.

Ma perché allora un tale array "statico" non assegna valori? Il risultato è nullo come previsto a causa dell'ArrayResize(buffer,0) del compilatore?

int start(){
   double buffer[];
   for(int i=10;i>=0;i--){
      buffer[i]=i;
      Print ("buffer[i]=",buffer[i]);
   }
}
 
ALXIMIKS:

Mi sbagliavo. Il libro di testo lo conferma:

Ma allora perché un tale array "statico" non assegna valori? Il risultato è nullo come previsto a causa di ArrayResize(buffer,0) dal compilatore?

Perché l'array è dinamico. La sua dimensione nella prima dimensione può essere vista con ArraySize() - per un array unidimensionale, e ArrayRange() - per una dimensione specificata di un array multidimensionale.

Statico non significa "dimensione predefinita". Non confondete i due concetti "statico" e "dinamico". Non sono antonimi. Qui sono di diversi campi di applicazione. Analogia: un array statico è una "variabile statica". Un array dinamico è "una dimensione che può essere impostata e cambiata programmaticamente".

int start(){
   double buffer[];
   for(int i=0;i<10;i++){
      ArrayResize(buffer,i+1);
      buffer[i]=i;
      Print ("Размер массива = "+(string)ArraySize(buffer)+", Значение в buffer["+(string)i+"] = ",buffer[i]);
   }
   return(0);
}
 
Leo59:

Grazie!
La questione è che c'è un Expert Advisor funzionante.
int CD=0; // numero ordinale di un trade chiuso
double Balance=0; // risultato di un trade chiuso
double Mas[]; // array di valori dei risultati del trade chiuso


Come riempire Mas[] con i risultati delle transazioni chiuse in int Start()?

Forse bisogna scrivere qualcosa in init() e deinit()? Un inizializzatore o qualcos'altro?
Come sarebbe il codice corretto?

Tutti i risultati delle operazioni chiuse possono essere visualizzati nella storia del conto. Per software. Ma è necessario riempire l'array con loro tutto il tempo? Potrebbero essercene molti. È meglio limitare la profondità necessaria della storia e riempire l'array, se proprio non si può vivere senza.
 
Ragazzi, qualcuno sa come aggiungere livelli ausiliari alla RSI su Android?
 
ALXIMIKS:

Mi sbagliavo. Il libro di testo lo conferma:

Ma allora perché un tale array "statico" non assegna valori? Il risultato è nullo come previsto a causa di ArrayResize(buffer,0) dal compilatore?


Perché non è un array, per essere precisi. Se vuoi maggiori dettagli - vedi la descrizione del linguaggio C. Mi riferisco ad esso perché fin dall'inizio gli sviluppatori hanno detto che tutto ciò che non è chiaro o è spiegato in modo incompleto - vedi lo standard C.

Quando dichiarate la variabile double buffer[]; allora la memoria è allocata per una variabile, che in termini C è chiamata "puntatore", ha il tipo intero e memorizza l 'indirizzo della cella di memoria dove inizia l'array. Se si controlla la dimensionalità della variabile in MCL, si ottiene il valore 0. Questo significa che l'array stesso non è allocato in memoria e quando si cerca di assegnare un valore, non c'è nessun posto dove scriverlo: in MCL non c'è aritmetica degli indirizzi e i puntatori non possono essere gestiti. In C si può scrivere, ma con la memoria "non allocata" di solito porta a un crash del sistema. Quando applicate AreiResize(array,N), (N>0), questo alloca la memoria per l'array (almeno un elemento) e crea lo spazio per scrivere i valori. Poi, quando viene controllato, la dimensione dell'array sarà diversa da 0.

Il concetto di array statico in termini di C ha diversi significati:

1. un array statico (così come una variabile/tipo statico) sono tali variabili/array la cui dimensionalità è nota in fase di compilazione (precompilazione per MKL4). Per esempio, quando viene descritto double buff[10000];, al compilatore viene detta la dimensione della variabile e può immediatamente allocare la memoria. In contrasto con questo concetto, c'è il concetto di "array dinamico", cioè un tale array la cui dimensione è sconosciuta al momento della compilazione e diventa nota solo a run-time; questi sono tutti array di dimensione variabile. Quando si accede a tali array, la memoria deve essere allocata in anticipo. La memoria è allocata al di fuori della memoria statica del programma.

In C/C++, se un array è descritto in un blocco, la sua visibilità è limitata dal blocco - che si tratti di un array statico o dinamico. Errori nei programmi come i "memory leaks" sono associati agli array dinamici definiti localmente, cioè quando un puntatore di memoria viene distrutto perché lascia l'area di visibilità, ma la memoria allocata ad esso rimane occupata.

2 Il concetto di array "statico" come una variabile descritta con modificatore statico - tali variabili non vengono distrutte quando si lascia l'ambito del blocco - si trovano in un'area di memoria separata - quindi i valori in esse sono conservati. Il rischio di perdite di memoria è ridotto. Un array dichiarato come dinamico nel senso di p.1 (cioè la dimensione dell'array non è nota in fase di compilazione), può anche essere statico nel senso di p.2, cioè dichiarato con il modificatore "static".

Quando si terminano i programmi, la memoria allocata dinamicamente deve essere rilasciata per evitare perdite di memoria. Non so se gli sviluppatori di MKL seguono questo, ma nei miei programmi libero sempre la memoria - abitudine da C - ArreyResize(array,0);

In MKL tutti gli array sono statici nel senso del punto 2.

Ora, per quanto riguarda la tua domanda: "Perchénon si possono assegnare valori a un array statico doppio buffer[]; ? Perché nessuna memoria è allocata per esso (infatti, è un array dinamico con un modificatore statico). Prima di assegnare i valori, la memoria dovrebbe essere allocata, cioè ArrayResize con dimensione maggiore di 0 dovrebbe essere applicato a questo array. Per gli array, è necessario controllare l'overrun di memoria (fuori dall'array).

SZ Spero di essere stato chiaro. Ho cercato di mantenerlo il più semplice possibile.

Motivazione: