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

 

1.Ho una domanda, come posso eliminare un elemento di un array attraverso la memoria, al momento elimino un elemento spostando matematicamente l'array attraverso un ciclo, è possibile in mql4? Se è possibile, date un esempio di come questo viene fatto su un array monodimensionale.

2. Inoltre, quale modo sarebbe più performante, tenendo conto: se elimino tramite la memoria, tagliando un segmento con elementi non necessari, l'array si ridurrà e il suo numero diminuirà del valore degli elementi eliminati, e nel seguente uso dell'array, dovremo ripristinare l'array al suo stato originale; se elimino tramite un metodo matematico, l'elaborazione del ciclo, che comporta calcoli costanti per assegnare valori alle variabili, che a sua volta influenza il programma?

 
Seric29:

1.Ho una domanda, come posso eliminare un elemento di un array attraverso la memoria, al momento elimino un elemento spostando matematicamente l'array attraverso un ciclo, è possibile in mql4? Se è possibile, date un esempio di come questo viene fatto su un array monodimensionale.

2. Inoltre, quale modo sarà più performante, tenendo conto che se si elimina tramite la memoria, si taglia una matrice con elementi non necessari, la matrice si ridurrà e il suo numero diminuirà del valore degli elementi eliminati, e nel seguente uso di una matrice, dovremo ripristinare la matrice al suo stato originale; se si elimina tramite un metodo matematico, l'elaborazione del ciclo, che comporta calcoli costanti per assegnare valori alle variabili, che a sua volta influenza il programma?

Basta copiare l'array "in se stesso" e ridurre la dimensione dell'array del numero di elementi di cui non ha bisogno.

Per inserire un singolo elemento, basta aumentare la dimensione, copiare di nuovo "su se stesso" e incollare il valore desiderato nello spazio libero.

 
Alexey Viktorov:

Basta copiare l'array "in se stesso" e ridurre la dimensione dell'array del numero di elementi non necessari.

Per inserire un singolo elemento, basta aumentare la dimensione, copiare di nuovo "su se stesso" e incollare il valore desiderato nello spazio libero.

Ho provato a inserire un array tridimensionale nella funzione di copia, non ci sono errori, quindi questa funzione può funzionare con array di dimensioni diverse o semplicemente ha duplicati per dimensioni diverse. Come si è scoperto, questa funzione può essere usata al posto di una funzione shift, non c'è bisogno di scriverne una propria, vorrei averci pensato prima, come è rischioso copiare un array su se stesso, è scritto che il risultato può non essere definito.

 
Seric29:

Ho provato a inserire un array tridimensionale nella funzione di copia, nessun errore, quindi questa funzione può funzionare con array di dimensioni diverse o semplicemente ha duplicati per dimensioni diverse. Come si è scoperto, questa funzione può essere usata al posto di una funzione shift, non c'è bisogno di scriverne una propria, vorrei averci pensato prima, come è rischioso copiare un array su se stesso, è scritto che il risultato può non essere definito.

Quando copiate un array multidimensionale, dovete considerare la dimensionalità della seconda dimensione e di quelle successive. Questo determina quanto si deve spostare quando si copia. In poche parole, come ho capito nei miei esperimenti, tutti i valori dell'array multidimensionale sono allineati in "una riga" e poi allineati di nuovo in "colonna per..."

Tutto sommato, non posso raccontare la teoria ora. Dovrò controllarlo di nuovo, se avrò bisogno di usarlo.

 
Alexey Viktorov:

Quando si copia una matrice multidimensionale, si deve tener conto della dimensionalità della seconda dimensione e di quelle successive. Questo determina quanto spostamento è necessario quando si copia. In poche parole, come ho capito nei miei esperimenti, tutti i valori di un array multidimensionale sono allineati in "una riga" e poi allineati di nuovo in "colonna per...".

In generale non posso raccontare ora la teoria. Anche in questo caso bisognerà verificare se c'è bisogno di usarlo.

In C++, non c'è differenza tra questo

   вывести в консоль massiv[0][0][0]
   или так
   вывести в консоль massiv[0]

in ognuno di questi casi ci sarà un'uscita. Perché si trovano in un blocco di memoria e il C++ vi accede direttamente, mentre nella nostra shell l'accesso alla memoria è chiuso e non c'è modo di passare correttamente array di dimensioni diverse in una funzione, o indirizzarli in questo modo, l'unica sfumatura è che in C++ gli array multidimensionali si trovano in memoria dinamica, forse anche sparsi, sebbene nessuno abbia visto la mappa elettronica. Quindi, copiare gli array multidimensionali dal concetto in sé è una questione molto sottile o potrebbe non funzionare correttamente?

 
Come posso determinare programmaticamente se sono entrato nel mio conto usando la mia password di investimento o la mia password di trading?
 

Ho un codice che non viene eseguito in MQL5 nel mio indicatore

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH ? High[a] : Close[a]) > vhigh ? (price == STO_LOWHIGH ? High[a] : Close[a]) : vhigh);
      vlow  = ((price == STO_LOWHIGH ? Low[a] : Close[a]) < vlow ? (price == STO_LOWHIGH ? Low[a] : Close[a]) : vlow);
     };
  }

Il punto è che seprezzo == STO_LOWHIGH tutto funziona correttamente, ma seprezzo == STO_CLOSECLOSE la funzione assegna solo alle variabili statiche

vhigh = 0; vlow = High[i];

... bypassare il ciclo

 
Alexandr Sokolov:

Ho un codice che non viene eseguito in MQL5 nel mio indicatore

Il punto è che seprezzo == STO_LOWHIGH tutto funziona correttamente, ma se prezzo == STO_CLOSECLOSE la funzione assegna solo alle variabili statiche

... bypassare il ciclo

C'è qualcosa che non va con le parentesi. A mio parere, qui non sono affatto necessari. Nessuno di loro è assolutamente necessario.

O almeno spostare quelli evidenziati prima del punto di domanda a sinistra.

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH ? High[a] : Close[a]) > vhigh ? (price == STO_LOWHIGH ? High[a] : Close[a]) : vhigh);
      vlow  = ((price == STO_LOWHIGH ? Low[a] : Close[a]) < vlow ? (price == STO_LOWHIGH ? Low[a] : Close[a]) : vlow);
     };
  }

In generale, basta capire che l'operatore ?: è equivalente a if else

Hai una condizione due volte. Una condizione come questa sarebbe sufficiente

vhigh = price == STO_LOWHIGH ? High[a] : Close[a];
vlow  = price == STO_LOWHIGH ? Low[a] : Close[a];
Oppure non capisco dove volevi arrivare.
 
Alexey Viktorov:

C'è qualcosa che non va nelle staffe. A mio parere, non sono affatto necessari qui. Nessuno di loro lo è.

O almeno spostare quelli evidenziati a sinistra prima del punto di domanda.

In generale, basta capire che l'operatore ?: è equivalente a if else

Hai una condizione due volte. Una tale condizione sarebbe sufficiente.

Oppure non capisco dove volevi arrivare.

Voglio ottenere stocastici normali maxHigh e minLow nel periodo K per Low/High e Close/Close

Low/High durante l'inizializzazione funziona bene, ma Close/Close no

 
Alexey Viktorov:

C'è qualcosa che non va nelle staffe. A mio parere, non sono affatto necessari qui. Nessuno di loro lo è.

O almeno spostare quelli evidenziati a sinistra prima del punto di domanda.

In generale, basta capire che l'operatore ?: è equivalente a if else

Hai una condizione due volte. Una tale condizione è sufficiente.

Oppure non capisco dove volevi arrivare.

Non l'ho capito subito, ma se intendi questo

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH) ? High[a] : Close[a] > vhigh ? (price == STO_LOWHIGH) ? High[a] : Close[a] : vhigh);
      vlow  = ((price == STO_LOWHIGH) ? Low[a] : Close[a] < vlow ? (price == STO_LOWHIGH) ? Low[a] : Close[a] : vlow);
     };
  }

non risolve il mio problema.