Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 589

 
admoon:



Al comprobar el indicador paso a paso, he encontrado un rebote en la subrutina detrás del if {} y en el que no hay W. He aquí un código simplificado para aclarar el punto:

//--- parámetros de entrada

input int w=10;

//---

{

int i;

//---

int co=0;

for(i=0;i<=w;i++)if(w==10){co++; Alert(co);}

//--- devuelve el valor de prev_calculado para la siguiente llamada

return(rates_total);

}

Resultado (arlets):

2016.05.30 00:45:14.064 1 (EURUSD,H1) 11

2016.05.30 01:10:35.972 1 (EURUSD,H1) 10

........... etc. a 1.

2016.05.30 00:45:14.064 1 (EURUSD,H1) 1

Regla: Si la expresión entre paréntesis es verdadera, se ejecuta el operador1.

En el código: el operador1 se ejecuta SIEMPRE.

Creo que if() debería funcionar sólo una vez cuando la condición entre corchetes es verdadera. Pero en realidad se produce en cada comprobación, por lo que todas las expresiones en {} se ejecutan en cada paso y mastican el tiempo de la máquina.

Preguntas: ¿POR QUÉ la variable CO creció de 0 a 11 durante el bucle? ¿Por qué se activa la alerta a cada paso?

¿Cuántas veces tengo que decírtelo?

Mira: tienes w igual a 10,
Compruebas si w es 10: "if(w==10){co++; Alert(co);}" ¿Crees que esta expresión es verdadera?
Entonces, ¿a qué viene la pregunta?

 
admoon:



Al comprobar el indicador paso a paso, he encontrado un rebote de disparos en la subrutina detrás de if {} y en la que no hay W. He aquí un código simplificado para aclarar el asunto:

//--- parámetros de entrada

input int w=10;

//---

{

int i;

//---

int co=0;

for(i=0;i<=w;i++)if(w==10){co++; Alert(co);}

//--- devuelve el valor de prev_calculado para la siguiente llamada

return(rates_total);

}

Resultado (arlet):

2016.05.30 00:45:14.064 1 (EURUSD,H1) 11

2016.05.30 01:10:35.972 1 (EURUSD,H1) 10

........... etc. a 1.

2016.05.30 00:45:14.064 1 (EURUSD,H1) 1

Regla: Si la expresión entre paréntesis es verdadera, se ejecuta el operador1.

En el código: el operador1 se ejecuta SIEMPRE.

Creo que if() debería funcionar sólo una vez cuando la condición entre corchetes es verdadera. Pero en realidad ocurre en cada comprobación, por lo que todas las expresiones en {} se ejecutan en cada paso y mastican el tiempo de la máquina.

Preguntas: ¿POR QUÉ la variable CO creció de 0 a 11 durante el bucle? ¿Por qué se activa la alerta a cada paso?

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bichos, errores, preguntas

Andrey Barinov, 2016.05.30 10:38

Aparentemente tienes un error de escritura en el código, y querías escribir así:

