Actualización del MQL4 y del código antiguo (intercambio de experiencias para la resolución de problemas)

 

Creo que este tema puede ser útil a la luz de la actualización.

El otro día decidí tontamente actualizar el terminal y probar mis Expert Advisors en él, pero no los actualicé en la cuenta real.

Tengo errores. No quiero decir que la culpa sea de los desarrolladores, también es mía. Sin embargo, me gustaría especificar un par de detalles en los que he encontrado problemas:

1. Caracteres ilegibles en los nombres de las variables: Es sencillo porque el compilador mostró el símbolo $ como inválido. Lo solucioné rápida y fácilmente. No hubo más errores en la fase de compilación.

Después, tuve que corregir los errores del Asesor Experto, a los que el compilador no se quejó.

2. Al lanzar la prueba, me ha dicho que no se ha encontrado la biblioteca stdlib.ex4. La solución fue encontrar el código fuente de stdlib en la carpeta especificada y recompilarlo.

3. Entonces eliminé los errores asociados con el hecho de que ahora como entendí NULL y 0 (cero) son cosas diferentes. Las funciones anteriores, como iOpen(NULL,PERIOD_W1,1), funcionaban correctamente como iOpen(0,PERIOD_W1,1), es decir, se podía especificar tanto 0 como NULL. Ahora no funciona, pero el compilador no lo jura, sólo se obtiene un error durante el funcionamiento del Asesor Experto.

4. No sé por qué he utilizado NormalizeDouble(pr1,Digits) al establecer un precio de apertura, nivel de stop o beneficio; ahora me he dado cuenta de que esta función siempre devuelve un valor con 4 decimales cuando se prueba el USDJPY con 3 decimales y, por tanto, me da errores al abrir una orden. He sustituido Digits por Digits() y todo funciona.

Eso es todo lo que he afrontado por el momento. Ahora estoy comprobando mi EA por otros posibles problemas.

Por cierto, si no se recompila el código antiguo, ex4 funciona sin errores.

Mi build actual es el 579, todavía tengo el 509 funcionando en el real, el vuelo está bien, pero me da miedo actualizar.

Si alguien ha tenido problemas con la transición, publíquelo aquí, será útil para otros.

 
Compruebe el 583, por favor.
 

Problema similar con la variable Punto. Cambiar a Point()

Todavía no he podido construir el 583. Y mi corredor no lo tiene todavía.

 

Una vez más sobre Dígitos y Punto.

Descubrí que el problema con ellos ocurre cuando se prueba el mismo Asesor Experto en símbolos de diferente capacidad de dígitos. El probador no parece cambiar estas variables. Por ejemplo, primero lo pruebo en Yerovdollar y luego cambio el símbolo de Dólar en el probador y se produce el problema. O viceversa.

Así que tal vez esto es sólo un problema con el probador y esto no va a suceder en la vida real. Pero por si acaso siempre cambio Dígitos por Dígitos () y Punto por Punto ()

El cambio de UPDATE sigue sin ayudar. Sólo el reinicio del terminal ayuda.

 
Gracias, lo comprobaremos y lo arreglaremos el lunes.
 

Oh, pensaba que era mi código el que estaba estropeado...

También en el probador el EA no funciona, si la primera prueba fue en 4 dígitos, entonces los pares de yenes ya no se prueban, no se abren posiciones. Para que la prueba pase también en ellos, tengo que reiniciar el terminal o recompilar el EA.

Construye 584.

No, no pretendo que mi código sea perfecto, pero el mismo código en la compilación 509 funcionó en el probador durante un cambio del símbolo probado sin reiniciar el terminal, y sin recompilar.


P.D.: El problema se ha resuelto llamando a las construcciones de tipo hasta ahora:

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

en lugar de simplemente asignar valores a estas variables, que parecen significar lo mismo:

digits = Digits;
point = Point;
 

Al traducir a cadena para Comentar en el gráfico, sustituyo Dígitos (da 4) por el número 5. Si activo la "depuración", edito algo, luego en "pausa" el gráfico desaparece, y al terminar la depuración aparece un nuevo gráfico (todo verde) con el Asesor Experto, ¡pero sin indicadores! ¿Va a ser así o es temporal?

Lo bueno es que sólo se ha actualizado el de la Demo. El del Real no se ha actualizado todavía. No sé qué hacer, ¡hay puestos vacantes en una pequeña minúscula!

 

La flecha verde señala la primera línea del inicio:

int digits = MarketInfo( Symbol(), MODE_DIGITS); Y en la parte inferior: MQL4\Experts\"EA name" inicio y número de línea No hay errores, pero no compila ¿Qué significa? Me dijeron que no pasaría nada. ¿Podría explicarlo, por favor?

 

InternetOpenUrlA() de wininet.dll ha dejado de funcionar

Muestra 0 (cero) en lugar del texto de la página de Internet.

Aquí está el código 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);

}

 
Debido al cambio a cadenas unicdoe, ahora debe utilizar InternetOpenUrlW
 
Renat:
Debido al cambio a cadenas unicode, ahora es necesario utilizar InternetOpenUrlW

Y ha funcionado de verdad. Gracias.