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

 
Imminence:

Hola, tengo un problema de principiante...

No consigo que el sistema compare el valor de cierre de la última barra con los máximos y mínimos de un periodo determinado, por ejemplo

los últimos 20 compases. ¿Qué estoy haciendo mal?


Lo he comprobado con Alert y por alguna razón desconocida el probador muestra el valor máximo del cálculo del último tick, pero da este valor

Es el mismo número de veces que los ticks, por lo que la orden no se abre.


La segunda cuestión es cómo hacer que mi EA espere a que se abra la siguiente barra (período de 30m). En la prueba de puntos de control todo está bien, pero si uso ticks,

entonces el EA se abre en la misma barra justo después de haber cerrado en el stop loss...


Además, ¿cómo puedo cerrar una operación independientemente de un tick o no? Por ejemplo, para un periodo de 30m quiero cerrar la orden 5 segundos antes del final de la barra (29.55, 59.55)

Basado en todos los datos en ese momento. En esta etapa el problema es que si no se produce un tick en 5 segundos, por lo tanto no

(En teoría esto es una mierda, pero en la realidad el siguiente tick puede aparecer en unos pocos candelabros por alguna razón.

puede estar en algunas velas por alguna razón.


Gracias de antemano.

1. No he visto nada sobre las últimas 20 barras en el código.

2. Cómo determinar el primer tick de una nueva barra

3. ¿Cómo puedo cerrar una orden sin comprobar si ha sido un tick o no?

Tenemos que evitar trabajar con OnTick y trabajar con OnTimer. Establecer el temporizador con un intervalo de 1 segundo y comprobar el tiempo en él. El temporizador no depende de los ticks.

/// Определяет начало нового бара
bool NewBar()
{
    static datetime lastbar = 0;
    datetime curbar = iTime(Symbol(), PERIOD_M30, 0);
    if(lastbar!=curbar)
    {
        lastbar=curbar;
        return (true);
    }
    return(false);
}
 
Leanid Aladzyeu:

o_oops no sabía que el terminal también pincha donde está el error, la primera vez que doy un error crítico.

Lo escupe.

Por supuesto que escupirá, accedes al 3er elemento de un array con dimensión 2 - mas[2]++

void Oher(int Mag,string Symb, int &mas[2])
..............
...........

case 1:mas[1]++; mas [2]++;break;// 1 продажа
 

Alexey Volchanskiy:
Так у тебя в комменте стоит управляющий символ "\n " - это символ перевода строки. Если его убрать, многострочия не будет.

Es una broma. Ahora añade un comentario al final de la línea... y el texto se desplaza hacia la derecha. ;-)

 

Buenas noches. Tratando de escribir un simple EA en el cruce de tenkan y kinjun. Aquí está el código:

void OnTick()

void OnTick()

{

TradeSignal_20();

}


int SeñalDeComercio_20()

{

int sig=0;


if(h_ich==INVALID_HANDLE)

{

h_ich=iIchimoku(Symbol(),Period(),IKHtenkansen,IKHkijunsen,IKHsenkouspanb);

return(0);

}

si no

{

if (CopyBuffer(h_ich,0,0,3,ich1_buffer)<2) return(0); // TENKANSEN_LINE

if (CopyBuffer(h_ich,1,0,3,ich2_buffer)<2) return(0); // KIJUNSEN_LINE

if (!ArraySetAsSeries(ich1_buffer,true)) return(0);

if (!ArraySetAsSeries(ich2_buffer,true)) return(0);

}

//--- comprobar la condición y establecer el valor de sig

if(ich1_buffer[1]>ich2_buffer[1]) sig=1;

else if(ich1_buffer[1]<ich2_buffer[1]) sig=-1;

Si no, sig=0;

if (ich1_buffer[1]>ich2_buffer[1])

if (ich1_buffer[2]<ich2_buffer[2])

Alert(Symbol()+": compra");

if (ich1_buffer[1]<ich2_buffer[1])

if (ich1_buffer[2]>ich2_buffer[2])

Alerta(Símbolo()+": venta");

//--- devolver la señal de comercio

retorno (sig);

}

//+------------------------------------------------------------------+

¿Cómo puedo hacer que la alerta se llame sólo una vez y no constantemente?

 
Alexey Volchanskiy:

1. No he visto nada sobre las últimas 20 barras en el código, da detalles.

2. Cómo determinar el primer tick de una nueva barra

3. ¿Cómo se puede cerrar una operación, independientemente de que se haya marcado o no?

Tienes que evitar trabajar con OnTick y trabajar con OnTimer, establecer el temporizador con un intervalo de 1 segundo y comprobar el tiempo en él. El temporizador no depende de la llegada de ticks.

Aquí, ¿cómo comparo el precio de cierre con el máximo de las últimas 20 barras? Y si el último precio es igual o mayor que el precio máximo de las últimas 20 barras, entonces hay una señal de apertura.
  

