¡Promotores! ¿Acaso pruebas lo que creas? - página 6

 
Mikalas:

¿Podría decirme cómo se controla si un pedido se modifica (sin respuesta del servidor)?

La modificación de una orden desencadena varios eventos y yo controlo todos estos eventos y también controlo el tiempo que la tarea pendiente está en la lista de pendientes.

Tengo un robot de forts que realiza 500-600 operaciones por sesión y hasta ahora no hay pérdida de eventos, es decir, todas las tareas de la lista de espera se ejecutan y no llegan al control del temporizador.

 
Yurich:

Por definición, un modelo de eventos no puede ser completamente fiable; si un evento no se produce, no significa que no haya ocurrido.

Si algunos de los eventos llegan y otros no, entonces se necesitan bloques de código duplicados para garantizar el procesamiento de los resultados de los comandos, que comprobarían el estado comparándolo con el anterior, etc. Entonces la pregunta es, si el código de duplicación funciona de forma absolutamente fiable, ¿por qué utilizar código construido sobre eventos? ¿Por qué utilizar dos códigos en lugar de uno que no esté dirigido por eventos? ¿Para engendrar la redundancia?
 
Yurich:

La modificación de un pedido desencadena varios eventos y yo controlo todos estos eventos y también controlo el tiempo que una tarea de la lista de espera está en la lista de espera.

Mi robot forts realiza 500-600 operaciones por sesión y hasta ahora no ha habido eventos de pérdida, es decir, todas las tareas de la lista de espera se ejecutan y no llegan al control del temporizador.

Eso sí que es más interesante... ¿Así que, después de todo, no ha habido una pérdida de un evento esperado?
 
C-4:
Eso sí que es más interesante... Entonces, ¿nunca ha habido un caso en el que un acontecimiento esperado no haya llegado?
Cuando dije que no había pérdida de eventos, me refería a que las tareas que estaban en lista de espera, esperaban su evento (al menos uno de la cadena de eventos significativos). Tal vez hay pérdidas de eventos que Michael dice, no mantengo un registro de eventos, pero no afectan el funcionamiento general de mi modelo de eventos.
 

a:Michael.

En general, hasta que la situación se resuelva de alguna manera, es más fácil que haga un control adicional:

int dealsCount = 0;
///
/// С заданной периодичностью синхронизируем количество обработанных и поступивших трейдов.
///
void OnTimer(void)
{
   if(dealsCount != HistoryDealsTotal())
   {
      //Пришли новые трейды. их нужно обработать
      for(int i = dealsCount; i < HistoryDealsTotal(); i++)
      {
          ulong ticket = HistoryDealGetTicket(i);
          DealChecking(ticket);
      } 
   }
}

///
/// Поступило новое событие о поступлении трейда.
///
void  OnTradeTransaction(
      const MqlTradeTransaction&    trans,
      const MqlTradeRequest&        request,
      const MqlTradeResult&         result
   )
{
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
     DealChecking(trans.deal);
   ...
}

///
/// Обработчик трейдов.
/// \param ticket - Уникальный идентификатор трейда, который надо обработать.
void DealChecking(int ticket)
{
   
   // Далее идет нужная обработка.
   ...
   //Трейд обработан - увеличиваем количество обработанных трейдов.
   dealsCount++;
}

No hay redundancia en esta implementación porque sólo hay un manejador real del evento "new trade". Pero se llama de dos maneras diferentes: a través del temporizador y a través del evento OnTradeTransaction. Si la nueva operación no ha llamado al evento OnTradeTransaction por alguna razón, se producirá una desincronización del importe total y del importe de las operaciones procesadas. Todas las operaciones no procesadas en este caso seguirán llegando al manejador DealChecking a través del bucle for.

Este esquema puede restringirse para cualquier evento, no sólo para TRADE_TRANSACTION_DEAL_ADD.
 
Mikalas:

...

P/S Y no es necesario "arrancar el texto" y toda la frase empieza así:

Conociendo el tipo de operación, puede decidir analizar el estado actual de las órdenes, posiciones y operaciones en su cuenta de operaciones.

Siempre puedes encontrar más detalles en la Ayuda.

Estoy de acuerdo conYurich en todo lo demás. Probablemente también deberías reconsiderar tu esquema.

 

Queridos colegas

Muchas gracias a todos por vuestras opiniones.

Sólo me corroe un gusano: ¿Para qué sirve entonces la PLATAFORMA?

 

Mikalas:

¿Por qué necesita entonces una PLATAFORMA?

Probablemente era una pregunta retórica :) Si no es así, la respuesta ya se ha dado en este hilo:

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

¡Promotores! ¿Acaso pruebas lo que creas?

C-4, 2013.12.10 12:08

No lo recomiendo. Es mucho más fácil arreglar este fallo junto con MQ que construir una nueva terminal para la plaza por su cuenta. Te empantanarás en un sinfín de correcciones de errores y en escribir "funcionalidad estándar". Hablo por mi propia experiencia. He desarrollado parcialmente uno de estos complejos de fabricación propia basado en Stock# - el resultado es otra "bicicleta" para tareas específicas. Es mejor que te pelees con el servicio de asistencia, será más fácil y barato.
Tampoco me gusta todo lo que hay en el terminal, por ejemplo, la actitud de "último precio". Pero espero que cuando se reúna una masa crítica de corredores de bolsa, MQ empiece a escuchar sus necesidades.
 
ok. ¿cuál es la verdadera alternativa a MT5?
 
Armen:
ok. ¿cuál es la verdadera alternativa a MT5?

Esta es exactamente la pregunta que hay que hacerse antes de crear estos hilos. Antes de la llegada de MT5, para operar en FORTS, tenías que, al menos, escribir tu propio terminal de operaciones. Si no hay soluciones preparadas en esta área, aparte de Quick que es difícilmente aplicable para el comercio algorítmico (los que una vez escribieron un programa de más de 1000 líneas en QPile entenderán de lo que estoy hablando). Existe un conjunto auxiliar de bibliotecas de Stock#, pero no se ha convertido en un terminal de comercio completo "out of the box" (ejecutar y operar). En realidad, un programador de nivel medio o alto tardará hasta 6 meses en crear una plataforma de negociación con Stock#. El programador principiante se verá superado por este producto. También hay terminales como Kofite, TSLab, WealthLab. Pero hay que entender claramente que no son apoyados directamente por los corredores, por lo que tiene que tratar con Quick + su Super Plataforma de Comercio (con todos los problemas asociados de la transferencia de datos a través de DDE). Y si desea trabajar a través del protocolo PlazaII - por 3 000 rublos al mes, el corredor le proporcionará tal oportunidad.

En el segmento burgués, las cosas no son mejores. No todos los corredores estadounidenses ofrecen una plataforma de negociación con la posibilidad de realizar algotrading. No es posible trabajar con todos los corredores estadounidenses desde Rusia. Es bueno que te den una API. Y de nuevo volvemos a escribir nuestra propia bicicleta para esta API. No sólo eso, sino que las plataformas que ofrecen son demasiado diferentes, orientadas a distintos segmentos de mercado. Basta con comparar Wealth-Lab con ThinkOrSwim. No hay normas, ni interfaz unificada.

En general, si su lema es "sólo sueño con la paz" o "comercio para probar el nuevo software y escribir la próxima bicicleta" - entonces usted realmente debe buscar alguna otra plataforma que MetaTrader5.