Errori, bug, domande - pagina 7

 
FEDOR_MQL:

E in questa fase di sviluppo: i parametri, la chiamata di funzione e la funzione stessa dovrebbero mostrare errori di compilazione o meno. Se sì, perché? Ho degli errori.

Sì, in effetti mostra degli errori per qualche motivo, anche se non dovrebbero essercene. Chiedo agli sviluppatori di prestare attenzione a questo. L'ho cambiato in questo modo, non ci sono errori, ma quando uso lo switch switch mostra ancora un errore.

 //+------------------------------------------------------------------+
#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:

Sì, infatti, per qualche motivo gli errori anche se non dovrebbero esserci. Chiedo agli sviluppatori di prestare attenzione a questo, l'ho rifatto così, nessun errore, ma quando si usa lo switch dà ancora errore.

  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;
  }

Devi inviare i lotti come int, cioè 0,01 = 1000 e 0,10 = 10000...

 
Interesting:

I lotti devono essere inviati qui come int, cioè 0,01 = 1000 e 0,10 = 10000...

Secondo voi, risulta che la funzione
SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
restituisce 1000 invece di 0,01
 
sergey1294:
Quindi stai dicendo che la funzione
restituisce un valore di 1.000 invece di 0,01.

No, volevo dire che l'errore andrà via se il codice è così:

  switch(StepSize)
  {
   case 1000:   Lot=NormalizeDouble(Lot,2);break;
   case 10000:  Lot=NormalizeDouble(Lot,1);break;
   case 100000: Lot=NormalizeDouble(Lot,0);break;
  }
 
Solo ora ho notato che in
switch
non può usare numeri a doppia precisione, allora questa opzione non può essere usata in questo caso.
 
sergey1294:
Solo ora ho notato che in
non può usare numeri a doppia precisione, allora questa opzione non può essere usata in questo caso.
È possibile se si convertono i lotti in int in anticipo. Come ho detto sopra...
 
rimane la domanda sul perché un tale disegno non possa essere utilizzato
  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:
Potete farlo se convertite i lotti in int. Quello che ho detto sopra...

Posso vedere il codice, se non ti dispiace? Ho provato in tutti i modi, ma non funziona.

Non so se sia più facile aggiungere il rischio in percentuale dei titoli. Grazie!

 
FEDOR_MQL:

Posso vedere il codice, se non ti dispiace? Ho provato in tutti i modi, ma non funziona.

Non so se esiste un'altra variante semplice, basta aggiungere il rischio in percentuale del deposito all'EA. Grazie!

Dipende da cosa vi serve come risultato. Qui, per esempio, ho dato una serie di funzioni interessanti sul calcolo dei rischi


E per far funzionare questo codice, basta moltiplicare il lotto per 100000 e inserirlo in switch(StepSize) come parametro (variabile di tipo int).


PS

E in generale, per essere onesti, non capisco bene lo scopo di tutte queste varianti? Cioè, nel contesto di questa funzione, uno dei last.... è sufficiente.

 
Interesting:

Dipende da cosa volete ottenere nel risultato finale, qui, per esempio, ho dato alcune funzioni interessanti sul rischio


E per far funzionare questo codice, basta moltiplicare il lotto per 100000 e passarlo a switch(StepSize) come parametro (variabile di tipo int).

Il tuo articolo è quello di cui penso di aver bisogno. Grazie