Discusión sobre el artículo "Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte XXI): Clases comerciales - El objeto comercial multiplataforma básico" - página 2

 
Artyom Trishkin:


Gracias, es un trabajo importante y útil....

 
Vladimir Pastushak:

Gracias, es un trabajo importante y útil....

De nada

 
Hola Artyom - ¿hay una manera más fácil de obtener el número de ticket después de colocar una orden o abrir una posición? Esto parece demasiado complicado :-(
long CMySetup::PlaceOrder()
{
   bool order_ok;
   if (m_direction == POSITION_TYPE_BUY) {
      order_ok = m_engine.PlaceBuyLimit(m_lot_size, m_symbol, m_entry, m_hard_stop, m_ratio_target, m_magic, m_comment, m_expiry);
   }
   else {
      order_ok = m_engine.PlaceSellLimit(m_lot_size, m_symbol, m_entry, m_hard_stop, m_ratio_target, m_magic, m_comment, m_expiry);
   }

   if (order_ok) {
      CArrayObj* list = m_engine.GetListHistoryOrders();
      if (list != NULL) {
         list.Sort(SORT_BY_ORDER_TIME_OPEN);
         COrder* order = list.At(list.Total() - 1);
         if (order != NULL) {
            m_ticket = order.Ticket();
         }
      }
   }
   return m_ticket;
}
 
Dima Diall :
Hola Artyom - ¿hay una manera más fácil de obtener el número de ticket después de colocar una orden o abrir una posición? Esto parece demasiado complicado :-(

Los asesores de pruebas muestran todos los datos de la última orden colocada o posición abierta. Esto significa que la librería conoce estos datos. Implementa la funcionalidad de eventos, y la biblioteca informa de todos los eventos establecidos. En consecuencia, es necesario controlar estos eventos y obtener el objeto de la última orden o posición, y de él tomar una entrada (y todos los demás parámetros de la orden o posición). Todavía no es posible dar ningún ejemplo. Pero volveré pronto y podré ayudar.
Puedes ver por ti mismo donde los asesores de prueba toman datos de eventos y los imprimen en el log. En consecuencia, puedes acceder al mismo punto desde tu programa y tomar datos de estos eventos.

В тестовых советниках же показываются все данные последнего выставленного ордера илии открытой позиции. Это означает, что библиотека знает эти данные. В ней реализован событийный функционал, и о всех установленных событиях библиотека сообщает. Соответственно, вам нужно контролировать эти события и получать объект последнего ордера или позиции, а из него брать тикет (и все остальные параметры ордера или позициии). Сейчас пока нет возможности привести какой-либо пример. Но в скором времени вернусь и смогу помочь.
Можете самостоятельно поглядеть откуда тестовые советники берут данные о событиях и распечатывают их в журнал. Соответственно, можете из своей программы получить доступ к той же точке и брать данные от этих событий.

 
Artyom Trishkin:

Los asesores de pruebas muestran todos los datos de la última orden colocada o posición abierta. Esto significa que la biblioteca conoce estos datos. Implementa la funcionalidad de eventos, y la biblioteca informa de todos los eventos establecidos. En consecuencia, es necesario controlar estos eventos y obtener el objeto de la última orden o posición, y de él tomar una entrada (y todos los demás parámetros de la orden o posición). Todavía no es posible dar ningún ejemplo. Pero volveré pronto y podré ayudar.
Puedes ver por ti mismo donde los asesores de prueba toman datos de eventos y los imprimen en el log. En consecuencia, puedes acceder al mismo punto desde tu programa y tomar datos de estos eventos.

Sí, lo entiendo -- estoy echando un vistazo más de cerca y preguntándome si tengo garantizado que mi manejador de eventos sea llamado inmediatamente y, si se han solicitado múltiples órdenes/posiciones, qué tipo de análisis necesito llevar a cabo para asegurarme de que hago coincidir correctamente los eventos con cada solicitud... todo esto sólo para averiguar el número de ticket que para, por ejemplo, las órdenes pendientes, la librería recibe en 'm_result' dentro de CTradeObj::SetOrder()

#ifdef __MQL5__
   return(!this.m_async_mode ? ::OrderSend(this.m_request,this.m_result) : ::OrderSendAsync(this.m_request,this.m_result));
#else 
   ::ResetLastError();
   int ticket=::OrderSend(this.m_request.symbol,
                          this.m_request.type,
                          this.m_request.volume,
                          this.m_request.price,
                          (int)this.m_request.deviation,
                          this.m_request.sl,
                          this.m_request.tp,
                          this.m_request.comment,
                          (int)this.m_request.magic,
                          this.m_request.expiration,
                          clrNONE);
// ...
   if(ticket!=WRONG_VALUE)
     {
      this.m_result.order=ticket;
      this.m_result.price=(::OrderSelect(ticket,SELECT_BY_TICKET) ? ::OrderOpenPrice() : this.m_request.price);
      this.m_result.volume=(::OrderSelect(ticket,SELECT_BY_TICKET) ? ::OrderLots() : this.m_request.volume);
      return true;
     }
// ... 
#endif

Por eso creo que sería más útil que el número de ticket (o -1 si no tiene éxito) se devolviera desde CEngine::PlaceBuyLimit() y toda esta familia de métodos, porque cuando colocas una orden o abres una posición, lo más frecuente es que quieras registrar inmediatamente el número de ticket para poder consultarlo más tarde... Tal vez incluso podría devolver un puntero COrder* o NULL si no tiene éxito. En mi humilde opinión, forzar al usuario de DoEasy a implementar el manejo de eventos para esto hace que la librería parezca innecesariamente complicada.

Probablemente hay una buena razón para tu enfoque, así que no estoy seguro de si estás de acuerdo; si no, estaría muy interesado en entender el razonamiento detrás de tu decisión de diseño ;-)

 
Dima Diall :

Sí, lo entiendo -- estoy echando un vistazo más de cerca y preguntándome si tengo garantizado que mi manejador de eventos sea llamado inmediatamente y, si se han solicitado múltiples órdenes/posiciones, qué tipo de análisis necesito llevar a cabo para asegurarme de que hago coincidir correctamente los eventos con cada solicitud... todo esto sólo para averiguar el número de ticket que para, por ejemplo, las órdenes pendientes la librería recibe en 'm_result' dentro de CTradeObj::SetOrder()

Por eso creo que sería más útil que el número de ticket (o -1 si no tiene éxito) se devolviera desde CEngine::PlaceBuyLimit() y toda esta familia de métodos, porque cuando colocas una orden o abres una posición, lo más frecuente es que quieras registrar inmediatamente el número de ticket para poder consultarlo más tarde... Quizás incluso podría devolver un puntero COrder* o NULL si no tiene éxito. En mi humilde opinión, forzar al usuario de DoEasy a implementar el manejo de eventos para esto hace que la librería parezca innecesariamente complicada.

Probablemente hay una buena razón para tu enfoque, así que no estoy seguro de si estás de acuerdo; si no, estaría muy interesado en entender el razonamiento detrás de tu decisión de diseño ;-)

Todo es muy sencillo. En MQL5, el éxito de enviar una orden comercial al servidor no garantiza su ejecución. El éxito del envío es una comprobación de mijo para la corrección de los parámetros en una orden de comercio. La ejecución de la orden recae en la bolsa. Sólo podemos utilizar el hecho de un cambio en el entorno de negociación, y después de detectar su cambio, seguir adelante. Es por esta razón que no uso los datos recibidos en la respuesta del servidor.

Всё очень просто. В MQL5 успешность отсылки торгового приказа на сервер не гарантирует его исполнения. Успешность отсылки - это просо проверка на корректность параметров в торговом приказе. Исполнение приказа лежит на стороне биржи. Мы можем лишь использовать факт изменения торгового окружения, и после обнаружения его изменения уже двигаться дальше. Именно по этой причине я не использую данные, полученные в ответе сервера.

 
Artyom Trishkin:

Todo es muy sencillo. En MQL5, el éxito del envío de una orden comercial al servidor no garantiza su ejecución. El éxito del envío es una comprobación de mijo para la corrección de los parámetros en una orden de comercio. La ejecución de la orden recae en la bolsa. Sólo podemos utilizar el hecho de un cambio en el entorno de negociación, y después de detectar su cambio, seguir adelante. Por esta razón no utilizo los datos recibidos en la respuesta del servidor.

OK, estoy tratando de implementar este enfoque en mi marco EA para que sea más fácil de manejar usando su TestDoEasyPart39.mq5 como guía, pero estoy teniendo algunos problemas con los eventos perdidos -- todavía investigando / depuración (todo en modo tester por ahora) ... Apreciaría otros ejemplos de código de cómo hacer esto usted mismo en otros EAs, si usted puede compartir algunos.

Todavía estoy usando la versión de la biblioteca de la Parte 39, ¿es esta la mejor versión a utilizar por el momento o recomienda actualizar a una versión más reciente?

 
Dima Diall :

OK, estoy tratando de implementar este enfoque en mi marco EA para que sea más fácil de manejar usando su TestDoEasyPart39.mq5 como guía, pero estoy teniendo algunos problemas con los eventos perdidos - todavía investigando / depuración (todo en modo tester por ahora) ... Te agradecería otros ejemplos de código de cómo haces esto tú mismo en otros EAs, si puedes compartir algunos.

Todavía estoy usando la versión de la biblioteca de la Parte 39, ¿es esta la mejor versión a utilizar por el momento o recomienda actualizar a una versión más reciente?

Hasta ahora, todas las versiones posteriores están dedicadas a la creación de indicadores.

Pronto volveré a los asesores. Allí también comprobaré los mensajes de los usuarios de que algunos eventos de trading (que ocurren simultáneamente) se pierden.
Y entonces puedo mostrar cómo utilizar el modelo de eventos de la biblioteca.

Пока все последующие версии посвящены созданию индикаторов.

Скоро опять вернусь к советникам. Там и проверю сообщения пользователей о том, что некоторые торговые события (происходящие одновременно) теряются.
И там же смогу тогда показать как использовать событийную модель библиотеки.

 
Artyom Trishkin:

Hasta ahora, todas las versiones posteriores se han dedicado a la creación de indicadores.

Pronto volveré a los asesores. Allí también voy a comprobar los mensajes de usuario que algunos eventos de negociación (que ocurren simultáneamente) se pierden.
Y entonces puedo mostrar cómo utilizar el modelo de eventos de la biblioteca.

¿Cuándo esperas empezar a trabajar de nuevo en las características de los asesores expertos? Dependiendo de tu respuesta puede que tenga que optar por escribir mi propia clase/métodos multiplataforma para la colocación simplificada de órdenes, apertura de posiciones, etc... al menos para mi proyecto actual.

Al gestionar eventos de negociación como TRADE_EVENT_PENDING_ORDER_PLASED o TRADE_EVENT_POSITION_OPENED, ¿cómo puedo asegurarme de que un evento determinado corresponde a una solicitud de negociación concreta que envié anteriormente? Actualmente sólo tengo una orden/posición por símbolo, por lo que es fácil comprobar que el símbolo del evento coincide con mi solicitud... Sin embargo, más adelante mi EA debería ser capaz de abrir múltiples órdenes/posiciones en el mismo símbolo (utilizando un único número mágico), esperemos que no sea necesario comparar precio de entrada, SL, TP, etc... Yo estaba pensando tal vez utilizar diferentes números mágicos, o que la función que los paquetes de grupo # 1 y # 2 en el número mágico.

Estoy un poco confundido y no muy seguro de cuál es el mejor enfoque para que coincida con los eventos comerciales a las solicitudes - ¿puede usted por favor me ayude con esto por ahora? Si puedo asociar de forma fiable una solicitud comercial con su número de ticket, creo que podré seguir utilizando DoEasy para este proyecto.

Library for easy and quick development of MetaTrader programs (part XXVI): Working with pending trading requests - first implementation (opening positions)
Library for easy and quick development of MetaTrader programs (part XXVI): Working with pending trading requests - first implementation (opening positions)
  • www.mql5.com
I have already mentioned the concept of a pending request in a number of previous articles. In this article, we are going to figure out what it is and why we need it, as well as start implementing pending requests. When receiving and handling a trade server error, we sometimes need to wait and repeat the request. In the simplest case, waiting...
 
Dima Diall :

¿Cuándo esperas empezar a trabajar de nuevo en características para asesores expertos? Dependiendo de su respuesta puede que tenga que optar por escribir mi propia clase multiplataforma / métodos para simplificar la colocación de órdenes, la apertura de posiciones, etc ... al menos para mi proyecto actual.

Al gestionar eventos de negociación como TRADE_EVENT_PENDING_ORDER_PLASED o TRADE_EVENT_POSITION_OPENED, ¿cómo puedo asegurarme de que un evento determinado corresponde a una solicitud de negociación concreta que envié anteriormente? Actualmente sólo tengo una orden/posición por símbolo, por lo que es fácil comprobar que el símbolo del evento coincide con mi solicitud... Sin embargo, más adelante mi EA debería ser capaz de abrir múltiples órdenes/posiciones sobre el mismo símbolo (utilizando un único número mágico), esperemos que no sea necesario comparar precio de entrada, SL, TP, etc... Yo estaba pensando tal vez utilizar diferentes números mágicos, o que la función que los paquetes de grupo # 1 y # 2 en el número mágico.

Estoy un poco confundido y no muy seguro de cuál es el mejor enfoque para que coincida con los eventos comerciales a las solicitudes - ¿puede usted por favor me ayude con esto por ahora? Si puedo asociar de forma fiable una solicitud comercial con su número de ticket, creo que podré seguir utilizando DoEasy para este proyecto.

Si necesita comparar una solicitud de operación y una posición, entonces la forma más fácil es establecer el identificador de posición (no mágico). Cada solicitud tiene su propio identificador. La magia del asesor se puede dejar una para todas las posiciones. Entonces por el identificador (está escrito en la magia de una posición u orden y nunca se perderá), puede comparar con precisión la solicitud y la posición/orden en cualquier momento.