Fehler, Irrtümer, Fragen - Seite 9

 
DC2008:

Es ist nicht korrekt, die == Bedingung für Variablen vom Typ double zu verwenden. Es wird empfohlen, wie folgt zu vergleichen:


Ich kann hinzufügen, dass wir, wenn auch mit einiger Verspätung, noch einen Artikel zu diesem Thema geschrieben haben - Features of working with numbers of type double in MQL4. Alles, was dort erwähnt wird, ist nach wie vor für jede Programmiersprache relevant, wenn es um Operationen mit reellen Zahlen (double und float in MQL5) geht.
Особенности работы с числами типа double в MQL4 - Статьи по MQL4
  • www.mql5.com
Особенности работы с числами типа double в MQL4 - Статьи по MQL4: примеры использования экспертов, тестирования и оптимизации
 
DC2008:

Es ist nicht korrekt, die == Bedingung für Variablen vom Typ double zu verwenden. Es wird empfohlen, wie folgt zu vergleichen:


Das ist durchaus vernünftig und vor allem ein sinnvoller Ansatz. Aber mir scheint, dass zumindest die erste Zeile so hätte aussehen sollen:

if (MathAbs(LotStep-0.01)<0.01)return(NormalizeDouble(Lot,2));
 

Ich erhalte von Zeit zu Zeit diese Meldungen im Protokoll

2010.06.15 14:48:09 MemoryException 4915200 Bytes nicht verfügbar

Ich weiß nicht, was ich tun soll?

 
Prival:

Die folgenden Meldungen werden regelmäßig im Protokoll angezeigt

2010.06.15 14:48:09 MemoryException 4915200 Bytes nicht verfügbar

Ich weiß nicht, was ich tun soll?

Nicht genug RAM. Überprüfen Sie die Größe der dynamischen Arrays, höchstwahrscheinlich ein Versuch, mehr Speicher als verfügbar zuzuweisen.
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
DC2008:

Es ist nicht korrekt, die == Bedingung für Variablen vom Typ double zu verwenden. Es wird empfohlen, wie folgt zu vergleichen:


Das ist nicht der Sinn der Frage. Wenn ich es richtig verstanden habe, sollte man den Return-Operator immer an das Ende einer Benutzerfunktion setzen
 
joo:
Nicht genug Arbeitsspeicher. Überprüfen Sie die Größe der dynamischen Arrays, höchstwahrscheinlich ein Versuch, mehr Speicher zuzuweisen als verfügbar ist.
Nein, das ist es nicht. Es ist wahrscheinlich etwas mit den Servern. Es wird wahrscheinlich gearbeitet. Es ist eine Lücke in den Daten entstanden. Die Verbindung zum Server wird oft unterbrochen. die Historie wird nicht heruntergeladen. das hat wahrscheinlich den Fehler verursacht.
 
sergey1294:
Wenn ich die Frage richtig verstanden habe, muss der Operator Return immer am Ende der Benutzerfunktion stehen

Ich denke, die Antwort über == war im Wesentlichen. Es sollte wirklich ein return(...) irgendwo in einer Funktion vom Typ double sein. Nicht unbedingt am Ende. Die Verwendung des == Operators in if() return(); kann zu einer falschen Ausgabe führen, wenn Sie den LotStep Typ 0.1000000000000000001 haben. In diesem Fall funktioniert keine der Rückgaben und die Funktion gibt nichts zurück. Obwohl in Ihrem Fall die Rückkehr wahrscheinlich nicht wie NormalizeDouble in ihm. In Ihrer Version, die funktioniert, fixieren Sie das Ende auf return(NormilizeDouble(lot,2)) und sehen Sie, ob es funktioniert. Ich bin selbst neugierig darauf.

 
gpwr:

Ich denke, die Antwort über == war im Wesentlichen. Es sollte wirklich ein return(...) irgendwo in einer Funktion vom Typ double sein. Nicht unbedingt am Ende. Die Verwendung des == Operators in if() return(); kann zu einer falschen Ausgabe führen, wenn Sie den LotStep Typ 0.1000000000000000001 haben. In diesem Fall funktioniert keine der Rückgaben und die Funktion gibt nichts zurück. Obwohl in Ihrem Fall die Rückkehr wahrscheinlich nicht wie NormalizeDouble in ihm. In Ihrer Version, die funktioniert, fixieren Sie das Ende auf return(NormilizeDouble(lot,2)) und sehen Sie, ob es funktioniert. Ich bin selbst neugierig darauf.

Am Ende muss return(...) stehen, aber es kann sein, dass es nie dort ankommt (wenn eine der If-Bedingungen funktioniert)...
 
Interesting:
Am Ende muss return(...) stehen, aber es kann sein, dass es nicht dazu kommt (wenn eine der If-Bedingungen funktioniert)...
Das war es, was mich interessiert hat, in 4 war es nicht notwendig, es am Ende zu schreiben.
 

double volMin     =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
double LotSize    =SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
long   Leverage   =AccountInfoInteger(ACCOUNT_LEVERAGE);
double FreeMargin =AccountInfoDouble(ACCOUNT_FREEMARGIN);  
double LotRqdMgn  =LotSize/Leverage;
double vol=NormalizeDouble(MathFloor(FreeMargin*MaxRisk/LotRqdMgn/Step)*Step,2);
if(vol<volMin) vol=volMin;
if(vol*LotRqdMgn>FreeMargin) vol=0.0;
Print(LotRqdMgn," ",FreeMargin);
return(vol);
Renat
:

Der Fehler liegt darin, dass Sie bei Ihren Berechnungen die Margin-Währung vergessen haben: Saldo = 100 USD und Margin-Anforderung = 100 EUR (119 USD).

Deshalb kann die Operation nicht durchgeführt werden - alles ist korrekt.

Ich möchte noch einmal auf meine Frage zur korrekten Berechnung der Gewinnspanne zurückkommen. Wie Renat in meinen Berechnungen festgestellt hat, berücksichtigt LotRqdMgn (für den Kauf von 1 Lot erforderliche Marge) nicht den Preis der Währung. Ich erinnere mich, diese Tabelle gesehen zu haben

Kennung

Beschreibung

Formel

SYMBOL_CALC_MODE_FOREX

Forex-Modus - Berechnung von Gewinn und Marge für Forex

Marge: Lose*Vertragsgröße/Verwendung

Gewinn: (Schlusskurs-Eröffnungskurs)*Kontraktgröße*Lose

SYMBOL_CALC_MODE_FUTURES

Futures-Modus - Berechnung von Marge und Gewinn für Futures

Marge: Lose *InitialMargin*Percentage/100

Gewinn: (Schlusskurs-Eröffnungskurs)*TickPreis/TickSize*Lots

SYMBOL_CALC_MODE_CFD

CFD-Modus - Berechnung von Marge und Gewinn für CFD

Marge: Lose *Vertragsgröße*Marktpreis*Prozentsatz/100

Gewinn: (Schlusskurs-Eröffnungskurs)*Kontraktgröße*Lose

SYMBOL_CALC_MODE_CFDINDEX

CFD-Indexmodus - Berechnung von Marge und Gewinn für CFD nach Indizes

Marge: (Lots*ContractSize*MarketPrice)*TickPrice/TickSize

Gewinn: (Schlusskurs-Eröffnungskurs)*Kontraktgröße*Lose

SYMBOL_CALC_MODE_CFDLEVERAGE

CFD Leverage Modus - Berechnung der Marge und des Gewinns für den CFD Handel mit Hebelwirkung

Marge: (Lots*Kontraktgröße*Marktpreis*Prozentsatz)/Leverage

Gewinn: (Schlusskurs-Eröffnungskurs)*Kontraktgröße*Lose

Es stellt sich also heraus, dass die Tabelle einen Fehler enthält: Statt Lots*Contract_Size/Leveragemuss es Price*Lots*Contract_Size/Leverage heißen.