Fehler, Irrtümer, Fragen - Seite 8

 
FEDOR_MQL:

Kann ich den Code sehen, wenn es Ihnen nichts ausmacht? Ich habe es auf alle Arten versucht, aber es funktioniert nicht.

Ich weiß nicht, ob es einfacher ist, das Risiko in Prozenten der Wertpapiere zu addieren. Ich möchte den Code als Beispiel verwenden und die Rentabilität meines Handelsroboters zeigen.

Ich habe Ihnen den Code gegeben, der ohne Fehler funktioniert
 
sergey1294:

Jede Fallvariante kann mit einer Ganzzahlkonstante, einer Zeichenkonstante oder einem konstanten Ausdruck gekennzeichnet werden. Ein konstanter Ausdruck darf keine Variablen oder Funktionsaufrufe enthalten. Eineswitch-Anweisung muss vom Typ Integer sein.
 
Valmars:
Jede Fallvariante kann mit einer Ganzzahlkonstante, einer Zeichenkonstante oder einem konstanten Ausdruck gekennzeichnet werden. Ein konstanter Ausdruck darf keine Variablen oder Funktionsaufrufe enthalten. Eine switch-Anweisung muss vom Typ Integer sein.
Diese Frage wurde bereits behandelt.
 
sergey1294:
Ich habe Ihnen einen Code gegeben, der ohne Fehler funktioniert
Du hast Recht, der Rest des Codes hätte weggeworfen werden müssen, anstatt gespeichert zu werden...
 

Ich frage mich, warum eine Konstruktion wie diese nicht funktioniert, sie gibt einen Fehler - '}' - nicht alle Kontrollpfade geben einen Wert zurück

 //+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//--- input parameters

input double   Lots=0.1;
input bool     MM = true;
input double   Risk = 10.0;

double lots;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
  return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(MM) lots = LotSon();      //вызов функции LotSon 
   else lots = Lots;
  }
//+------------------------------------------------------------------+
double LotSon()
{
  double LotMin     = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
  double LotMax     = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
  double LotStep    = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
  double Lot        = AccountInfoDouble(ACCOUNT_FREEMARGIN)/100000.0 * Risk;
  Lot               = MathMin(LotMax,MathMax(LotMin,Lot));
  
  if (Lot < LotMin) Lot = LotMin;
  if (Lot > LotMax) Lot = LotMax;

  if (LotStep == 0.01)return(NormalizeDouble(Lot,2));
  if (LotStep == 0.1) return(NormalizeDouble(Lot,1));
  if (LotStep == 1.0) return(NormalizeDouble(Lot,0));
}
 
sergey1294:
Ich habe Ihnen den Code gegeben, der ohne Fehler funktioniert.
Tut mir leid, Sergej, das habe ich irgendwie übersehen. Ich habe es jetzt gefunden. Vielen Dank an alle, ich hätte nicht gedacht, dass es so lange dauern würde.
 
sergey1294:

Ich frage mich, warum eine Konstruktion wie diese nicht funktioniert, sie gibt einen Fehler - '}' - nicht alle Kontrollpfade geben einen Wert zurück


Was sollte diese Funktion Ihrer Meinung nach zurückgeben? So sehe ich das
return(Lot);
 
Interesting:
Was sollte diese Funktion Ihrer Meinung nach zurückgeben? So wie ich es sehe -

So funktioniert das nicht.


  if (LotStep == 0.01)return(NormalizeDouble(Lot,2));
  if (LotStep == 0.1) return(NormalizeDouble(Lot,1));
  if (LotStep == 1.0) return(NormalizeDouble(Lot,0));

Das funktioniert folgendermaßen.

  if (LotStep == 0.01)Lot=NormalizeDouble(Lot,2);
  if (LotStep == 0.1) Lot=NormalizeDouble(Lot,1);
  if (LotStep == 1.0) Lot=NormalizeDouble(Lot,0);

  return(Lot); 

	          
 
sergey1294:

So funktioniert es nicht

Richtig, und es funktioniert nicht. Das ist jedem selbst überlassen, aber ich persönlich habe immer geglaubt, dass return() am Ende jeder Funktion deklariert werden sollte, und der Compiler unterstützt mich dabei.


PS

Ich persönlich habe in MQL4 damit begonnen, die Variable Result zur Berechnung des Rückgabewerts zu verwenden. Ich sollte anmerken, dass der Aufruf von return() am Ende des Funktionscodes obligatorisch ist und seine Anwesenheit am Anfang/Mitte des Codes manchmal als eine Art Analogon von break wahrgenommen wird (der einzige Unterschied ist, dass break selbst vom Compiler nicht als Befehl zur Rückgabe des Ergebnisses der Funktion wahrgenommen wird).

 

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

double LotSon()
{
  double LotMin     = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
  double LotMax     = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
  double LotStep    = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
  double Lot        = AccountInfoDouble(ACCOUNT_FREEMARGIN)/100000.0 * Risk;
  Lot               = MathMin(LotMax,MathMax(LotMin,Lot));
  
  if (Lot < LotMin) Lot = LotMin;
  if (Lot > LotMax) Lot = LotMax;

  if (MathAbs(LotStep-0.01)<0.001)return(NormalizeDouble(Lot,2));
  if (MathAbs(LotStep-0.1)<0.001) return(NormalizeDouble(Lot,1));
  if (MathAbs(LotStep-1.0)<0.001) return(NormalizeDouble(Lot,0));
  return(-1);
}
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Основы языка / Типы данных / Вещественные типы (double, float) - Документация по MQL5