Errores, fallos, preguntas - página 8

 
FEDOR_MQL:

¿Puedo ver el código, si no te importa? Lo he intentado de todas las maneras, pero no funciona.

No sé si es más fácil añadir el riesgo en porcentajes de valores. Me gustaría utilizar el código como ejemplo y mostrar la rentabilidad de mi robot de trading.

Te he dado el código que funciona sin errores
 
sergey1294:

Cada variante de caso puede marcarse con una constante entera, una constante de carácter o una expresión constante. Una expresión constante no puede incluir variables ni llamadas a funciones . Una sentencia switch debe ser de tipo entero.
 
Valmars:
Cada variante de caso puede marcarse con una constante entera, una constante de carácter o una expresión constante. Una expresión constante no puede incluir variables ni llamadas a funciones. Una sentenciaswitch debe ser de tipo entero.
Esto ya se ha tratado.
 
sergey1294:
Te he dado un código que funciona sin errores
Tienes razón, el resto del código debería haber sido desechado en lugar de ser guardado...
 

Me pregunto por qué una construcción como esta no funciona, da un error - '}' - no todas las vías de control devuelven un valor

 //+------------------------------------------------------------------+
#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:
Te he dado el código que funciona sin errores.
Lo siento Sergei, de alguna manera se me pasó. Ya lo encontré, muchas gracias a todos, no pensé que tardaría tanto.
 
sergey1294:

Me pregunto por qué una construcción como esta no funciona, da un error - '}' - no todas las vías de control devuelven un valor


¿Qué crees que debería devolver esta función? Tal y como yo lo veo
return(Lot);
 
Interesting:
¿Qué crees que debería devolver esta función? Como yo lo veo...

No funciona así.


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

Así es como funciona.

  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:

No funciona así

Correcto y no funciona. Depende de cada uno, pero personalmente siempre he creído que return() debe declararse al final de cualquier función, y el compilador me apoya en esto.


PS

Personalmente, en MQL4 empecé a utilizar la variable Resultado para calcular el valor de retorno. Debo señalar que llamar a return() al final del código de la función es obligatorio y su presencia al principio/en medio del código a veces se percibe como un análogo de break (la única diferencia es que break en sí mismo no es percibido por el compilador como una orden para devolver el valor del resultado de la función).

 

No es correcto utilizar la condición == para variables de tipo double. Se recomienda comparar así:

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