Aktualisierter MQL4 und alter Code (Austausch von Problemlösungserfahrungen)

 

Ich denke, dass dieses Thema im Hinblick auf die Aktualisierung nützlich sein könnte.

Neulich habe ich dummerweise beschlossen, das Terminal zu aktualisieren und meine Expert Advisors darauf zu testen, aber ich habe sie nicht auf dem echten Konto aktualisiert.

Ich habe Fehler. Ich will nicht sagen, dass die Entwickler schuld sind, es ist auch meine Schuld. Ich möchte jedoch auf einige Details hinweisen, bei denen ich auf Schwierigkeiten gestoßen bin:

1. Unleserliche Zeichen in Variablennamen: Es ist einfach, weil der Compiler das $-Symbol als ungültig anzeigt. Das Problem wurde schnell und einfach behoben. In der Kompilierungsphase traten keine weiteren Fehler auf.

Danach musste ich die Fehler des Expert Advisors korrigieren, worüber sich der Compiler nicht beschwerte.

2. Beim Starten des Tests wurde ich darauf hingewiesen, dass die Bibliothek stdlib.ex4 nicht gefunden wurde. Die Lösung war, den stdlib-Quellcode im angegebenen Ordner zu finden und ihn neu zu kompilieren.

3. Dann beseitigte ich Fehler im Zusammenhang mit der Tatsache, dass jetzt, wie ich verstanden NULL und 0 (Null) sind verschiedene Dinge. Frühere Funktionen wie iOpen(NULL,PERIOD_W1,1) funktionierten korrekt als iOpen(0,PERIOD_W1,1), d.h. es konnte sowohl 0 als auch NULL angegeben werden. Jetzt funktioniert es nicht mehr, aber der Compiler schimpft nicht darüber, man bekommt nur eine Fehlermeldung während des Expert Advisor-Betriebs.

4. Ich weiß nicht, warum ich NormalizeDouble(pr1,Digits) verwendet habe, wenn ich einen Eröffnungskurs, ein Stop-Level oder einen Gewinn festgelegt habe; jetzt habe ich bemerkt, dass diese Funktion immer einen Wert mit 4 Dezimalstellen zurückgibt, wenn ich USDJPY mit 3 Dezimalstellen teste, und deshalb erhalte ich Fehler, wenn ich eine Order eröffne. Ich habe Digits durch Digits() ersetzt und alles funktioniert.

Das ist alles, womit ich im Moment konfrontiert bin, und ich überprüfe jetzt meinen EA auf mögliche andere Probleme.

Übrigens, wenn Sie den alten Code nicht neu kompilieren, funktioniert ex4 ohne Fehler.

Mein Build ist derzeit 579, ich habe noch 509 auf dem Real, der Flug ist ok, aber ich habe Angst vor einem Upgrade.

Wenn jemand Probleme mit der Umstellung hat - bitte hier posten, das kann für andere nützlich sein.

 
Prüfen Sie bitte auf 583.
 

Ein ähnliches Problem besteht bei der Variablen Punkt. Wechseln zu Point()

Ich bin noch nicht dazu gekommen, den 583 zu bauen. Und mein Broker hat es noch nicht.

 

Noch einmal zu Ziffern und Punkten.

Ich habe herausgefunden, dass das Problem mit ihnen auftritt, wenn ich denselben Expert Advisor auf Symbolen mit unterschiedlicher Ziffernkapazität teste. Das Prüfgerät scheint diese Variablen nicht zu ändern. Ich teste es zum Beispiel zuerst mit Yerovdollar und ändere dann das Symbol für Dollar im Tester und das Problem tritt auf. Oder andersherum.

Vielleicht handelt es sich also nur um ein Problem mit dem Testgerät, das im wirklichen Leben nicht auftreten wird. Aber ich bin nur für den Fall, dass ich immer Ziffern auf Ziffern () und Punkt auf Punkt () ändere.

UPDATE-Änderung hilft immer noch nicht. Nur ein Neustart des Terminals hilft.

 
Danke, wir werden das am Montag überprüfen und beheben.
 

Oh, und ich dachte schon, mein Code wäre völlig durcheinander...

Auch im Tester funktioniert der EA nicht, wenn der erste Test auf 4 Ziffern war, dann werden die Yen-Paare nicht mehr getestet, keine Positionen geöffnet. Damit der Test auch bei ihnen funktioniert, muss ich das Terminal neu starten oder den EA neu kompilieren.

Build 584.

Nein, ich behaupte nicht, dass mein Code perfekt ist, aber der gleiche Code in Build 509 funktionierte im Tester bei einer Änderung des getesteten Symbols ohne Neustart des Terminals und ohne Neukompilierung.


P.S.: Das Problem wurde bisher durch den Aufruf von Typkonstrukten gelöst:

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

anstatt diesen Variablen einfach Werte zuzuweisen, die dasselbe zu bedeuten scheinen:

digits = Digits;
point = Point;
 

Bei der Übersetzung in eine Zeichenfolge für den Kommentar im Diagramm ersetze ich die Ziffern (ergibt 4) durch die Zahl 5. Wenn ich "Debugging" einschalte, etwas bearbeite, dann auf "Pause" schalte, verschwindet das Diagramm, und nach Abschluss des Debugging erscheint ein neues Diagramm (alles grün) mit Expert Advisor, aber ohne Indikatoren! Bleibt das so oder ist das nur vorübergehend?

Gut, dass nur der auf der Demo aktualisiert wurde. Die Seite von Real wurde noch nicht aktualisiert. Ich weiß nicht, was ich tun soll, es gibt offene Stellen in einem kleinen Minus!

 

Der grüne Pfeil zeigt auf die erste Zeile am Anfang:

int digits = MarketInfo( Symbol(), MODE_DIGITS); Und unten: MQL4\Experts\"EA name" start and line number Keine Fehler, aber es kompiliert nicht Was bedeutet das? Mir wurde gesagt, dass nichts passieren würde! Könnten Sie das bitte erklären!

 

InternetOpenUrlA() aus wininet.dll funktioniert nicht mehr

Gibt 0 (Null) anstelle von Internet-Seitentext aus.

Hier ist der vollständige Code.

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

}

 
Aufgrund der Umstellung auf einheitliche Zeichenketten müssen Sie jetzt InternetOpenUrlW verwenden.
 
Renat:
Wegen der Umstellung auf einheitliche Zeichenketten ist es jetzt notwendig, InternetOpenUrlW zu verwenden.

Es hat tatsächlich funktioniert! Ich danke Ihnen!
Grund der Beschwerde: