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

 
andrey46:
Non so perché l'Expert Advisor nello Strategy Tester funziona bene, piazza ordini, ecc., ma nel conto reale, anche se il robot è attivo, gli ordini non vengono piazzati

Devi leggere la rivista, potrebbe esserci una risposta

 

Puoi dirmi come ottenere questo...

double w = 18.2

prendi questo -

int w = 18
 
TrederMT5:

Puoi dirmi come ottenere questo...

prendi questo -

int w1;
double w = 18.2;
w1=(int)w;
w=round (w);

Una conversione esplicita del tipo.

Si può anche arrotondare un intero da un non intero, ma il doppio sarà 18,0

 
scomoroh:

Allora ripeterò la domanda.

L'espressione

if (izmb>b ||izmb<b || izms>s || izms<s)

è identico a questo:

if (izmb!=b || izms!=s)

E se volete memorizzare qualcosa, fatelo in una variabile globale.

Questo è quello che viene dichiarato fuori dal corpo della funzione.

int izmb=0, izms=0;


void OnTick()
   {
   .........
 
Valeriy Yastremskiy:


Grazie
 

Buona giornata a tutti voi!

Domanda su MQL4. Ecco un semplice codice

double LoY[31][31],LoU,LoU1;
int S,S1,S2;
void OnTick()
{
if (Minute()==20&&Minute()!=S1)
{
ArrayFill(LoY,0,31,0.5555);
S1=Minute();
}
//***************************************************************
if (Minute()!=S)
{
LoY[0][0]=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],"  [29] ",   LoY[0][29],"  [30] ",   LoY[0][30]);
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],"  [29] ",   LoY[29][0],"  [30] ",   LoY[30][0]);
S=Minute();
}
}

Crea un array bidimensionale e lo riempie di valori. Ci sono due funzioni nel codice che mi interessano - ArrayFill(LoY,0,31,0.5555); e ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND); Secondo il Reference Manual, entrambe le funzioni lavorano con array bidimensionali.ArrayFill() lavora rigorosamente su array riempiti orizzontalmente, il Reference book specifica che riempie l'array con valori rigorosamente da sinistra a destra (non dall'alto in basso o dal basso in alto). ArraySort() ordina un array bidimensionale per la prima dimensione. La Reference non dice se ordina gli array riempiti orizzontalmente o verticalmente. A giudicare dall'esecuzione del mio codice, ArraySort() ordina solo gli array riempiti verticalmente . Sembra che queste due funzioni non possano gestire uno stesso array in un programma.

D. È importante per me che la funzione ArraySort() funzioni correttamente . Quindi, ArraySort() può essere configurato per ordinare gli array riempiti orizzontalmente, con cui ArrayFill() funziona? O la funzione di ordinamento di MQL5, che funziona in MQL4, può aiutarmi invece? O c'è una funzione che converte un array riempito orizzontalmente con tutti i suoi valori in uno verticale, in poche parole, come fare in modo che il mio programma ordini un array orizzontalmente

Nota. Usare un ciclo invece di ArrayFill() non funziona per me.

Grazie per l'aiuto.

 
ANDREY:

Buona giornata a tutti voi!

Domanda su MQL4. Ecco un semplice codice

Crea un array bidimensionale e lo riempie di valori. Ci sono due funzioni nel codice che mi interessano - ArrayFill(LoY,0,31,0.5555); e ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND); Secondo il Reference Manual, entrambe le funzioni lavorano con array bidimensionali.ArrayFill() lavora rigorosamente su array riempiti orizzontalmente, il Reference book specifica che riempie l'array con valori rigorosamente da sinistra a destra (non dall'alto al basso o dal basso all'alto). ArraySort() ordina un array bidimensionale per la prima dimensione. La Reference non dice se ordina gli array riempiti orizzontalmente o verticalmente. A giudicare dall'esecuzione del mio codice, ArraySort() ordina solo gli array riempiti verticalmente . Sembra che queste due funzioni non possano gestire uno stesso array in un programma.

D. È importante per me che la funzione ArraySort() funzioni correttamente . Quindi, ArraySort() può essere configurato per ordinare gli array riempiti orizzontalmente, con cui ArrayFill() funziona? O la funzione di ordinamento di MQL5, che funziona in MQL4, può aiutarmi invece? O c'è una funzione che converte un array riempito orizzontalmente con tutti i suoi valori in uno verticale, in poche parole, come fare in modo che il mio programma ordini un array orizzontalmente

Nota. Usare un ciclo invece di ArrayFill() non funziona per me.

Grazie per il vostro aiuto.

Hai notato il

nota

ArrayFill

L'array multidimensionale quando viene elaborato con ArrayFill() appare come monodimensionale, 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, chiamando ArrayFill(array, 5, 2, 3.14) per array[2][4] si riempirà array[1][1] e array[1][2] con 3.14.


Questa stringa

ArrayFill(LoY,0,31,0.5555);

riempirà l'array esattamente con una riga.

Per quanto riguarda la verticalità/orizzontalità, questo è il modo in cui terresti la testa guardando l'entrata. Guardate la tabella Excell e tutto diventerà chiaro. Se la colonna "A" è riempita di valori, si ottiene un array unidimensionale. Come è organizzato? Giusto... orizzontalmente, perché lo sto guardando sdraiato sul divano.........

 
Alexey Viktorov:

Avete notato il

nota

Questa linea

riempirà l'array esattamente con una riga.

Per quanto riguarda la verticalità/orizzontalità, è come terresti la testa guardando l'entrata. Guardate la tabella Excell e tutto diventerà chiaro. Se la colonna "A" è riempita di valori, si ottiene un array unidimensionale. Come è organizzato? Giusto... orizzontalmente, perché lo sto guardando sdraiato sul divano.........

Grazie per la 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 al ventesimo minuto.
Grazie per il vostro aiuto.

 
MakarFX:

Io ci proverei.

Grazie per il vostro aiuto. Farò un tentativo.

 
Aleksei Stepanenko:

l'espressione

è identico a questo:

E se volete memorizzare qualcosa, fatelo in una variabile globale.

Questo è quello che viene dichiarato fuori dal corpo della funzione.

Volevamo controllare le condizioni di ricerca per entrare nell'EA non ogni tick, ma solo se un altro ordine viene aperto o chiuso da un altro EA o manualmente (per evitare un carico inutile sul processore). Per questo dobbiamo controllare se il numero di ordini corrisponde ad ogni tick.

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

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