Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 71

 
Vitalie Postolache:

¿Desde cuándo un punto es un tipo Doble?

Eso es lo que digo, string+int es un error

Pero si lo haces de la manera que escribí arriba, no habrá ningún error.

 
Renat Akhtyamov:

Eso es lo que digo: cadena+int es un error.

Pero si lo haces de la manera que escribí arriba, no habrá ningún error.


¿IntegerToString? No, no me he enterado ;)
 
Vitalie Postolache:

¿IntegerToString? No, no me he enterado ;)
Cualquiera de las dos formas funciona bien, no veo ningún problema
 

Hola a todos

Soy nuevo en la programación, pero estoy tratando de aprender)

Tengo un pequeño problema con el cierre de la orden según las lecturas del indicador

Puedo saber directamente las condiciones de apertura y cierre de una posición por las lecturas del indicador y cerrar la orden en la dirección opuesta sin ningún tipo de paradas y beneficios

if(r > 50 && p > m) //condiciones para la apertura de una orden de compra

{

ticketB = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,",111,0,Green); //abrir orden de compra

}

¿Estoy escribiendo correctamente la condición de cierre de la orden?

if(r < 50 && p < m) --- esta es una condición de Venta y de Cierre

{

OrderClose(ticketB,0.1,Bid,5,Red);

}

e imprime el posible uso de la variable no inicializada 'ticketB' y el valor de retorno de 'OrderClose' debe ser comprobado

¿Podéis decirme dónde lo he escrito mal?



 
funnyrain8:

hola a todos

Soy nuevo en la programación, pero estoy tratando de aprender)

Tengo un pequeño problema con el cierre de la orden según las lecturas del indicador

Puedo saber directamente las condiciones de apertura y cierre de una posición por las lecturas del indicador y cerrar la orden en la dirección opuesta sin ningún tipo de paradas y beneficios

if(r > 50 && p > m) //condiciones para la apertura de una orden de compra

{

ticketB = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,",111,0,Green); //abrir orden de compra

}

¿Estoy escribiendo correctamente la condición de cierre de la orden?

if(r < 50 && p < m) --- esta es una condición de Venta y de Cierre

{

OrderClose(ticketB,0.1,Bid,5,Red);

}

e imprime el posible uso de la variable no inicializada 'ticketB' y el valor de retorno de 'OrderClose' debe ser comprobado

¿Podrían decirme dónde lo he escrito mal?



La variable ticketB no está inicializada, es decir, no se conoce su tipo. En este caso es Int

El segundo error es que tenemos que comprobar el resultado del cierre de la orden para ver si hay errores. Buscar "función de tratamiento de errores" en el foro

 
Renat Akhtyamov:

la variable ticketB no está inicializada, es decir, no se conoce el tipo. En este caso es Int.

El segundo error se refiere a la comprobación del resultado del cierre de la orden en busca de errores. Buscar "función de tratamiento de errores" en el foro

No consigo entender la lógica o estoy aturdido), pero ¿cómo lo hago? Al principio intenté hacerlo con OrderSelect pero daba error)

Necesito información sobre esto.

 
funnyrain8:

¿es GetLastError? no puedo entender la lógica o soy un poco tonto) pero ¿cómo establecerlo? al principio traté de hacer todo con OrderSelect, pero no es lo mismo)

Necesito información sobre esto.

Sí.

Revisa el código base: hay muchos ejemplos de implementación.

 
Hola, soy un vendedor de señales, me gustaría saber cómo se pueden promocionar las señales para que la gente se suscriba a ellas.
 
Vitalie Postolache:


¿Dónde está la lógica? Se establece el lote máximo permitido para la primera orden y luego se aumenta para cada orden posterior. ¿No crees que esto es, por decirlo suavemente, poco sensato?

Además, disminuye el lote de la primera orden en el bucle utilizando algún método totalmente incomprensible, mientras que los lotes de las otras órdenes que se "calcularon" antes permanecen sin cambios, y estos valores no van más allá de los límites de esta función. ¿Y qué hacen entonces?

Por no hablar de que el bucle de incremento no puede ser un número real, tiene que ser un contador, un entero. Pero se establece el valor del lote como un contador y se le resta uno en cada iteración. Esto es un error importante, muy grave.

Aclara primero la lógica en tu mente y luego intenta implementarla en tu código.

Los valores que no se sacan para determinar el lote final después de la multiplicación, debería ser el máximo lote posible a abrir, de hecho, las órdenes con estos lotes podrían no abrirse porque el EA abre las órdenes en un intervalo pequeño, pero la probabilidad está ahí y por eso quiero calcular el máximo lote inicial posible. He escuchado tus consejos y esto es lo que he conseguido. ¿Qué opina de esta función? Creo que me he perdido algo o lo he prescrito mal; el probador se cuelga un poco y obtiene un pequeño lote de salida.
//Функция расчета торгового лота
double GetLots()
{
 double lots = 0.0;
 double L9 = MarketInfo(Symbol(),MODE_MAXLOT);
 double L8 = L9 / Multipler;
 double L7 = L8 / Multipler;
 double L6 = L7 / Multipler;
 double L5 = L6 / Multipler;
 double L4 = L5 / Multipler;
 double L3 = L4 / Multipler;
 double L2 = L3 / Multipler;
 double cl = L2 / Multipler;
 double balance = AccountFreeMarginCheck(Symbol(),OP_BUY,L9);
 
 if(balance <= AccountFreeMargin())
 {
  for(int risk = 100;balance > 0 && risk > 0;risk--)
  {
   if(!IsStopped())
   {
    if(risk >= 1)
    {
     lots = (cl/100)*risk;
    }
    if(risk < 1)
    {
     for(int risk2 = 100;balance > 0 && risk2 >= 1;risk2--)
     {
      lots = (cl/100)*(risk2*0.01);
     }
    }
   }
  }
 }
 double clots = NormalizeDouble(MathMax(lots,MarketInfo(Symbol(),MODE_MINLOT)),2);
 return(clots);
}
 
Arseniy Barudkin:

¿Qué te parece?


Yo diré lo mismo. No se te da bien la lógica. ¿Cuál es el problema para calcular inmediatamente el lote inicial, basándose en los fondos disponibles y el valor del riesgo (creo que se escribió sobre el 3%)? ¿Por qué hay que hacer todo en un solo lugar?

Tome el valor del margen libre, multiplíquelo por el riesgo, divídalo por 100 y el valor del margen para 1 lote - aquí está la fórmula más simple para calcular el lote con un porcentaje determinado del margen libre. Además, hay que tener en cuenta el paso del cambio de lote y evitar que se supere el tamaño de lote mínimo/máximo permitido por las empresas de corretaje:

input double risk = 3; //процент свободной маржи для расчёта лота
double GetLots()
{
  double margin = MarketInfo(Symbol(),MODE_MARGINREQUIRED);
  double lotstep = MarketInfo(Symbol(),MODE_LOTSTEP);
  double rsk = MathMin(100.0,risk);
  double lotmax = MarketInfo(Symbol(), MODE_MAXLOT);
  double lotmin = MarketInfo(Symbol(), MODE_MINLOT);

  double clots = NormalizeDouble(lotstep*MathRound(AccountFreeMargin()*rsk/100/margin/lotstep),2);
  if(clots < lotmin) clots = lotmin;
  if(clots > lotmax) clots = lotmax;

return(clots);
}