Errori, bug, domande - pagina 8

 
FEDOR_MQL:

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 del deposito. Vorrei usare il codice come esempio e mostrare la redditività del mio robot di trading.

Ti ho dato il codice che funziona senza errori
 
sergey1294:

Ogni variante di caso può essere contrassegnata da una costante intera, una costante di carattere o un'espressione costante. Un'espressione costante non può includere variabili o chiamate di funzioni . Una dichiarazione di switch deve essere di tipo intero.
 
Valmars:
Ogni variante di caso può essere contrassegnata da una costante intera, una costante di carattere o un'espressione costante. Un'espressione costante non può includere variabili o chiamate di funzioni. Una dichiarazione diswitch deve essere di tipo intero.
Questo è già stato trattato.
 
sergey1294:
Ti ho dato un codice che funziona senza errori
Hai ragione, il resto del codice avrebbe dovuto essere buttato via invece di essere salvato...
 

Mi sto chiedendo perché una costruzione come questa non funziona, dà un errore - '}' - non tutti i percorsi di controllo restituiscono un valore

 //+------------------------------------------------------------------+
#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:
Ti ho dato il codice che funziona senza errori.
Scusa Sergei, in qualche modo mi è sfuggito. L'ho trovato ora, grazie a tutti, non pensavo ci volesse così tanto.
 
sergey1294:

Mi sto chiedendo perché una costruzione come questa non funziona, dà un errore - '}' - non tutti i percorsi di controllo restituiscono un valore


Cosa pensi che questa funzione dovrebbe restituire? Per come la vedo io
return(Lot);
 
Interesting:
Cosa pensi che questa funzione dovrebbe restituire? Per come la vedo io -

Non funziona così.


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

Ecco come funziona.

  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:

Non funziona così

Giusto e non funziona. Dipende da ognuno, ma personalmente ho sempre creduto che return() dovrebbe essere dichiarato alla fine di qualsiasi funzione, e il compilatore mi supporta in questo.


PS

Personalmente, in MQL4 ho iniziato a usare la variabile Result per calcolare il valore di ritorno. Dovrei notare che chiamare return() alla fine del codice della funzione è obbligatorio e la sua presenza all'inizio/al centro del codice sarà talvolta percepita come un analogo di break (l'unica differenza è che break stesso non è percepito dal compilatore come un comando per restituire il valore del risultato della funzione).

 

Non è corretto usare la condizione == per variabili di tipo double. Si raccomanda di confrontare in questo modo:

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