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

 
trader781:

In teoria so perché è successo, quindi la mia domanda è: possiamo parlare brevemente dell'uso degli array?

Dove è necessario inizializzarli, cancellarli ed elaborarli per farli funzionare?

P.S

quando google l'ha bandito sembra qualcosa del genere:

Cosa ti fa pensare che si tratti di una matrice?
 
Alexey Viktorov:
Perché pensi che sia a causa dell'array?
Perché questo non è mai successo prima, e se è successo, ho fatto un errore da qualche parte, ed è per questo che vengo qui. Si potrebbe fare da soli, ma ci vuole molto più tempo.
 
trader781:

bisogno di

1) crearlo da qualche parte (in un'area globale, come funzione, in onit o ontic?)

2) scrivere ogni biglietto in esso quando si invia un ordine, dandogli un numero in ordine

3) tirarli fuori da lì come necessario attraverso il numero

4) Quando si chiude tutta la griglia, azzerare i parametri

Non c'è bisogno di tenerlo sempre in memoria. Quando avete bisogno di trovarlo, dovete chiamare la funzione con un array locale dove metterete tutti gli ordini/posizioni nel ciclo, ordinate l'array come vi serve, selezionate gli ordini necessari da esso, fate quello che vi serve con loro, e quando uscite dalla funzione, dimenticate quell'array locale. E la prossima volta che chiamerete di nuovo la funzione, essa ordinerà gli ordini/posizioni che saranno presenti al momento di tale chiamata, e farà lo stesso con loro. E non avete bisogno di un array globale che dovete costantemente monitorare e controllare.
 
Artyom Trishkin:
Non c'è bisogno di tenerlo sempre in memoria. Quando avete bisogno di trovarlo, chiamate la funzione con un array locale al suo interno dove metterete tutti gli ordini/posizioni nel ciclo, ordinate l'array come vi serve, selezionate gli ordini necessari da esso, fate quello che vi serve con essi, e quando uscite dalla funzione, vi dimenticate dell'array locale. E la prossima volta che chiamerete di nuovo la funzione, essa ordinerà gli ordini/posizioni che saranno presenti al momento di tale chiamata, e farà lo stesso con loro. E non avete bisogno di un array globale che dovete costantemente guardare e controllare.

Non so quanto sia più economico. Ogni situazione ha la sua soluzione. Non c'è un evento OnTradeTransaction() in MQL4, ma dobbiamo tenere traccia dei "nostri" ordini in qualche modo... È qui che l'array di variabili globali torna utile.

Immaginate che ci siano diversi Expert Advisors in esecuzione su un conto, uno dei quali ha calcoli pesanti, e l'altro ha un enorme numero di ordini... Come funzionerebbe con i calcoli pesanti? Questo EA dovrà cercare una quantità enorme di ordini? Non si può fare a meno della ricerca in generale, ma si dovrebbe ridurre al minimo questa procedura.

E per determinare se l'ordine è chiuso o no? Passare attraverso tutta la storia? Non è troppo caro?

 
trader781:
Non ho mai fatto questo tipo di errore prima d'ora, ma se l'ho fatto, ho fatto un errore, ecco perché lo sto chiedendo qui. Potrei farlo da solo, ma ci vuole molto più tempo.

Come avete capito dal mio post precedente, uso gli array abbastanza spesso e non ho mai avuto problemi con loro. Una volta ho scritto un EA che apriva più di 2000 ordini i cui ticket erano memorizzati in un array e non c'erano problemi. Non posso credere che i problemi appaiano a causa dell'array. Non riesco nemmeno a credere quale errore possa aver causato tali problemi.

Mi viene in mente il film "Non può essere"... "Non è la birra che uccide la gente, è l'acqua che uccide la gente"...

 
Alexey Viktorov:

Non so quanto sia più economico. Ogni situazione ha la sua soluzione. Non c'è un evento OnTradeTransaction() in MQL4, ma dobbiamo tenere traccia dei "nostri" ordini in qualche modo... È qui che l'array di variabili globali torna utile.

Immaginate che ci siano diversi Expert Advisors in esecuzione su un conto, uno dei quali ha calcoli pesanti, e l'altro ha un enorme numero di ordini... Come funzionerebbe con i calcoli pesanti? Questo EA dovrà cercare una quantità enorme di ordini? Non si può fare a meno della ricerca in generale, ma sarebbe bello ridurre al minimo questa procedura.

Come controllare se l'ordine è stato chiuso? Passare attraverso tutta la storia? Non è troppo caro?

Tutto può essere risolto.

Per esempio, ho creato da tempo una classe che controlla tutto questo. Puoi creare/cancellare oggetti di classe dinamicamente per ogni simbolo, magik, timeframe, o tutti per un conto o una combinazione di essi - puoi scegliere. Qualsiasi ciclo di ricerca necessario viene già eseguito su una nuova zecca una volta, e ci sono tutti i dati necessari. Naturalmente, ci sono casi in cui è impossibile fare a meno di un ciclo in più, ma è il secondo ciclo aggiuntivo per tick. E non avere un ciclo separato in ogni funzione è un terribile spreco di risorse.

 
Artyom Trishkin:

Tutto è risolvibile.

Io, per esempio, ho fatto da tempo una classe che si occupa di tutto questo. Puoi creare/cancellare oggetti di classe dinamicamente per ogni simbolo, magik, timeframe, o tutti per un conto, o combinazioni di essi - puoi scegliere. Qualsiasi ciclo di ricerca necessario viene già eseguito su una nuova zecca una volta, e ci sono tutti i dati necessari. Naturalmente, ci sono casi in cui è impossibile fare a meno di un ciclo in più, ma è il secondo ciclo aggiuntivo per tick. E non avere un ciclo separato in ogni funzione è un terribile spreco di risorse.

Beh, nessuno lo mette in dubbio. È diventato ancora più conveniente con l'avvento delle strutture.
 
Artyom Trishkin:
Non c'è bisogno di tenerlo sempre in memoria. Quando hai bisogno di trovarlo, dovresti chiamare la funzione con un array locale al suo interno dove metterai tutti gli ordini/posizioni nel ciclo, ordinare l'array come ti serve, selezionare gli ordini necessari da esso, fare qualsiasi cosa tu abbia bisogno con loro, e quando esci dalla funzione, dimentichi quell'array locale. E la prossima volta che chiamerete di nuovo la funzione, essa sistemerà gli ordini/posizioni che ci saranno al momento di tale chiamata, e farà di nuovo la stessa cosa con loro. E non avete bisogno di un array globale che dovete costantemente monitorare e controllare.

Ok, ecco una visione semplificata.

Se l'array è locale, dove volete metterlo? Ovviamente non nell'ontik.

void OnTick()
{  

       if(FindLastOType()==OP_BUY)  //+------ если последний покупка
           {
            if(Ask<=FindLastOrderOpenPrice()-Step*Point())//+------------если ордер в минус
              {
               TotalClose();
              }
            else
            if(Ask>=FindLastOrderOpenPrice()+Step*Point())//+------------если ордер в плюс и это 5 ордер в списке
              {
               ticket=OrderSend(Symbol(),OP_BUY,(лот2 ордера+лот4 ордера),Ask,50,0,0,"",Magic,0,clrAzure);
              }        
           }  
}

 
trader781:

Ok, ecco una visione semplificata.

Se l'array è locale, dove lo metto? Ovviamente non nell'ontik.

void OnTick()
{  

       if(FindLastOType()==OP_BUY)  //+------ если последний покупка
           {
            if(Ask<=FindLastOrderOpenPrice()-Step*Point())//+------------если ордер в минус
              {
               TotalClose();
              }
            else
            if(Ask>=FindLastOrderOpenPrice()+Step*Point())//+------------если ордер в плюс и это 5 ордер в списке
              {
               ticket=OrderSend(Symbol(),OP_BUY,(лот2 ордера+лот4 ордера),Ask,50,0,0,"",Magic,0,clrAzure);
              }        
           }  
}

Per favore, leggete cos'è una funzione. Allora capirete che l'array dichiarato nel corpo della funzione sarà locale - fuori dalla vista del resto del programma.
 
bool WriteToFile(int FileHandle,string DataToWrite)
  {
// Receives the number of bytes written to the file. Note that MQL can only pass
// arrays as by-reference parameters to DLLs
   int BytesWritten[1]={0};

// Get the length of the string
   int szData=StringLen(DataToWrite);

// Do the write
   WriteFile(FileHandle,DataToWrite,szData,BytesWritten,0);

// Return true if the number of bytes written matches the expected number
   return (BytesWritten[0] == szData);
  }

Voglio scrivere una linea nel file con le traduzioni in una nuova linea, ma non funziona, questo codice è da quihttps://www.mql5.com/en/forum/118999

questo codice scrive una linea con spazi dopo ogni lettera, ho bisogno di una sostituzione per FileWrite() ma funziona

Reading and writing files anywhere on disk using CreateFileA() etc.
Reading and writing files anywhere on disk using CreateFileA() etc.
  • www.mql5.com
There are frequent questions in this forum (e.g...
Motivazione: