Discusión sobre el artículo "Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte XXII): Clases comerciales - Clase comercial principal, control de limitaciones"

 

Artículo publicado Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte XXII): Clases comerciales - Clase comercial principal, control de limitaciones:

En el artículo, comenzaremos a crear la clase comercial principal de la biblioteca, equipándola con la primera versión de la funcionalidad para la comprobacion primaria de los permisos de realización de operaciones comerciales. Asimismo, ampliaremos un poco las posibilidades y el contenido de la clase comercial básica.

Para verificar el funcionamiento de los métodos de comprobación de las limitaciones comerciales, deberemos crearlos artificialmente.
Por ejemplo:

  1. desconectamos internet (emulamos una pérdida de conexión con el servidor comercial),
  2. en los ajustes del asesor, le prohibimos comerciar (pulsamos F7 y en la ventana que se abrirá para el ajuste del asesor, en la pestaña "General", quitamos el aspa "Permitir comerciar al asesor"),
  3. prohibimos el autotrading en el terminal (desactivamos el botón "Autotrading")

Y probamos a pulsar el botón de apertura de posición en el panel comercial del asesor. Como resultado, obtenemos la siguiente entrada en el diario:

2019.09.26 15:07:55.582 CTrading::OpenBuy: The request was rejected before being sent to the server due to:
2019.09.26 15:07:55.582 1. There is no permission to conduct trading operations in the terminal (the "AutoTrading" button is disabled)
2019.09.26 15:07:55.582 2. No connection to the trading server
2019.09.26 15:07:55.582 3. EA does not have permission to conduct trading operations (F7 --> Common --> "Allow Automatic Trading")

Vamos quitando las limitaciones por turno.

Conectamos internet, y al intentar abrir una posición, obtenemos:

2019.09.26 15:10:36.766 CTrading::OpenBuy: The request was rejected before being sent to the server due to:
2019.09.26 15:10:36.766 1. There is no permission to conduct trading operations in the terminal (the "AutoTrading" button is disabled)
2019.09.26 15:10:36.766 2. EA does not have permission to conduct trading operations (F7 --> Common --> "Allow Automatic Trading")

Permitimos el autotrading en el terminal pulsando el botón Autotrading, y al intentar abrir una posición, obtenemos:

2019.09.26 15:13:03.424 CTrading::OpenBuy: The request was rejected before being sent to the server due to:
2019.09.26 15:13:03.424 EA does not have permission to conduct trading operations (F7 --> Common --> "Allow Automatic Trading")

Pulsamos F7, y en los ajustes del asesor permitimos a este que comercie. Si intentamos abrir una posición, obtendremos la posición abierta.

2019.09.26 15:14:32.619 - Position is open: 2019.09.26 11:14:32.711 -
2019.09.26 15:14:32.619 EURUSD Opened 0.10 Buy #455179802 [0.10 Market-order Buy #455179802] at price 1.09441, Magic number 123

El resto de las limitaciones se pueden comprobar en el simulador de estrategias o en una cuenta demo, creando una situación en la que se active una de las limitaciones, por ejemplo, la limitación del número máximo de órdenes pendientes en la cuenta.

Autor: Artyom Trishkin

Artyom Trishkin
Artyom Trishkin
  • www.mql5.com
Perfil del trader
 

Artem, necesito obtener las propiedades de una posición en mql4 después de abrirla o activar una orden. Encontré como obtener el índice del evento

ENUM_TRADE_EVENT engine.LastTradeEvent()

y en este punto necesito obtener las propiedades disponibles.

Incluso encontre el enum, pero como obtener... no encuentro nada.

 
Alexey Viktorov:

Artem, necesito obtener las propiedades de una posición en mql4 después de abrirla o activar una orden. He encontrado cómo obtener el índice de eventos

y en este momento necesito obtener las propiedades disponibles.

Incluso encontre el enum, pero como obtener... no encuentro algo.

¿Si el último evento es abrir una posición? ¿Necesitamos obtener la última posición abierta y acceder a todas sus propiedades? ¿Verdad?

Si es así, es fácil (sin comprobar los resultados de obtener la lista y el objeto):


 
Gracias, el resto de las preguntas tontas las haré en privado para no asustar a los transeúntes.))))))
 

Estoy llegando a alguna parte. Gracias, biblioteca muy útil.

Siguiente pregunta (no estúpida): tenemos dos órdenes pendientes. Recibimos un evento en la activación de una de ellas, luego la segunda se activó.... Y no hay ningún cambio del evento. ¿Cómo hacer que el vigilante de vuelta después de recibir el evento? Intentado

last_event = WRONG_VALUE;
después de procesar el evento, pero me sale un sinsentido...
 
Alexey Viktorov:

Estoy llegando a alguna parte. Gracias, biblioteca muy útil.

Siguiente pregunta (no estúpida): tenemos dos órdenes pendientes. Recibimos un evento en la activación de una de ellas, luego la segunda se activó.... Y no hay ningún cambio del evento. ¿Cómo hacer que el vigilante de vuelta después de recibir el evento? He intentado

después de procesar el evento, pero me sale un sinsentido...

