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

 

Hai provato a rendere le variabili globali?

int izmb=0, izms=0;

void OnTick()
   {
   double LB=0,LS=0;
   int b=0,s=0;
   
   for(int i=0; i<OrdersTotal(); i++)
      {    
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         { 
         if(OrderSymbol()==Symbol())
            { 
            if(OrderType()==OP_BUY)             
               {  
               LB+=OrderLots();
               b++; 
               }                                         
            else if(OrderType()==OP_SELL)        
               {
               LS+=OrderLots();
               s++;
               } 
            }
         }     
      }
   if(izmb!=b || izms!=s)
      { 
      izmb=b;
      izms=s 
           // далее идут условия для открытия ордера.
      }
 
scomoroh:

Volevamo controllare le condizioni per trovare un ingresso EA non ogni tick, ma solo quando un altro ordine viene aperto o chiuso da un altro EA o manualmente (in modo che il processore non sia sovraccaricato). Per questo dobbiamo controllare se il numero di ordini corrisponde ad ogni tick.

Possiamo usare una variabile statica ? Il programma funzionerà in tale forma?

In alternativa, la condizione più semplice e più facile

OnTrade() è un analogo per mt4 con mt5

void OnTrade()
 {
  ... // сюда код, который будет работать только по изменению ситуации по счёту: открытие/закрытие позиций, установка/удаление ордеров
 }

static _OTotal = -1;
static _HTotal = -1;
int OT=OrdersTotal();
int HT=OrdersHistoryTotal();
  if(OT!=_OTotal || HT!=_HTotal) // если изменилось - выполняем
   {
     OnTrade(); // здесь дёргаем текущую ситуацию на счёте и заполняем структуры
     _OTotal=OrdersTotal(); // запомним текущее количество
     _HTotal=OrdersHistoryTotal(); // запомним количество в истории
   }
 
ANDREY:

Grazie per la vostra risposta. Ho capito tutto quello che hai scritto. Ma non ho capito il senso di quello che hai scritto in termini del mio problema.

Per array bidimensionale orizzontale nel mio codice intendo quando ci sono 2 righe sotto l'indice 0 o 1 e colonne sotto gli indici da 0 a 30. La prima dimensione è indicata come[0][0],[0][1],[0][2], ...[0][30] La seconda dimensione è indicata come[1][0],[1][1],[1][2], ...[1][30]

Per array bidimensionale verticale nel mio codice intendo quando ci sono 31 righe indicizzate da 0 a 30 e 2 colonne indicizzate 0 e 1. La prima dimensione è indicata come[0][0],[1[0],[2][0], ...[30][0] La seconda dimensione è indicata come[0][1],[1][1],[2][1], ...[30][1]

Se eseguite il mio codice, l'array si riempirà verticalmente. E la funzione ArraySort() ordinerà l'array come dovrebbe.

DOMANDA Perché la funzione ArrayFill() non funziona in questo caso ? Dopo tutto, gli ho chiesto di riempire la prima dimensione dell'array (31 elementi) con gli stessi valori 0,5555.
Grazie per l'aiuto.

MQL4 può lavorare con non più di 4 matrici dimensionali. Quindi, arr[31][31] è un errore. Un array non può essere più grande di arr[][4]. E la prima dimensione è limitata non da MQL, ma da cosa, non so esattamente. Forse qualcuno può spiegare.

La funzione ArrayFill() funzionerà, ma dobbiamo capire che il numero di elementi nell'array arr[3][2] sarà 6, e dobbiamo scrivere 6 in questa funzione, non 3 per la dimensione della prima dimensione.

 

Dimensione quadridimensionale: arr[][][][][] o arr[,,,].

Le dimensioni delle ultime tre dimensioni devono essere specificate nella dichiarazione e fissate. La prima dimensione può essere lasciata non specificata e può essere modificata in seguito:

int arr[,100,200,500];

Nell'esempio di una matrice bidimensionale, i dati nella matrice sono disposti come segue:

int arr[2,5]={0,1,2,3,4,  - в нулевом элементе первого измерения 
              5,6,7,8,9}; - в первом элементе первого измерения

Ordina sposta l'intero orizzontale ordinando per la prima dimensione,

e ArrayFill() riempie da un elemento all'altro, per esempio da 3 a 8. Questo si traduce in un pasticcio.

Se volete riempire alcuni valori in orizzontale dalla prima dimensione, dovete controllare l'inizio e la fine del riempimento, sapendo come sono disposti i dati.

Per esempio, l'intero righello dell'elemento zero della prima dimensione:

int value=5;
int index=0;
ArrayFill(arr, index*ArrayRange(arr,1), ArrayRange(arr,1), value); 

Se solo un elemento zero, allora sì:

ArrayFill(arr, index*ArrayRange(arr,1), 1, value); 

Se molti elementi zero, allora con il looping e l'assegnazione semplice.


Non devo essermi spiegato molto bene... Usa la stampante, stampa tutto nel ciclo, di qua e di là, e ci prenderai la mano. Imparerai più velocemente in questo modo.

printf è mio amico!

 
Alexey Viktorov:

MQL4 non può gestire più di 4 matrici dimensionali. Quindi, arr[31][31] è un errore. Un array non può essere più grande di arr[][4]. E la prima dimensione è limitata non da MQL, ma da cosa, non so esattamente. Forse qualcuno può spiegare.


E la prima dimensione (cioè il numero di stringhe) di quanti è limitata? Non più di quante righe in un array multidimensionale permette MQL4?

 

Credo che tutte e quattro le dimensioni abbiano un limite:INT_MAX

Sulla struttura.

bidimensionale:

Per struttura, rappresenta un array unidimensionale in cui gli elementi sono disposti come segue: prima la prima riga, poi la seconda, poi la terza.

tridimensionale:

Anche in tridimensionale. È un array unidimensionale, dove le prime righe sono una dopo l'altra, poi la seconda,.....

Perché unidimensionale? Perché diverse celle in una riga sono allocate per l'array nella memoria del computer, quindi scrivono tutto in ordine: row00+row01+row02+row10+row11....


Ed è anche possibile aggiungere una quarta dimensione: pile di fogli di matrice tridimensionale.

Solo il numero di righe può essere cambiato nel corso del programma. Tutte le righe, colonne, fogli e pile sono solo una convenzione per capire la struttura. Le dimensioni non sono effettivamente nel nostro spazio, sono solo misure.

Come dice Alexei:

Alexey Viktorov:

... colonna ... è ... orizzontalmente perché lo sto guardando sdraiato sul divano.........

 
Alexey Viktorov:

Avete notatola seguente nota

ArrayFill

L'arraymultidimensionale quando viene elaborato con ArrayFill() vienerappresentato come unidimensionale, per esempio, array[2][4] viene elaborato come array[8], quindi quando si lavora con questo array è accettabile specificare l'indice dell'elemento iniziale uguale a 5. Quindi, chiamare ArrayFill(array, 5, 2, 3.14) per array[2][4] riempirà gli elementi array[1][1] e array[1][2] con il valore 3.14.


Ho capito tutto tranne ArrayFill().

1. Quando dichiaro un array doppio LoY[31][31]; sto essenzialmente creando una tabella di 31 righe per 31 colonne. Ho creato un array bidimensionale (invece che quadridimensionale), ma non l'ho ancora riempito.

2. Poi nel codice riempio ogni singolo elemento dell'array con un valore Bid. Posso riempirlo con 2 opzioni
a) LoY[31][0]=Bid; - riempio la riga 31 e la prima colonna dell'array con i valori Bid. E la seconda dimensione (colonna sotto l'indice 1, è riempita con 0 per default, perché non la riempio. Così in questa variante ho laprima dimensione con 31 elementi riempiti e la seconda dimensione con 1.

b) LoY[0][31]=Bid - Riempio la colonna 31 e la prima riga dell'array con i valori Bid . E la seconda dimensione (linea sotto l'indice 1, è riempita con 0 per default, perché non la riempio. Così, in questa variante, la seconda dimensione consiste di 31 elementi riempiti, la seconda dimensione consiste di 1.

ArraySort() ordina l'array bidimensionale solo per la prima dimensione. Perciò ordinerà l'opzione a) in cui la prima dimensione ha 31 righe e non ordinerà l'opzione b), in cui la prima dimensione ha solo 1 riga, perché 1 riga non può essere ordinata.
OraArrayFill() Tira l'array bidimensionale in una sola riga prima di assegnare i valori richiesti agli elementi dell'array bidimensionale. Cioè, dovrà tirare il mio array LoY[31][31] in una sola linea di dimensione 961 elementi. È una stringa molto lunga e la maggior parte degli elementi saranno inutili.

Quindi facciamo un array LoY[31][2] (variante a))o LoY[2][31] (variante b))

È chiaro comeArrayFill() disegnerà in 1 linea nella variante b). La seconda linea si unirà semplicemente alla prima e dopo l'ultimo elemento della prima linea LoY[0][31] la prima linea dell'array in ArrayFill() continuerà conLoY[0][32] e finirà conLoY[0][62] E i valori degli elementi dell'array in ArrayFill() andranno nel seguente ordine dall'indice 0 a 31 gli elementi dell'array saranno riempiti con valori di prezzo e dall'indice 32 alla fine saranno riempiti con 0 .

DOMANDA: come faArrayFill() a disegnare l'opzione a) in 1 linea? Dopo tutto, ci sono 28 righe in questa variante. E se sarà una riga, in quale ordine conterrà i valori degli elementi dell'array? E posso usare Print() per stampare gli elementi del mio array bidimensionale dopo che ArrayFill() li converte in un array unidimensionale? Questa stessa funzione non restituisce alcun valore e quindi Print() non lo stampa se viene inserito.

Grazie per l'aiuto.

 

Ho fatto un po' di confusione qui... mi vergogno di me stesso.

elemento dell'array con un valore Bid. Posso riempirlo con 2 opzioni
a) LoY[31][0]=Bid; - riempio la riga 31 e la prima colonna dell'array con i valori Bid. E la seconda dimensione (colonna sotto l'indice 1, è riempita con 0 per default, perché non la riempio. Così in questa variante ho laprima dimensione con 31 elementi riempiti e la seconda dimensione con 1.

b) LoY[0][31]=Bid - Riempio la colonna 31 e la prima riga dell'array con i valori Bid . E la seconda dimensione (linea sotto l'indice 1, è riempita con 0 per default, perché non la riempio. Così, in questa variante, la seconda dimensione consiste di 31 elementi riempiti, la seconda dimensione consiste di 1.

ArraySort() ordina l'array bidimensionale solo per la prima dimensione. Perciò ordinerà l'opzione a) in cui la prima dimensione ha 31 righe e non ordinerà l'opzione b), in cui la prima dimensione ha solo 1 riga, perché 1 riga non può essere ordinata.
OraArrayFill() Tira l'array bidimensionale in una sola riga prima di assegnare i valori richiesti agli elementi dell'array bidimensionale. Cioè, dovrà tirare il mio array LoY[31][31] in una sola linea di dimensione 961 elementi. È una stringa molto lunga e la maggior parte degli elementi saranno inutili.

Quindi facciamo un array LoY[31][2] (variante a))o LoY[2][31] (variante b))

È chiaro comeArrayFill() disegnerà in 1 linea nella variante b). La seconda linea si unirà semplicemente alla prima e dopo l'ultimo elemento della prima linea LoY[0][31] la prima linea dell'array in ArrayFill() continuerà conLoY[0][32] e finirà conLoY[0][62] E i valori degli elementi dell'array in ArrayFill() andranno nel seguente ordine dall'indice 0 a 31 gli elementi dell'array saranno riempiti con valori di prezzo e dall'indice 32 alla fine saranno riempiti con 0 .

DOMANDA: come faArrayFill() a disegnare l'opzione a) in 1 linea? Dopo tutto, ci sono 28 righe in questa variante. E se sarà una riga, in quale ordine conterrà i valori degli elementi dell'array? E posso usare Print() per stampare gli elementi del mio array bidimensionale dopo che ArrayFill() li converte in un array unidimensionale? Questa funzione in sé non restituisce alcun valore, quindi Print() non lo stamperà se viene inserito.

Grazie per il vostro aiuto.

Ho difficoltà a capirti. Forse è per questo che non riesco a capire bene. Ripetete la domanda con la matrice LoY[5][3], cioè 5 righe e 3 colonne.

ArrayFill non converte l'array iniziale in alcun modo. Elabora solo l'array come se fosse un array unidimensionale. La funzione esegue le azioni necessarie sull'array e rientra senza influenzare la dimensionalità.

Secondo la documentazione, la funzioneArrayFill(LoY, 3, 6, 12) riempirà solo le righe con indice 1 e 2 nell'array LoY con il valore 12.

LoY[1][0] sarà riempito con 12.

LoY[1][1] avrà il valore 12.

LoY[1][2] avrà il valore 12.

LoY[2][0] avrà il valore 12.

LoY[2][1] avrà il valore 12 .

LoY[2][2] sarà impostato su 12 .

Tutti gli altri saranno lasciati intatti.

Sperimentate con una piccola matrice e con numeri facili da capire. Per esempio 12 e 8 si noterà facilmente quale è più grande. E 1.123654 e 1.123583 è più complicato

 
Alexey Viktorov:

ArrayFill non converte l'array originale in alcun modo. Elabora solo l'array come se fosse un array unidimensionale. La funzione esegue le azioni necessarie sull'array e lo scarica senza disturbare la dimensionalità.


Questo ha ridotto di molto la mia incomprensione e ha aumentato la mia comprensione. Ora rianalizzerò tutto quello che ho scritto tenendo conto delle nuove circostanze scoperte ....

 
Alexey Viktorov:


Secondo la documentazione, la funzioneArrayFill(LoY, 3, 6, 12) riempirà solo l'array LoY con le righe 1 e 2 con 12.

LoY[1][0] avrà un valore di 12.

LoY[1][1] avrà il valore 12.

LoY[1][2] avrà il valore 12.

LoY[2][0] avrà il valore 12.

LoY[2][1] avrà un valore di 12 .

LoY[2][2] sarà impostato su 12 .


DOMANDA
Come e quali valori dovrei inserire inArrayFill() se ho bisogno di riempire gli elementi gialli dello stesso array con il valore 12?

OPZIONE N 1

OPZIONE N 2


Grazie per il vostro aiuto.