Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1739

 
Artyom Trishkin #:

La primera llamada a CopyRates() inició el intercambio de datos históricos (si no se ejecuta durante una semana, volverá a ocurrir lo mismo, bueno, quizá no una semana, pero sí algún tiempo).
Sólo tiene que comprobar cuántos datos hay en el servidor y comparar la cantidad disponible con el Asesor Experto. Si es menos de lo que se requiere - deje el EA hasta el siguiente tick. En el siguiente tic, comprueba de nuevo. Si no se obtiene la cantidad requerida de historial en una determinada cantidad de intentos - entonces este error debe ser procesado como se requiere.

Gracias por la información.

Si tiene tiempo, por favor, aconséjenos cómo corregirlo:

En el historial se han fijado dos objetivos opuestos hace N velas: Close[N]+50*Point y Close[N]-50*Point.
Entonces hay una condición de que el precio debe alcanzar uno de los objetivos (si (High[i]> Close[N]+50*Point) o (si (Low[i]<Close[N]-50*Point)
Cuando la condición se cumple, la distancia desde Close[N] a High[i] se escribe en el array x[high]=High[i].
Entonces se lanza al azar a cualquiera de los gráficos en cualquier momento.

Y al comprobarlo mediante Print(x[high]), ¡1 de cada diez valores muestran menos de 50! Uno tiene 12, el otro 49. Aunque, está estrictamente establecido+50*Punto. 8-9 son correctos (más de 50) y 1-2 son anormales. No es a través del probador, pero con un gráfico real coloco un Asesor Experto (sin ninguna función de trading), pero con los mencionados funciona con el historial y muestra resultados incorrectos.

Cuanto más grande es el valor, menos se producen estos errores. Pensé que podría ser la propagación lo que interfiere, pero... MT4 no parece tener spread en el historial

 
Artis98 #:

¡Hola Estimados usuarios del foro y programadores experimentados! Necesito ayuda para completar el EA)). Por favor, aconseja cómo añadir 2 cosas al asesor de código:

1. La situación es la siguiente: abro una orden (1ª) con TP y SL y un lote determinado (probablemente 0,01). Si esta orden se cierra en la toma de beneficios - genial, nada cambia. Pero si esta (1ª) orden se cierra en SL, la siguiente orden inmediatamente después (2ª) se abre con un lote 2 veces mayor (0,01*2=0,02). Si esta 2ª orden se cierra en Take Profit, entonces la siguiente orden (3ª orden) se abre con un lote normal, es decir, se necesita un lote 2 veces mayor sólo para la siguiente orden (2ª orden) después de que la anterior (1ª) se haya cerrado en SL. Si la tercera orden se cerrará en SL por segunda vez consecutiva, el lote permanecerá incrementado en 2x hasta que no haya cierre en TP. Espero haber descrito con detalle la lógica de lo que hay que añadir;


2. y lo segundo que tenemos que añadir es el movimiento del SL. ahora lo explicaré con un ejemplo: supongamos que tenemos una orden con parámetros básicos T.p. + 300, S.l. - 500. El precio se mueve en la dirección deseada y pasa a +100 pips del precio de apertura de la orden. Una vez que el precio llega a +100 desde el precio de apertura de la orden, el SL debe pasar de la base -500 a +90. Es decir, cuando el precio llega a +100 pips desde el precio de apertura de la orden, transferimos la orden a Breakeven ajustando S,L a +90 pips. Después de eso, si el precio se mueve más en la dirección deseada y pasa por otros + 50 pips - S.L. se mueve por 50 pips => ahora debería estar en + 140 pips desde el precio de apertura de la orden. Es decir, el S.L. primero se mueve desde su posición base a + 90 pips del precio de apertura de la orden y luego se mueve si pasa por + 50 pips ( - 500 => + 90 => + 140 => + 190 etc.). Y así sucesivamente hasta que el precio llegue a T.P. o cuando la tendencia se invierta y llegue a la S.L.


Espero haber descrito todo en detalle, y realmente espero su ayuda, porque añadiendo estos elementos que faltan, el Asesor Experto estará listo)) Si tiene alguna duda, no dude en preguntar)) A continuación pego una parte del código del Asesor Experto:

