Fehler, Irrtümer, Fragen - Seite 101

 
Urain:

So oder so.

if(a==0){Ausdruck} bedeutet, wenn a 0 ist, dann ist es wahr, also führe {Ausdruck} aus.

if(a=0){Ausdruck} ist gleichbedeutend mit if(a){a=0;Ausdruck} wenn a wahr ist, {a=0;Ausdruck}.

Der zweite Satz ist falsch, er sollte wie folgt lauten

if(a=x) { expression } der Variablen a den Wert von x zuweisen, und wenn a danach nicht 0 ist, dann den Ausdruck ausführen

if(a=0) { } nach der Optimierung wird nur noch a=0 sein

 
mql5:

Die zweite Formulierung ist falsch, richtig wäre

if(a=x) { expression } den Wert von x der Variablen a zuweisen, und wenn a danach nicht 0 ist, den Ausdruck ausführen

if(a=0) { } nach der Optimierung wird nur noch a=0 sein

Entschuldigung, das ist richtig, Ausdrücke werden von links nach rechts ausgeführt.

Deshalb beginnen wir mit einem Auftrag und prüfen dann, ob er der Wahrheit entspricht.

 
Renat:

Dies ist in etwa der Fall:

Dieser Code berechnet nicht nur die maximale Lautstärke, sondern passt sie auch genau an die Grenzen der Symboleinstellungen an.

Er berechnet sie, vergisst aber beim Einfügen, warum er sie berechnet:

   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=minvol;

Der Wert der Partie zu diesem Zeitpunkt wird so berechnet, dass die gesamte verfügbare Marge mit einer minimalen Marge verbraucht wird.

Wenn dieser Wert um mindestens einen Volumenschritt erhöht wird, ist nicht genug Geld vorhanden, um eine Position zu eröffnen.

Aber die zweite Zeile des zitierten Codes ERZEUGT den Wert des Loses für den Fall, dass die Bedingung unter if erfüllt ist, und kann ihn um viel mehr als den Wert des Volumenschrittes erhöhen, denn in Wirklichkeit gibt es Volumen min = 0,1 und Volumenschritt = 0,01.

Und in diesem Code unten kann eine Division durch Null auftreten, gegen die es keinen Schutz gibt:

   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);

Wenn SymbolInfoDouble() den Wert 0 zurückgibt, war's das. MQL5-Programme enden bei der Division durch 0, richtig? Sie kann nicht 0 zurückgeben? Die Leute hier beschweren sich darüber, dass Informationsfunktionen sehr oft 0 zurückgeben. Sie können sich nicht auf "es wird nicht 0 zurückgeben" berufen, denn erstens könnte es 0 zurückgeben und zweitens ist die Division durch 0 fatal.

Es gibt einige kleinere Bemerkungen zur "Genauigkeit der Eingabe", aber sie sind wirklich nicht allzu bedeutend, d. h. sie haben keine so schwerwiegenden Folgen, dass man sie ignorieren kann.

Im Vorgriff auf mögliche Argumente, der Code sei "ungefähr", stelle ich fest: Wie viele Benutzer des Produkts sind in der Lage, solche "schlechten Stellen" zu finden und kompetent zu beheben?

Für sie ist dies der "Code der Entwickler". Ein Vorbild, an dem man sich orientieren kann.

 

Warum ist die Schaltfläche "Weiter" nicht aktiv, wenn alle Pflichtfelder ausgefüllt sind?

 
EvgeTrofi:

Warum ist die Schaltfläche "Weiter" nicht aktiv, wenn alle Pflichtfelder ausgefüllt sind?

Sie müssen Ihre Zustimmung zum Erhalt des Newsletters per Post geben.
 
simpleton:

Er rechnet zwar, aber dann vergisst er, wofür er gerechnet hat:

In Erwartung möglicher Argumente, dass der Code "ungefähr" ist, möchte ich darauf hinweisen: Wie viele Benutzer des Produkts können solche "schlechten Stellen" korrekt beheben?

Der Code war ungefähr (aus zwei Teilen kopiert), aber Ihre Anmerkungen sind richtig.

Hier ist die korrigierte Fassung:

double CalculateMaxVolume(string symbol)
  {
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble(symbol,SYMBOL_ASK,price))                return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,symbol,1.0,price,margin)) return(0.0);
   if(margin<=0.0)                                            return(0.0);

   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)/margin,2);
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   if(stepvol>0.0)
     {
      double newlot=stepvol*NormalizeDouble(lot/stepvol,0);
      if(newlot>lot) lot=NormalizeDouble(newlot-stepvol,2);
      else           lot=newlot;
     }

   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=0.0;   // 

   double maxvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol) lot=maxvol;
//--- return trading volume
   return(lot);
  }
 
gumgum:

Und warum session_index++; wenn session_index=1 bereits falsch ist:

Wir können nicht im Voraus wissen, wie viele Sitzungen pro Tool stattfinden werden. Wir fragen also jede Sitzung nach der Nummer ab. Wenn es wahr ist

session_exist=SymbolInfoSessionQuote(symbol,day,session_index,start,finish);

Wir interessieren uns für den Zeitpunkt ihres Beginns und ihres Endes. Wenn wir false erhalten, war's das, dann gibt es keine Sitzung mit dieser Nummer.

 
Rosh:

Wir können nicht im Voraus wissen, wie viele Sitzungen für ein Instrument erforderlich sind. Deshalb fordern wir jede Sitzung nach Nummern an. Wenn es wahr ist

analysieren wir den Zeitpunkt ihres Beginns und ihres Endes. Wenn wir false erhalten, war's das, dann gibt es keine Sitzung mit dieser Nummer.

A...... Warum endet dann am Freitag alles um 24:00 Uhr, in Wirklichkeit aber um 23:00 Uhr?
 
gumgum:
A...... warum endet dann alles am Freitag um 24:00 Uhr und in Wirklichkeit um 23:00 Uhr?
Denn das sagt der Server. Wir werden uns das ansehen, danke.
 
Ich habe gehört, dass Sie jetzt Ihre E-Mail-Adresse in Ihrem Profil ändern können? Im Feld E-Mail können Sie nun Änderungen vornehmen, die jedoch nicht gespeichert werden!
Grund der Beschwerde: