MQL4 aggiornato e vecchio codice (condivisione delle esperienze di problem-solving)

 

Penso che questo argomento possa essere utile alla luce dell'aggiornamento.

L'altro giorno ho deciso stupidamente di aggiornare il terminale e ho testato i miei Expert Advisors su di esso, ma non li ho aggiornati sul conto reale.

Ho degli errori. Non voglio dire che la colpa è degli sviluppatori, è anche colpa mia. Tuttavia, vorrei rivelare un paio di dettagli dove ho incontrato dei problemi:

1. Caratteri illeggibili nei nomi delle variabili: è semplice perché il compilatore ha mostrato il simbolo $ come non valido. L'ha risolto rapidamente e facilmente. Non ci sono stati più errori in fase di compilazione.

Dopodiché, ho dovuto trovare i difetti nell'Expert Advisor, ai quali il compilatore non si lamentava.

2. Quando ho lanciato il test, ho ricevuto delle parolacce che la libreria stdlib.ex4 non è stata trovata. La soluzione è stata trovare il codice sorgente stdlib nella cartella specificata e ricompilarlo.

3. Poi ho eliminato i bug associati al fatto che ora come ho capito NULL e 0 (zero) sono cose diverse. Le funzioni precedenti come iOpen(NULL,PERIOD_W1,1) funzionavano correttamente come iOpen(0,PERIOD_W1,1) cioè sia 0 che NULL potevano essere specificati. Ora non funziona, ma il compilatore non impreca, si ottiene solo un errore durante il funzionamento di Expert Advisor.

4. Non so perché ho usato NormalizeDouble(pr1,Digits) quando ho impostato un prezzo aperto, un livello di stop o un profitto. Ora ho notato che questa funzione restituisce sempre un valore con 4 decimali quando provo USDJPY con 3 decimali e quindi ottengo errori quando apro un ordine. Ho sostituito Digits con Digits() e tutto funziona.

Questo è tutto ciò che ho affrontato al momento. Ora sto controllando il mio EA per eventuali altri problemi.

A proposito, se non ricompila il vecchio codice, ex4 funziona senza errori.

La mia build è attualmente 579, ho ancora 509 in esecuzione sul reale, il volo è ok, ma ho paura di aggiornare.

Se qualcuno ha incontrato problemi con la transizione - postate qui, sarà utile agli altri.

 
Controlla il 583, per favore.
 

Problema simile con la variabile Point. Passaggio a Point()

Non ho ancora avuto modo di costruire il 583. E il mio broker non ce l'ha ancora.

 

Ancora una volta su cifre e punti.

Ho scoperto che il problema con loro si verifica quando si prova lo stesso Expert Advisor su simboli di diversa capacità di cifre. Il tester non sembra cambiare queste variabili. Per esempio, lo provo prima su Yerovdollar e poi cambio il simbolo per Dollar nel tester e il problema si verifica. O viceversa.

Quindi forse questo è solo un problema con il tester e questo non accadrà nella vita reale. Ma sono solo nel caso in cui cambio sempre cifre su cifre () e punto su punto ()

Il cambio di UPDATE ancora non aiuta. Solo il riavvio del terminale aiuta.

 
Grazie, lo controlleremo e lo sistemeremo lunedì.
 

Oh, pensavo che fosse il mio codice ad essere completamente incasinato...

Anche nel tester l'EA non funziona, se il primo test era su 4 cifre, allora le coppie yen non sono più testate, nessuna posizione aperta. Perché il test passi anche su di loro, devo riavviare il terminale o ricompilare l'EA.

Costruire 584.

No, non pretendo che il mio codice sia perfetto, ma lo stesso codice nella build 509 ha funzionato nel tester durante un cambiamento del simbolo testato senza riavviare il terminale, e senza ricompilazione.


P.S.: il problema è stato risolto chiamando i costrutti di tipo finora:

   digits = MarketInfo( Symbol(), MODE_DIGITS);
   point = MarketInfo( Symbol(), MODE_POINT);

invece di assegnare semplicemente dei valori a queste variabili, che sembrano significare la stessa cosa:

digits = Digits;
point = Point;
 

Quando traduco in stringa per il commento sul grafico, sostituisco Digits (dà 4) con il numero 5. Se accendo il "debug", modifico qualcosa, poi su "pausa" il grafico scompare, e al termine del debug appare un nuovo grafico (tutto verde) con Expert Advisor, ma senza indicatori! Sarà così o è temporaneo?

Meno male che solo quello sulla Demo è stato aggiornato. Quello su Real non si è ancora aggiornato. Non so cosa fare, ci sono posizioni aperte in un piccolo minus!

 

La freccia verde indica la prima linea di partenza:

int digits = MarketInfo( Symbol(), MODE_DIGITS); E in fondo: MQL4\Experts\"EA name" start e line number Nessun errore, ma non compila Cosa significa? Mi è stato detto che non sarebbe successo nulla! Potresti spiegare per favore!

 

InternetOpenUrlA() da wininet.dll ha smesso di funzionare

Emette 0 (zero) al posto del testo della pagina internet.

Ecco il codice completo.

#import "wininet.dll"

int InternetOpenA( string sAgent, int lAccessType, string sProxyName, string sProxyBypass, int lFlags );

int InternetOpenUrlA( int hInternetSession, string sUrl, string sHeaders, int lHeadersLength, int lFlags, int lContext );

int InternetReadFile( int hFile, int& lpvBuffer[], int lNumBytesToRead, int& lNumberOfBytesRead[] );

int InternetCloseHandle( int hInet );

int InternetQueryDataAvailable( int hFile, int& lpdwNumberOfBytesAvailable[], int dwFlags, int dwContext );

int HttpQueryInfoA(int hRequest, int dwInfoLevel, int& lpvBuffer[], int& lpdwBufferLength[], int& lpdwReserved[] );

#import


#define INTERNET_OPEN_TYPE_PRECONFIG 0x00000000 // use registry configuration

#define INTERNET_FLAG_RELOAD 0x80000000

#define INTERNET_FLAG_NO_CACHE_WRITE 0x04000000

#define INTERNET_FLAG_PRAGMA_NOCACHE 0x00000100



//+------------------------------------------------------------------+

//| script program start function |

//+------------------------------------------------------------------+

int start()

{

if(!IsDllsAllowed())

{

Alert("Необходимо в настройках разрешить использование DLL");

return(0);

}

int hInternetSession = InternetOpenA("Microsoft Internet Explorer",

0, "", "", 0);

if(hInternetSession <= 0)

{

Alert("Ошибка при вызове InternetOpenA()");

return(0);

}

int hURL = InternetOpenUrlA(hInternetSession,"https://www.mql4.com", "", 0, INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0);

if(hURL <= 0)

{

Alert("Ошибка при вызове InternetOpenUrlA()");

InternetCloseHandle(hInternetSession);

return(0);

}

int cBuffer[256];

int dwBytesRead[1];

string TXT = "";

while(!IsStopped())

{

bool bResult = InternetReadFile(hURL, cBuffer, 1024, dwBytesRead);

if(dwBytesRead[0] == 0)

break;

string text = "";

for(int i = 0; i < 256; i++)

{

text = text + CharToStr(cBuffer[i] & 0x000000FF);

if(StringLen(text) == dwBytesRead[0])

break;

text = text + CharToStr(cBuffer[i] >> 8 & 0x000000FF);

if(StringLen(text) == dwBytesRead[0])

break;

text = text + CharToStr(cBuffer[i] >> 16 & 0x000000FF);

if(StringLen(text) == dwBytesRead[0])

break;

text = text + CharToStr(cBuffer[i] >> 24 & 0x000000FF);

}

TXT = TXT + text;

Sleep(1);

}

if(TXT != "")

{

int h = FileOpen("SavedFromInternet.htm", FILE_CSV|FILE_WRITE);

if(h > 0)

{

FileWrite(h,TXT);

FileClose(h);

Alert("Готово! См. файл .../experts/files/SavedFromInternet.htm");

}

else

{

Alert("Ошибка при вызове FileOpen()");

}

}

else

{

Alert("Нет считанных данных");

}

InternetCloseHandle(hInternetSession);

return(0);

}

 
A causa del passaggio alle stringhe unicode, è ora necessario utilizzare InternetOpenUrlW
 
Renat:
A causa del passaggio alle stringhe unicode, è ora necessario usare InternetOpenUrlW

Ha funzionato davvero! Grazie!
Motivazione: