Errores, fallos, preguntas - página 7

 
FEDOR_MQL:

Y en esta etapa de desarrollo: los parámetros, la llamada a la función y la función en sí deben mostrar errores de compilación o no. Si es así, ¿por qué? Tengo errores.

Sí, efectivamente muestra errores por alguna razón, aunque no debería haber ninguno. Pido a los desarrolladores que presten atención a esto. Lo he cambiado de esta manera, no hay errores, pero cuando uso el interruptor sigue mostrando error.

 //+------------------------------------------------------------------+
#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í, efectivamente, por algunos errores aunque no debería haber ninguno. Pido a los desarrolladores que presten atención a esto, lo volví a hacer así, sin errores, pero al usar switch sigue dando error.

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

Hay que enviar los lotes como int, es decir, 0,01 = 1000 y 0,10 = 10000...

 
Interesting:

Los lotes deben enviarse aquí como int, es decir, 0,01 = 1000 y 0,10 = 10000...

Según usted, resulta que la función
SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
devuelve 1000 en lugar de 0,01
 
sergey1294:
Así que estás diciendo que la función
devuelve un valor de 1.000 en lugar de 0,01.

No, me refería a que el error desaparecerá si el código es así:

  switch(StepSize)
  {
   case 1000:   Lot=NormalizeDouble(Lot,2);break;
   case 10000:  Lot=NormalizeDouble(Lot,1);break;
   case 100000: Lot=NormalizeDouble(Lot,0);break;
  }
 
Acabo de notar que en
switch
no puede utilizar números de doble precisión, entonces esta opción no puede ser utilizada en este caso.
 
sergey1294:
Acabo de notar que en
no puede utilizar números de doble precisión, entonces esta opción no se puede utilizar en este caso.
Puedes hacerlo si conviertes los lotes a int de antemano. Como dije arriba...
 
la pregunta sigue siendo por qué no se puede utilizar un diseño de este tipo
  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:
Puedes hacerlo si conviertes los lotes en int. Lo que dije arriba...

¿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 del depósito. Gracias.

 
FEDOR_MQL:

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

No sé si hay alguna otra variante sencilla, simplemente añadir el riesgo en porcentajes del depósito al EA. Gracias.

Depende de lo que necesites como resultado. Aquí, por ejemplo, di una serie de funciones interesantes sobre el cálculo de riesgos


Y para que este código funcione, sólo hay que multiplicar el lote por 100000 e introducirlo en switch(StepSize) como parámetro (variable de tipo int).


PS

Y en general, para ser sincero, no entiendo muy bien el propósito de todas estas variantes... Es decir, en el contexto de esta función, uno de los últimos.... es suficiente.

 
Interesting:

Depende de lo que quieras obtener en el resultado final, aquí, por ejemplo, di algunas funciones interesantes sobre el riesgo


Y para que este código funcione, basta con multiplicar lote por 100000 y pasarlo a switch(StepSize) como parámetro (variable de tipo int).

Su artículo es lo que creo que necesito. Gracias