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"
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.
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):

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...
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); }
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.
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; }
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.
Pero event es una variable disponible sólo en OnChartEvent, y no se procesa en el probador.
Quiero hacer algo como esto en OnTick():
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
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:
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:
Vamos quitando las limitaciones por turno.
Conectamos internet, y al intentar abrir una posición, obtenemos:
Permitimos el autotrading en el terminal pulsando el botón Autotrading, y al intentar abrir una posición, obtenemos:
Pulsamos F7, y en los ajustes del asesor permitimos a este que comercie. Si intentamos abrir una posición, obtendremos la posición abierta.
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