No estoy controlando los eventos correctamente. La librería los captura todos, luego el test EA comprueba la diferencia entre el evento pasado y el actual. Y tienes dos eventos idénticos.

En principio, después de enviar un evento, la biblioteca reinicia el propio evento. Trate de recibir el evento de nuevo después de recibirlo - se debe escribir en la variable que no hay ningún evento, entonces el próximo evento debe ser capturado.

Pero hace tiempo que he escrito en mis planes que los eventos de comercio deben hacerse de la misma manera que los eventos de símbolos o cuenta - sólo devuelven una bandera que hay un evento. Y luego en el programa podemos ver cuál es el evento. Todo está ya preparado para esto en el Asesor Experto, sólo para los eventos de comercio hay un tapón en la función OnDoEasyEvent() del Asesor Experto, porque la bandera no se devuelve todavía - no puedo ponerme a ello:

//--- Tratamiento de los eventos comerciales
   else if(idx>TRADE_EVENT_NO_EVENT && idx<TRADE_EVENTS_NEXT_CODE)
     {
      event=EnumToString((ENUM_TRADE_EVENT)ushort(idx));
      int digits=(int)SymbolInfoInteger(sparam,SYMBOL_DIGITS);
     }
     
 
Artyom Trishkin:

Tengo el control de eventos va mal aquí. La librería los captura todos, luego el test EA comprueba la diferencia entre el evento pasado y el actual. Y tiene dos eventos idénticos.

En principio, después de enviar un evento, la biblioteca reinicia el propio evento. Trate de recibir el evento de nuevo después de recibirlo - se debe escribir en la variable que no hay ningún evento, entonces el siguiente evento debe ser capturado.

Pero hace tiempo que he escrito en mis planes que los eventos de comercio deben hacerse de la misma manera que los eventos de símbolos o cuenta - sólo devuelven una bandera que hay un evento. Y luego en el programa podemos ver cuál es el evento. Todo está ya preparado para esto en el Asesor Experto, sólo para los eventos de comercio hay un tapón en la función OnDoEasyEvent() del Asesor Experto, porque la bandera no se devuelve todavía - no puedo ponerme a ello:

Eso es seguro, la mañana es más sabia en la noche.... Si se recibe un evento, en mi caso particular, debemos reaccionar a ella de alguna manera. En concreto, poner otra orden pendiente. Hasta aquí el nuevo evento.

 
No, aún tienes que restablecer el indicador de evento.
 
Artyom Trishkin:

Tengo el control de eventos va mal aquí. La librería los captura todos, luego el test EA comprueba la diferencia entre el evento pasado y el actual. Y tiene dos eventos idénticos.

En principio, después de enviar un evento, la biblioteca reinicia el propio evento. Trate de recibir el evento de nuevo después de recibirlo - se debe escribir en la variable que no hay ningún evento, entonces el siguiente evento debe ser capturado.

Pero hace tiempo que he escrito en mis planes que los eventos de comercio deben hacerse de la misma manera que los eventos de símbolos o cuenta - sólo devuelven una bandera que hay un evento. Y luego en el programa podemos ver cuál es el evento. Todo está ya preparado para esto en el Asesor Experto, sólo para los eventos de comercio hay un tapón en la función OnDoEasyEvent() del Asesor Experto, porque la bandera no se devuelve todavía - no puedo ponerme a ello:

Pero evento es una variable disponible sólo en OnChartEvent, y no se procesa en el probador.

Quiero hacer algo como esto en OnTick():

//--- Si el último evento comercial ha cambiado
 if(engine.LastTradeEvent() != last_event)
  {
   switch(last_event)
    {
     case TRADE_EVENT_PENDING_ORDER_PLASED :
      // llamar a la función correspondiente
     break;
     case TRADE_EVENT_PENDING_ORDER_REMOVED :
      // llamar a la función correspondiente
     break;
     case TRADE_EVENT_PENDING_ORDER_ACTIVATED :
      // llamar a la función correspondiente
     break;
     case TRADE_EVENT_POSITION_OPENED :
      // llamar a la función correspondiente
     break;
     case TRADE_EVENT_POSITION_CLOSED :
      // llamar a la función correspondiente
     break;
     
     default :
      break;
    }
 
Alexey Viktorov:

Pero event es una variable disponible sólo en OnChartEvent, y no se procesa en el probador.

Quiero hacer algo como esto en OnTick():

Así que después de procesar el evento - al final del módulo de comprobación del tipo de evento, ¿qué tienes en la variable last_event? Esta variable se debe restablecer en el Asesor Experto. En lugar de llamar forzosamente al método de reinicio del último evento de la librería - la propia librería lo llama justo después de enviar el evento al gráfico y escribirlo en la lista de eventos.

 
Alexey Viktorov:

Pero event es una variable disponible sólo en OnChartEvent, y no se procesa en el probador.

Quiero hacer algo como esto en OnTick():

Preste atención a la función del EA de prueba OnDoEasyEvent() - maneja todos los eventos de la librería. Y si desea procesar los eventos de comercio con un interruptor, hágalo allí.