Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1425

 
Taras Slobodyanik:

il formato dei commenti può variare da broker a broker.

Non ho visto l'assenza di "A" e "Da"
 
Artyom Trishkin:
Non ha visto l'assenza di "A" e "Da".
Artem, cerca la mia domanda sopra....
 

Buona giornata a tutti voi!

Potete dirmi se c'è una funzione in MQL4 (o in MQL5, ma funzionante in MQL4) che converte l' array LoY[2][7] in array LoY[7][2] e viceversa. Qualcosa come la trasposizione. Qui sotto c'è un esempio di trasformazione di cui ho bisogno. Voglio avere una funzione. So già come convertire un array in un ciclo.

Grazie per il vostro aiuto.

 
ANDREY:

Buona giornata a tutti voi!

Potete dirmi se c'è una funzione in MQL4 (o in MQL5, ma funzionante in MQL4) che converte l' array LoY[2][7] in array LoY[7][2] e viceversa. Qualcosa come la trasposizione. Qui sotto c'è un esempio di trasformazione di cui ho bisogno.

Grazie per il vostro aiuto.

Solo per riferimento: negli algoritmi classici (IT in generale) tale operazione è chiamata zip,

Non riesco a trovare una tale funzione nella biblioteca. È terribilmente dispendioso e inefficiente. È più facile e veloce cambiare gli indici nell'algoritmo/programma o usare accessi indiretti che riorganizzare TUTTI i dati negli array.

 
Maxim Kuznetsov:

È più facile e veloce cambiare gli indici nell'algoritmo/programma o usare accessi indiretti che riorganizzare TUTTI i dati negli array.

Grazie mille per la sua risposta. Sfortunatamente, non sono così avanzato nella programmazione come te. Vi sarei molto grato se poteste scrivere del codice mql4 che cambia gli indici delle matrici per risolvere il mio problema. E se lei dà un esempio di riferimento indiretto, le sarò doppiamente grato.

Capirò più accuratamente il vostro processo di pensiero e imparerò qualcosa di nuovo e utile per me grazie a voi.

 
ANDREY:

La ringrazio molto per la sua risposta. Sfortunatamente, non sono così avanzato nella programmazione come te. Vi sarei molto grato se poteste scrivere del codice mql4 per cambiare gli indici dell'array per risolvere il mio problema. E se lei dà un esempio di riferimento indiretto, le sarò doppiamente grato.

Capirò più accuratamente il vostro processo di pensiero e imparerò qualcosa di nuovo e utile per me grazie a voi.

void Convert_7x2_2x7 (const double &src[7][2],double &dst[2][7]) {

   for(int i=0;i<7;i++)

   for(int j=0;j<2;j++) {

dst[j][i]=src[i][j];

   }

}

È breve, ma è la cosa peggiore che si possa fare :-) due loop annidati e la copia elemento per elemento degli array.

Quando sei dentro il tuo algoritmo puoi semplicemente rinominare gli indici. Basta cambiare i in j nel tuo codice e viceversa...

 
Maxim Kuznetsov:

void Convert_7x2_2x7 (const double &src[7][2],double &dst[2][7]) {

   for(int i=0;i<7;i++)

   for(int j=0;j<2;j++) {

dst[j][i]=src[i][j];

   }

}

breve, ma è la cosa peggiore che puoi fare :-)

Grazie mille. E un esempio del migliore? :-).... in modo da avere una comprensione completa.

La copia elemento per elemento è lunga e consuma energia... specialmente per i grandi array...... se non mi sbaglio.

 
Andrei, perché vorresti farlo? Se i dati sono già raccolti in un array, si può trovare un modo per usarli così come sono senza spostare nulla. O preassemblarli in un array nel giusto ordine. Cosa vuoi ottenere?
 
Aleksei Stepanenko:
Andrei, perché ne hai bisogno? Se i dati sono già raccolti in un array, si può trovare un modo per usarli così come sono senza spostare nulla. Oppure potete assemblarli prima in un array nel giusto ordine. Cosa vuoi ottenere?

Ecco il mio semplice codice per illustrare ciò di cui ho bisogno.

double LoY[2][31],LoU,LoU1;
int S,S1,S2;

void OnTick()
{
//*************************************************** БЛОК 1
if (Minute()==20&&Minute()!=S1)
{
ArrayFill(LoY,0,10,0.5555);

S1=Minute();
}
//*************************************************** БЛОК 2
if (Minute()!=S)
{
LoY[0][S2]=Bid;
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
Print("----LoY[0][1]-- Г ---  [0]  ",  LoY[0][0],"  [1] ",   LoY[0][1],"  [2] ",   LoY[0][2],"  [3] ",   LoY[0][3],"  [4] ",   LoY[0][4],"  [26] ",   LoY[0][26],"  [27] ",   LoY[0][27],"  [28] ",   LoY[0][28],"  [30] ",   LoY[0][30],"  [60] ",   LoY[0][60]);
Print("----LoY[1][0]-- В ---  [0]  ",  LoY[0][0],"  [1] ",   LoY[1][0],"  [2] ",   LoY[2][0],"  [3] ",   LoY[3][0],"  [4] ",   LoY[4][0],"  [26] ",   LoY[26][0],"  [27] ",   LoY[27][0],"  [28] ",   LoY[28][0],"  [30] ",   LoY[30][0],"  [60] ",   LoY[60][0]);
S2++;
if (S2==62)
{
S2=0;
}
S=Minute();
}
}

Nel blocco 1, ArrayFill(LoY,0,10,0.5555) viene eseguito e assegna ai primi 10 elementi dell'array il valore 0.5555. Dopo di che, ho bisogno di ordinare l'intera riga null dalla colonna 0 alla colonna 31.

Voglio ordinarlo nel blocco 2, usando ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND); Ma non posso ordinarlo perché questa funzione ordina un array bidimensionale per la sua prima dimensione, cioè per righe. E ho una stringa per ordinare solo 1. ArraySort() sulla seconda dimensione, cioè, le colonne non ordinano gli array bidimensionali (solo monodimensionali).

Così ho pensato che forse dovrei convertire LoY[2][31] dopo il primo blocco in LoY[31][2], così ArraySort() potrebbe ordinare i valori che mi servono nel blocco 2. E ho bisogno di ordinare tutti i valori dalla riga zero dopo che ArrayFil() ha cambiato i primi 10 di loro.

Posso ordinare gli array bidimensionali per la seconda dimensione, cioè per colonne, usando qualche altra funzione o qualcos'altro?
Scusa... Non so come cancellare il codice. Quindi dirò solo che c'è un errore nella linea 180 invece di LoY[S2][0]=Bid; abbiamo bisogno di LoY[0][52]=Bid;

Grazie per il vostro aiuto.

 
Vuoi ordinare i valori in entrambe le righe o solo nella prima?