Sobre el primer punto: antes de abrir una posición, mira cómo se cerró la anterior. Si tomas el SL, entonces el lote debería ser doble. El lote no debe ser incrementado en la mitad del lote de la posición anterior, sino que se establece en los ajustes o en algún lugar del código. Entonces, antes de abrir, comprobará la condición: si la posición anterior fue cerrada por el SL, entonces abrirá una posición con el lote doble.

En cuanto a la segunda: Hace tiempo publiqué un ejemplo de trailing stop en este hilo. Búscalo. Mejor en mi perfil en los mensajes - lo encontrarás allí más rápido que navegar por más de 100 páginas aquí. A continuación, basándose en el ejemplo encontrado, intentará crear su propia red de arrastre.

 
Artyom Trishkin #:

La primera llamada a CopyRates() inició la paginación de los datos históricos (si no se ejecuta durante una semana, volverá a ocurrir lo mismo, bueno, quizá no una semana, pero sí algún tiempo).
Sólo tiene que comprobar cuántos datos hay en el servidor y comparar la cantidad disponible con el Asesor Experto. Si es menos de lo que se requiere - deje el EA hasta el siguiente tick. En el siguiente tic, comprueba de nuevo. Si no se obtiene la cantidad requerida de intentos, el error se gestiona como es debido.

¿Se puede obtener el número de barras cargadas mediante programación?

Yo mismo me limito a mirar la fecha en el archivo de cotizaciones de cada TF y trato de no sobrepasarla en los cálculos.

Esta tarea puede ser innecesaria en este formulario. Sería más correcto obtener una bandera cuando se cargue la cantidad adecuada de barras, pero puede que nunca se cargue para uno u otro símbolo.

 
Artyom Trishkin #:

Sobre el primer punto: antes de abrir una posición, fíjate en cómo cerró la posición anterior. Si es por SL, entonces el lote debe ser doble. El lote no debe duplicarse a partir del lote de la posición anterior, sino del establecido en los ajustes o en algún lugar del código. Entonces, antes de abrir, comprobará la condición: si la posición anterior fue cerrada por el SL, entonces abrirá una posición con el lote doble.

Creo que ya lo he cambiado en el código:

//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
 double Lots()  // Расчет объема лота
  {
   int n=0;
   double Lotscount;
   double OL=Lot;
   
   
   if(Lot>0) return(LOT());          // "если во внешней переменной "Lot" стоит число больше 0 => будет фиксированный лот без авт. расчёта" 
   Lotscount=AccountFreeMargin()/10000;  // раcчёт лота - свободная маржа/9000 => 100/9000=0.01 лота 
   Lotscount=MathMin(15,MathMax(0.01,Lotscount));
    if(Lotscount<0.1) Lotscount=NormalizeDouble(Lotscount,2);
    else 
     {
       if(Lotscount<1) Lotscount=NormalizeDouble(Lotscount,1);
      else       Lotscount=NormalizeDouble(Lotscount,0);
     }
     
     for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
          if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
            if (OrderProfit()<0) 
             {
               if (n==0) OL=NormalizeDouble(OrderLots()*K_Martin,DigitsLot);
               n++; 
               if (OrderProfit()>0) return(Lotscount);
            }
            else
            {
               if (n==0) {Comment("2");return(Lotscount);}
               else {Comment("3");return(OL);}
            }
         }
      }
   }
      return(Lotscount);
 }
//------------------------------------------------------------------
double LOT()
{
   int n=0;
   double OL=Lot;
   for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
            if (OrderProfit()<0) 
            {
               if (n==0) OL=NormalizeDouble(OrderLots()*K_Martin,DigitsLot);
               n++; 
               if (OrderProfit()>0) return(Lot);}
            }
            else
            {
               if (n==0) {Comment("2");return(Lot);}
               else {Comment("3");return(OL);}
            }
         }
      }
   }
   return(OL);
}

¿O está mal? Además, no sé cómo cambiar dos cosas relacionadas con el lote. La primera es que una orden con un lote duplicado debe abrirse sólo una vez y sólo en una orden (la siguiente a la de S.L.). Y la segunda, que no sé cómo añadir, es hacer que en el caso de dos S.L. seguidas (dos órdenes cerradas seguidas por S.L.) la tercera orden no se abra con un lote aumentado en otros 2 (2*2*2), sino sólo una vez (2*2) como la segunda orden.

 
Artis98 #:

