[ARCHIV!] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen - 4. - Seite 267

 
yosuf:
Danke, dort auf dem Link gibt es eine Software-Lösung für das Problem, und ich weiß nicht, was zu tun ist. Womit hat das zu tun und wie kann ich dieses Problem lösen? Warum funktionierte der EA einen Monat lang einwandfrei, und jetzt tritt eine Störung auf? Wenn der Fehler im Code liegt? Es stellt sich heraus, dass dieser Thread nicht für Neulinge geeignet ist, wenn er mich mit Antworten auf Fragen belastet. Ich bin frustriert.

Ich habe so etwas in meinem EA gleich nach dem Start geschrieben:

//--- Section A: start - checking.
   if (!IsExpertEnabled())
      {Comment("Expert is NOT working. Check the reason."); return(0);}
   if (!IsConnected())
      {Comment("No connection!"); return(0);}
   if (IsTradeContextBusy())
      {Comment("Trade flow is busy. Wait..."); Sleep(5*1000); return(0);}
   if (AccountFreeMargin()<1000*Lot_super)
      {Comment("No money to trade. Free Margin = ",AccountFreeMargin()); Sleep(20*1000); return(0);}
//--- Section A: end - checking.

Probieren Sie es aus, vielleicht ist etwas davon auch für Sie nützlich.

 
drknn:


1. ok. Int start() wurde deklariert. Ich habe immer null zurückgegeben. Ich habe auch die Befehle return(-1) und sogar return(-2) im Code gesehen. Wie wählt man diesen Code richtig aus?

2. Daher stellt sich natürlich die Frage, ob es möglich ist, start() von EA/Indikator/Skript nicht vom Typ int(), sondern von einem beliebigen anderen Typ zu deklarieren und was dann an das Terminal zurückzugeben ist. Mit anderen Worten: Was macht das Terminal mit dem von return() zurückgegebenen Wert?

1. Wie entscheiden Sie, was eine normale Funktion zurückgeben sollte?

2. Sie können jeden Typ haben, genau wie eine normale Funktion. Das Terminal macht nichts mit den zurückgegebenen Werten. Er ignoriert sie.

Besondere Funktionen

 
Zhunko:

1) Wie entscheiden Sie, was eine normale Funktion ist?

2. Sie können jeden Typ haben, genau wie eine normale Funktion. Das Terminal macht nichts mit den zurückgegebenen Werten. Er ignoriert sie.


1. Um zu entscheiden, was eine gewöhnliche Funktion zurückgeben soll, muss ich wissen, warum der Hauptcode einen solchen Wert benötigt. Wenn ich zum Beispiel eine Entscheidung treffen möchte, einen Kaufauftrag zu eröffnen, wenn ein Signal vorliegt, schreibe ich eine Funktion, die die Anzahl der bereits eröffneten Kaufaufträge zurückgibt. Je nachdem, wie viele es sind, trifft der Code eine Entscheidung, die der im Code enthaltenen Logik folgt. Ich weiß nicht, welche Logik in den Rückgabecode eingebettet ist. Heute habe ich mir einen Artikel über die Erstellung einer Semaphore angesehen und bin auf einen Returncode (-2) gestoßen. Überrascht, hier eine Frage zu stellen. Das ist alles. ( https://www.mql5.com/ru/articles/1412 - Artikel hier).

2. Das Terminal ignoriert die zurückgegebenen Werte. Ist das so? Wenn ja, dann stellt sich wiederum die berechtigte Frage, warum der Entwickler bei der Erstellung eines EA/Indikators/Skripts in eine Vorlage genau int einträgt, denn es wäre sinnvoller, dort void einzutragen - dann muss das Terminal nichts ignorieren - wir würden 1 Takt an Prozessorzeit gewinnen? Vielleicht gibt es eine Logik in WHAT, um von int init(), int deinit() und int start() Funktionen zurückzukehren? Ich glaube, Roche hat das schon einmal irgendwo erklärt - er erinnerte sich an eine Beschreibung, wann man Null und wann man (-1) zurückgeben muss. Genau nach dieser Erklärung habe ich gesucht. Schade, dass ich es nicht finden konnte...

P.S.

Der Autor des Artikels verwendet return(-2) für seine eigenen Zwecke. Tatsache ist jedoch, dass die Funktion start() manchmal mit einem Code endet, der einen anderen Wert als Null zurückgibt. Und es ist nicht nur eine Person, die das tut. Genau diese Logik wollen wir verstehen.

 

Sieht im Text so aus.

Vordefinierte Funktionen können Parameter haben. Wenn diese Funktionen jedoch vom Client-Terminal aufgerufen werden, werden keine externen Parameter übergeben, sondern die Standardwerte verwendet.

Hier geht es um die Parameter, die in die Funktion eingehen, nicht um die Parameter, die von ihr zurückgegeben werden.

 
vielen Dank für Ihre Antwort!
drknn:
Dies ist ein Auftragszähler. Nun, es könnte zum Beispiel der Fall sein, dass Sie im Code wissen wollen, ob es auf dem Markt Kaufaufträge für ein bestimmtes Währungspaar und mit einer bestimmten magischen Zahl gibt, zum Beispiel. Wenn dies der Fall ist, kann z.B. kein weiterer Kaufauftrag eröffnet werden. Der Auftragszähler wird also benötigt, um eine Entscheidung zu treffen.
 
paladin80:

Ich habe dies in meinem EA gleich nach dem Start geschrieben:

Probieren Sie es aus, vielleicht finden Sie etwas davon nützlich.

Danke, ich habe meinen Fehler gefunden. Als mein EA aus dem im Artikel (obiger Link) genannten Grund stecken geblieben ist, habe ich ihn geschlossen und neu gestartet, aber vergessen, den Ordermaster von 123 auf 124 zu ändern, und zwei unterschiedlich ausgerichtete EAs bekamen die gleichen Mags und begannen zu konkurrieren, um zu sehen, wer schneller Orders eröffnet. Wenn die erste Bestellung zuerst geöffnet wurde, war dies nicht dasselbe wie z. B. Verkaufen oder umgekehrt. Sobald ich die Magie des zweiten aktualisierten EAs geändert hatte, funktionierten beide normal. Sollte der Fehler erneut auftreten, werde ich Ihren Rat befolgen. Vielen Dank für die Antworten.
 

wie diese Zeilen zu verstehen sind:

Volumen der Rückgabeaufträge

if(Käufe>0) return(Käufe);

sonst return(-sells);

} ?

 

Schreiben Sie ein Drehbuch:

int start(){
  Print("Попытка ретурна 136");
  return(136);
}

wirf es auf die Karte und beobachte das Protokoll:

2012.07.20 12:04:11 111 NZDUSD,M15: removed
2012.07.20 12:04:11 111 NZDUSD,M15: uninit reason 0
2012.07.20 12:04:11 111 NZDUSD,M15: Попытка ретурна 136
2012.07.20 12:04:11 111 NZDUSD,M15: loaded successfully

(hier ist 111 der Name des Skripts). Wir sehen die Zeile "uninit reason 0" - offenbar hat das Terminal auf die Null gewartet!

Versuchen Sie dasselbe mit (-1) :

int start(){
  Print("Попытка ретурна -1");
  return(-1);
}

Das Ergebnis ist das gleiche:

2012.07.20 12:08:19 111 NZDUSD,M15: entfernt
2012.07.20 12:08:19 111 NZDUSD,M15: uninit Grund 0
2012.07.20 12:08:19 111 NZDUSD,M15:Versuchter Rückläufer -1

2012.07.20 12:08:19 111 NZDUSD,M15: erfolgreich geladen

Dem Terminal scheint es egal zu sein, ob eine Null zurückgegeben wird oder nicht.

P.S.

Im Allgemeinen stieß ich im Internet auf diese Antwort:

return 0 - das Programm hat seine Arbeit ohne Fehler beendet
Return 1 - oder eine höhere Zahl, hat das Programm seine Arbeit mit einem Fehler beendet und gibt den Fehlercode zur weiteren Bearbeitung zurück.

In jedem Betriebssystem gibt ein Programm immer einen Fehlercode zurück.

Das einzige Problem ist, dass unser Return den Code nicht an das Betriebssystem, sondern an das Terminal zurückgibt. Dies lässt die Frage offen.

 
drknn:

Schreiben Sie ein Drehbuch:

wirf es auf die Karte und beobachte das Protokoll:

(hier ist 111 der Name des Skripts). Wir sehen die Zeile "uninit reason 0" - offenbar hat das Terminal auf die Null gewartet!

Versuchen Sie dasselbe mit (-1) :

Das Ergebnis ist das gleiche:

Offenbar ist es dem Terminal egal, ob eine Null zurückgegeben wird oder nicht.


uninit reason ist der Grundcode für die Beendigung des Expert Advisors

https://docs.mql4.com/ru/constants/uninit

 
Sie sind etwas verwirrt, UNINIT REASON hat nichts mit der Rendite im Vergleich zu Standardfunktionen zu tun. Schreiben Sie einen EA und rufen Sie "init" von "start" aus mit verschiedenen Rückgabeergebnissen auf und sehen Sie nach. Eigentlichhttps://docs.mql4.com/ru/basis/functions/special der Arzt sagt alles perfekt. Lesen Sie ihn einfach noch einmal sorgfältig durch.