Fehler, Irrtümer, Fragen - Seite 7

 
FEDOR_MQL:

Und in diesem Stadium der Entwicklung: Parameter, Funktionsaufrufe und die Funktion selbst sollten Kompilierzeitfehler anzeigen oder nicht. Wenn ja, warum? Ich habe Fehler.

Ja, aus irgendeinem Grund werden tatsächlich Fehler angezeigt, auch wenn es keine geben sollte. Ich bitte die Entwickler, dies zu beachten. Ich habe es so geändert, es gibt keine Fehler, aber wenn ich switch switch benutze, wird immer noch ein Fehler angezeigt.

 //+------------------------------------------------------------------+
#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;
  // Вариант первый
  /*
  switch(LotStep)
  {
   case 0.01: Lot=NormalizeDouble(Lot,2);break;
   case 0.1 : Lot=NormalizeDouble(Lot,1);break;
   case 1.0 : Lot=NormalizeDouble(Lot,0);break;
  }
  */
  // Вариант второй
  if (LotStep == 0.01)Lot=NormalizeDouble(Lot,2);
  if (LotStep == 0.1) Lot=NormalizeDouble(Lot,1);
  if (LotStep == 1.0) Lot=NormalizeDouble(Lot,0);
  // Вариант третий
  // if (LotStep == 0.01)     Lot=NormalizeDouble(Lot,2);
  // else if (LotStep == 0.1) Lot=NormalizeDouble(Lot,1);
  // else if (LotStep == 1.0) Lot=NormalizeDouble(Lot,0);
 return(Lot); 
}
 
sergey1294:

Ja, in der Tat, aus irgendeinem Grund Fehler, obwohl es keine geben sollte. Ich bitte die Entwickler, dies zu beachten, ich habe es so gemacht, keine Fehler, aber wenn ich den Schalter benutze, gibt es immer noch Fehler.

  switch(LotStep)
  {
   case 0.01: Lot=NormalizeDouble(Lot,2);break;
   case 0.1 : Lot=NormalizeDouble(Lot,1);break;
   case 1.0 : Lot=NormalizeDouble(Lot,0);break;
  }

Sie müssen Lose als int senden, d.h. 0,01 = 1000 und 0,10 = 10000...

 
Interesting:

Die Lots sollten hier als int gesendet werden, d.h. 0.01 = 1000 und 0.10 = 10000...

Ihnen zufolge stellt sich heraus, dass die Funktion
SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
gibt 1000 statt 0,01 zurück
 
sergey1294:
Sie meinen also, dass die Funktion
einen Wert von 1.000 anstelle von 0,01 zurück.

Nein, ich meinte, dass der Fehler verschwindet, wenn der Code wie folgt aussieht:

  switch(StepSize)
  {
   case 1000:   Lot=NormalizeDouble(Lot,2);break;
   case 10000:  Lot=NormalizeDouble(Lot,1);break;
   case 100000: Lot=NormalizeDouble(Lot,0);break;
  }
 
Ich habe gerade festgestellt, dass in
switch
keine Zahlen mit doppelter Genauigkeit verwenden können, kann diese Option in diesem Fall nicht verwendet werden.
 
sergey1294:
Ich habe gerade festgestellt, dass in
keine doppeltgenauen Zahlen verwenden kann, kann diese Option in diesem Fall nicht verwendet werden.
Das ist möglich, wenn Sie vorher Lots in int umwandeln. Wie ich bereits sagte...
 
bleibt die Frage, warum ein solches Muster nicht verwendet werden kann
  if (LotStep == 0.01)return(NormalizeDouble(Lot,2));
  if (LotStep == 0.1) return(NormalizeDouble(Lot,1));
  if (LotStep == 1.0) return(NormalizeDouble(Lot,0));
 
Interesting:
Sie können es tun, wenn Sie Lots in int umwandeln. Was ich oben sagte...

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 danke Ihnen!

 
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 eine andere einfache Variante gibt, einfach das Risiko in Prozenten der Einlage zum EA hinzuzufügen. Ich danke Ihnen!

Es kommt darauf an, was Sie als Ergebnis benötigen. Hier habe ich zum Beispiel eine Reihe von interessanten Funktionen zur Berechnung von Risiken angegeben


Und damit dieser Code funktioniert, müssen Sie nur die Menge mit 100000 multiplizieren und sie als Parameter (Variable vom Typ int) an switch(StepSize) übergeben.


PS

Und um ehrlich zu sein, verstehe ich den Sinn all dieser Varianten nicht ganz? Ich meine, im Zusammenhang mit dieser Funktion ist eine der letzten.... ausreichend.

 
Interesting:

Es hängt davon ab, was Sie im Endergebnis erhalten möchten, hier habe ich zum Beispiel einige interessante Funktionen zum Risiko angegeben


Damit dieser Code funktioniert, müssen Sie nur lot mit 100000 multiplizieren und den Wert als Parameter an switch(StepSize) übergeben (Variable vom Typ int).

Ihr Artikel ist genau das, was ich glaube, dass ich brauche. Danke