int i;
//---
   int co=0;
   for(i=0;i<=w;i++)
     {
      if(i==10)
        {
         co++; 
         Alert(co);
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);

 
¡Hola Señores! Tengo un pequeño problema con la escritura de un EA(( el EA abre órdenes pendientes en su mayoría bien, pero a veces necesito abrir órdenes muy cerca del precio actual, así que ¿cómo prescribir que abriría órdenes pendientes lo más cerca posible?
 
barudkinarseniy:
¡Hola Señores! Tengo un pequeño problema a la hora de escribir un EA(( El EA abre las órdenes pendientes casi siempre bien, pero a veces necesito abrir las órdenes muy cerca del precio actual, así que ¿cómo prescribir que se abran las órdenes pendientes lo más cerca posible?
Creo que lo tengo) Si alguien está interesado, así es como funciona
 double ilow = iLow(Symbol(),TimeFrames_3,1);
 double ihigh = iHigh(Symbol(),TimeFrames_3,1);
 
 double OpenPriceBuy = NormalizeDouble(MathMax(ihigh,Ask + Point*SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL)),Digits);
 double OpenPriceSell = NormalizeDouble(MathMin(ilow,Bid - Point*SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL)),Digits);
 
 int StepST = (int)MathMax(OpenPriceBuy - OpenPriceSell,SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL));
 double lots = LotsByRisk(StepST);
 
Artyom Trishkin:

¿Cuántas veces tengo que decírtelo?

Mira: tienes w igual a 10,
Compruebas si w es igual a 10: "if(w==10){co++; Alert(co);}" ¿Crees que esta expresión es verdadera?
Entonces, ¿a qué viene la pregunta?

Mis disculpas por la pregunta estúpida y gracias por su paciencia y comprensión. Me defraudó mover mecánicamente la sonda if(w==10){ Alert(I,"/",F); a través del programa buscando un error en los pasos. A veces ocurre cuando te topas con un muro de tu propia ignorancia de la razón, pero una vez que te apartas del problema durante un tiempo, éste se resuelve por sí solo. Lo que usted percibe como "chascarrillo" resulta ser en realidad una petición no contabilizada de otra parte del programa. Gracias, Vladimir.

 

Hola, ¿puede ayudarme con las matemáticas, por favor?

Cómo saber cuál será la suerte de la quinta posición, si se conoce la suerte de la primera y que la suerte de cada nueva posición aumenta en progresión aritmética.

La segunda opción es que el lote aumente con la progresión geométrica.

 
mila.com:

Hola, ¿puede ayudarme con las matemáticas, por favor?

Cómo saber cuál será la suerte de la quinta posición, si se conoce la suerte de la primera y que la suerte de cada nueva posición aumenta en progresión aritmética.

La segunda opción es que el lote aumente con la progresión geométrica.

¿Te han expulsado de Google? Lo siento, ¿por qué eres tan cruel? ))

La progresión aritmética se define mediante una fórmula.

laprogresión geométrica viene dada por la fórmula

 

No entiendo, para la primera variante basta con multiplicar el primer lote por 5, si aumenta por el lote inicial

Para la segunda opción: lote* multiplicador de la primera posición*5 ...pero

 
mila.com:

No lo entiendo, en teoría para la primera opción basta con multiplicar el primer lote por 5

Para la segunda opción, el lote de la primera posición * coeficiente * 5 ...pero

No pasa nada, yo también he olvidado las matemáticas desde el colegio )) He sacado un libro de matemáticas y he vuelto a escribir la definición de aritmética.

-------------

Una secuencia de números, cada uno de los cuales, a partir del segundo, se obtiene del anterior añadiendo un número constante d, llamado diferencia de una progresión aritmética.

Si el primer término es a1, entonces el arith. prog. con longitud n tiene la forma

a1, a1+d, a1+2*d, ...., a1 + n*d

El código en MQL es así, he creado un ejemplo sencillo

#define  LEN 5 // задали длину последовательности

int start()
{
    int d = 4;    // это разность, любое значение
    int a[LEN];   // тут храним ариф. посл.
    a[0] = 3;     // любое стартовое значение, задаете сами
    Print(0, "  ", a[0]);

    for (int n = 1; n < 4; n++)
    {
       a[n] = a[0] + (n*d);
       Print(n, "  ", a[n]);
    }
}

2016.05.31 23:08:52.433 ChangeTimeFrame EURUSD.e,M1: 3  15
2016.05.31 23:08:52.433 ChangeTimeFrame EURUSD.e,M1: 2  11
2016.05.31 23:08:52.433 ChangeTimeFrame EURUSD.e,M1: 1  7
2016.05.31 23:08:52.433 ChangeTimeFrame EURUSD.e,M1: 0  3
 
Alexey Volchanskiy:

No pasa nada, yo también he olvidado las matemáticas desde el colegio ))

Voy a dar un paseo, luego escribiré el código del programa de geometría.
Razón de la queja: