Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 66
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
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:
Perché pensi che sia a causa dell'array?
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, 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?
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"...
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.
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.
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.
{
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);
}
}
}
Ok, ecco una visione semplificata.
Se l'array è locale, dove lo metto? Ovviamente non nell'ontik.
{
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);
}
}
}
{
// 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