double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,0)];


   
  if(Close[0] > SMMA && Close[0] > BB_UP && Close[0] >= HIGHEST)

  {
   TICKET = OrderSend(Symbol(),OP_BUY,LOT,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,NULL,MAGIC,0,Blue);
   if(TICKET < 0)
      {
         Alert("Order Send failed, error # ", GetLastError() );
      } 
  }
 
first_may:

Buenas noches. Tratando de escribir un simple EA en el cruce de tenkan y kinjun. Aquí está el código:

void OnTick()

void OnTick()

{

TradeSignal_20();

¿Cómo puedo hacer que la alerta se llame sólo una vez y no todo el tiempo?
¿No puedes pulsar el botón SRC?
 
Imminence:
Aquí, ¿cómo comparo el precio de cierre con el máximo de las últimas 20 barras? Y si el último precio es igual o mayor que el máximo de las últimas 20 barras, entonces hay una señal de apertura.
Veamos el código
double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,0)];

  if(Close[0] > SMMA && Close[0] > BB_UP && Close[0] >= HIGHEST)

  {
***********

Creo que el problema está en referirse a la barra cero, es decir, a la barra actual. Debemos definir el inicio de una nueva barra, lo di en la respuesta anterior y realizar todas las comparaciones sólo en el primer tick de una nueva barra. Y cambiar la indexación. Tenemos que asegurarnos de que la última barra cerrada no está en iHighest. Y ahora tienes una referencia a la barra actual que se forma en cada tick, los resultados serán de lo más extraños.

double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,2)];

  if(Close[1] > SMMA && Close[1] > BB_UP && Close[1] >= HIGHEST)

  {
***********

 
Alexey Volchanskiy:
Veamos el código de

Creo que el problema está en la referencia a la barra cero, es decir, la barra actual. Tienes que definir el inicio de una nueva barra, lo he citado en la respuesta anterior y sólo en el primer tick de la nueva barra hacer todas las comparaciones. Y cambiar la indexación. Debemos asegurarnos de que la última barra cerrada no está en iHighest. Y ahora tienes una referencia a la barra actual que se forma en cada tick, los resultados serán de lo más extraños.

Gracias, parece que ha servido de algo :) aunque juraría que hice exactamente lo mismo y no funcionó...

Me aconsejó OnTimer() pero por alguna razón no me coopera. Estudié toda la ayuda y no encontré ninguna explicación clara ni ejemplos, así que me quedé perplejo.

Es decir, este código trivial no se ejecuta, aunque esté todo especificado en la referencia... Buscando en Google este programa me encontré con que dicen que OnTimer() no funciona en la prueba

modo. Aunque este momento parece haberse eliminado con mql5. Ayuda para entenderlo :) Gracias.

int OnInit()
  {
//---
  bool  Timer = EventSetTimer(1);
  if(Timer != TRUE)
  Print(GetLastError()); 
//---
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
  EventKillTimer();   
  }
  
void OnTimer()
{
Print("It works");
}  
  
 

Imminence:

Buscando en Google este programa me encontré con que dicen que OnTimer() no funciona en modo de prueba. Se ha solucionado con mql5. Ayúdame a entenderlo). Gracias.

¡Correcto, en MT4 en el probador el temporizador no funciona y no está documentado! Escribí a servicedesk y me dijeron que nunca lo harían. Salí de esto llamando a OnTimer en OnTick. Tengo el temporizador ajustado a un segundo.

// Возвращает true, если работает под тестером
bool IsRunOnTester()
{
    if(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_VISUAL_MODE) || MQLInfoInteger(MQL_OPTIMIZATION))
        return true;
    return false;    
}

MqlDateTime     TimeCurrStruct;

void OnTick()
{
    if(IsRunOnTester())
    {
        static datetime dt1 = 0, dt2 = 0;
        static bool tfirst = true;
        if(tfirst)
        {
            tfirst = false;
            dt1 = dt2 = TimeCurrent();
            return;
        }
    
        dt2 = TimeCurrent();
        for(datetime TimeTesterCurrent = dt1+1; TimeTesterCurrent <= dt2; TimeTesterCurrent++)
        {
            TimeToStruct(TimeTesterCurrent, TimeCurrStruct);
            OnTimer();
        }    
        dt1 = dt2;
    }
}

Así, si en el probador los ticks llegan más de 1 vez/seg, se saltan los que sobran; si son menos frecuentes, se genera la serie con un múltiplo de 1seg. Este tiempo se encuentra en la estructura TimeCurrStruct, y mi clase principal en cualquier modo toma el tiempo sólo de esta estructura. En mi opinión, esta es la única manera de tratar este fallo. Aquí hay una función, he eliminado las cosas innecesarias, sólo la carne ))

void OnTimer()
{
    string msg;
    if(!IsRunOnTester())
    {
        TimeToStruct(TimeCurrent(), TimeCurrStruct);
        SmartDsp.ReceiveTick(TimeCurrStruct);    // основной метод робота, в него передается структура со временем
    }
    else
    {
        SmartDsp.ReceiveTick(TimeCurrStruct);    
    }
}




 
Alexey Volchanskiy:
¿No puedes pulsar el botón SRC?
¿No está claro qué quiere decir con eso?