Creo que ya lo he cambiado en el código:

¿O es un error? Además, no sé cómo cambiar dos cosas del lote. La primera es hacer una orden con doble lote abierto sólo una vez y sólo en una orden (la siguiente a la de S.L.). Y la segunda, que no sé cómo añadir, es hacer que en el caso de dos S.L. seguidas (dos órdenes cerradas con S.L. seguidas) la tercera orden no se abra con un lote incrementado en otros 2 (2*2*2), sino sólo una vez (2*2) como la segunda orden.

Usted tiene DOS tipos de órdenes - la orden número 1 - una orden con un lote regular, y la orden número 2 - una orden con un lote mayor. Los lotes se incrementan sólo por el tipo de SL #1.

Guarde el tipo de orden en un "comentario", por ejemplo. O, mejor aún, memorícelo usted mismo. Es una buena costumbre memorizar todo lo relativo a sus órdenes.

 
Maxim Kuznetsov #:

usted tiene DOS tipos de órdenes - la orden número 1 - una orden con un lote regular, y la orden número 2 - una orden con un lote aumentado. Los lotes se incrementan sólo por el tipo de SL #1.

Guarde el tipo de orden en un "comentario", por ejemplo. O, mejor aún, memorícelo usted mismo. Es una buena costumbre recordar todo lo relacionado con sus pedidos.

No necesitamos memorizar nada (sobre todo porque memorizar requiere una reconstrucción posterior). Le basta con saber cómo se cerró la posición anterior. Eso es todo. No hace falta saber ni dos, ni tres, ni cien seguidas o cien no cerradas por stoploss, sino sólo la última posición. Si se cerró por Stop Loss, entonces el siguiente debe cerrarse con doble lote. Pero el lote no debe duplicarse a partir del lote de la posición anterior, sino del conjunto en el lote normal del programa. Entonces, si la posición se cierra sin llegar al Stop Loss, se debe abrir la siguiente posición con el mismo lote. Si la posición se cierra con el Stop Loss, entonces duplica el lote para la siguiente posición. Eso es todo. No necesita saber nada más.

 
Artyom Trishkin #:

No necesita memorizar nada (sobre todo porque la memorización requiere una recuperación posterior). Sólo necesita saber cómo se cerró la posición anterior. Eso es todo. No necesita saber dos, o tres, o cien seguidos o no cerrados por stoploss, sino sólo la posición pasada. Si se cerró por Stop Loss, entonces el siguiente debe cerrarse con doble lote. Pero el lote no debe duplicarse a partir del lote de la posición anterior, sino del conjunto en el lote normal del programa. Entonces, si la posición se cierra sin llegar al Stop Loss, se debe abrir la siguiente posición con el mismo lote. Si la posición se cierra con el Stop Loss, entonces duplica el lote para la siguiente posición. Eso es todo. No necesita saber nada más.

No le digas a la gente lo que tiene que hacer.

Hay que recordar los datos y trabajar con ellos

 
Artyom Trishkin #:

Todo lo que necesita saber es cómo se cerró la posición anterior. Eso es todo. No es necesario saber dos, tres, cien en una fila o no en una fila cerrada en stoploss, sólo la posición pasada. Si la posición se cerró con stoploss, entonces la siguiente debe ser con doble lote. Si la posición se cerró con stoploss, entonces abra la siguiente con doble lote.

Esto es lo que necesito, esa es en realidad la pregunta: ¿cómo escribirlo en el código?

 

Hola!
¿Puede alguien decirme cómo forzar el compilador para que compile para MT4 y no para MT5?

Si el archivo tiene la extensión *.mq4, estoy bien, si tiene la extensión *.mqh, entonces el compilador lo acepta como *.mq5 y se producen errores.

 
Sergey Zhukov #:

Hola!
¿Puede alguien decirme cómo forzar el compilador para que compile para MT4 y no para MT5?

Si el archivo tiene la extensión *.mq4, estoy bien, si tiene la extensión *.mqh, entonces el compilador lo acepta como *.mq5 y se producen errores.

Danos el archivo. Eso es algo nuevo, nunca lo había oído antes.