Mise à jour de MQL4 et de l'ancien code (partage des expériences de résolution de problèmes)

 

Je pense que ce sujet peut être utile à la lumière de la mise à jour.

L'autre jour, j'ai bêtement décidé de mettre à jour le terminal et j'ai testé mes Expert Advisors sur celui-ci, mais je ne les ai pas mis à jour sur le compte réel.

J'ai des erreurs. Je ne veux pas dire que les développeurs sont à blâmer, c'est aussi ma faute. Cependant, je voudrais révéler quelques détails où j'ai rencontré des problèmes :

1. Caractères illisibles dans les noms de variables : C'est simple, le compilateur a montré le symbole $ comme étant invalide. Il l'a réparé rapidement et facilement. Il n'y avait plus d'erreurs au stade de la compilation.

Après cela, j'ai dû trouver les défauts de l'Expert Advisor, dont le compilateur ne s'est pas plaint.

2. Lors du lancement du test, j'ai obtenu des jurons indiquant que la bibliothèque stdlib.ex4 était introuvable. La solution était de trouver le code source de stdlib dans le dossier spécifié et de le recompiler.

3. J'ai ensuite éliminé les bogues liés au fait que j'ai maintenant compris que NULL et 0 (zéro) sont des choses différentes. Des fonctions antérieures comme iOpen(NULL,PERIOD_W1,1) fonctionnaient correctement comme iOpen(0,PERIOD_W1,1), c'est-à-dire que l'on pouvait spécifier à la fois 0 et NULL. Il ne fonctionne pas maintenant, mais le compilateur ne jure pas par lui, vous obtenez juste une erreur pendant le fonctionnement de l'Expert Advisor.

4. Je ne sais pas pourquoi j'ai utilisé NormalizeDouble(pr1,Digits) lors de la définition d'un prix d'ouverture, d'un niveau de stop ou d'un profit. Maintenant, j'ai remarqué que cette fonction renvoie toujours une valeur avec 4 décimales alors que je teste l'USDJPY avec 3 décimales et donc j'obtiens des erreurs lors de l'ouverture d'un ordre. J'ai remplacé Digits par Digits() et tout fonctionne.

C'est tout ce à quoi j'ai été confronté pour le moment. Je vérifie maintenant mon EA pour d'éventuels autres problèmes.

D'ailleurs, si on ne recompile pas l'ancien code, ex4 fonctionnera sans erreur.

Mon build actuel est 579, j'ai toujours 509 qui tourne sur le réel, le vol est ok, mais j'ai peur de mettre à jour.

Si quelqu'un a rencontré des problèmes avec la transition - postez ici, cela sera utile aux autres.

 
Vérifiez le 583, s'il vous plaît.
 

Problème similaire avec la variable Point. Passage à Point()

Je n'ai pas encore eu l'occasion de construire un 583. Et mon courtier ne l'a pas encore.

 

Encore une fois, il s'agit de chiffres et de points.

J'ai découvert que le problème se produit lorsqu'on teste le même conseiller expert sur des symboles ayant une capacité numérique différente. Le testeur ne semble pas modifier ces variables. Par exemple, je le teste d'abord sur Yerovdollar, puis je change le symbole du dollar dans le testeur et le problème se produit. Ou vice versa.

Peut-être s'agit-il simplement d'un problème avec le testeur et cela ne se produira pas dans la vie réelle. Mais au cas où, je change toujours les chiffres en chiffres () et les points en points ().

Le changement d'UPDATE n'aide toujours pas. Seul le redémarrage du terminal est utile.

 
Merci, nous allons le vérifier et le réparer lundi.
 

Oh, je pensais que c'était mon code qui était en désordre...

Aussi dans le testeur l'EA ne fonctionne pas, si le premier test était sur 4 chiffres, alors les paires de yens ne sont plus testées, aucune position ne s'ouvre. Pour que le test passe aussi sur eux, je dois redémarrer le terminal ou recompiler l'EA.

Construire 584.

Non, je ne prétends pas que mon code est parfait, mais le même code dans la build 509 a fonctionné dans le testeur lors d'un changement du symbole testé sans redémarrer le terminal, et sans recompilation.


P.S. : Le problème a été résolu en appelant les constructions de type jusqu'à présent :

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

au lieu de simplement attribuer des valeurs à ces variables, qui semblent signifier la même chose :

digits = Digits;
point = Point;
 

Lors de la traduction en chaîne pour le commentaire sur le graphique, je remplace les chiffres ( donne 4) par le nombre 5. Si j'active le "débogage", que je modifie quelque chose, puis que je fais une "pause", le graphique disparaît, et à la fin du débogage, un nouveau graphique apparaît (tout vert) avec le conseiller expert, mais sans indicateurs ! Est-ce que ça va rester comme ça ou est-ce que c'est temporaire ?

Heureusement que seul celui de la Démo a été mis à jour. Celui de Real n'a pas encore été mis à jour. Je ne sais pas quoi faire, il y a des postes ouverts dans un petit minus !

 

La flèche verte pointe vers la première ligne du départ :

int digits = MarketInfo( Symbol(), MODE_DIGITS) ; Et en bas : MQL4\Experts\"Nom de l'EA" début et numéro de ligne Pas d'erreurs, mais il ne compile pas Qu'est-ce que cela signifie ? On m'a dit que rien ne se passerait ! Pouvez-vous m'expliquer ?

 

InternetOpenUrlA() de wininet.dll s'est arrêté de fonctionner

Produit 0 (zéro) à la place du texte de la page Internet.

Voici le code complet.

#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);

}

 
En raison du passage aux chaînes de caractères uniques, vous devez désormais utiliser InternetOpenUrlW
 
Renat:
En raison du passage aux chaînes de caractères uniques, il est désormais nécessaire d'utiliser InternetOpenUrlW

Cela a marché en effet ! Merci !