Procesamiento de OnTradeTransaction - página 8

 
fxsaber:

Vea este vídeo a partir del 01:35 y el 03:35.


¿Por qué necesito tus cosas caseras? Me sorprendes. Con esos conocimientos de programación no se puede entender el manejador OnTradeTransaction

 
Alexey Viktorov:

¿Por qué necesito tus cosas caseras? Me sorprendes. Con esos conocimientos de programación no puedes entender el manejador OnTradeTransaction

Es difícil hablar con alguien que ni siquiera puede imaginar la tarea.

 
Alexey Viktorov:

Entonces, ¿no hay posiciones, o están entre comillas?

Es una situación bastante normal cuando en términos de compensación - no hay posición (es decir, la posición total == 0,0).

Y desde el punto de vista de dos EAs - cada uno tiene su propia posición abierta.

Puede haber más de un Asesor Experto en un mismo símbolo. Además, algunas operaciones pueden hacerse a mano.

 
JRandomTrader:

Es una situación bastante normal cuando en términos de compensación - no hay posición (es decir, la posición total == 0,0).

Y desde el punto de vista de dos asesores, cada uno tiene su propia posición abierta.

Puede haber más de un Asesor Experto en un mismo símbolo. Además, algunas operaciones pueden hacerse a mano.

La mujer cogió el dinero de la mesita de noche y se compró un televisor. El marido cogió el televisor, lo vendió y puso el dinero en la mesita de noche. En términos de red, no hay televisión. Y según tu lógica, la esposa tiene el televisor y el dinero en la mesita de noche. Entonces deciden si comprar otro televisor o gastar todo el dinero obtenido en bebidas.

¿O es que cada uno de ellos tiene un televisor? Al fin y al cabo, cada uno de ellos lo ha tenido en sus manos. Exagerando.


Si un asesor abrió una posición y el otro la cerró, se fue... Olvídate de ellos... No hay posición.

 
Alexey Viktorov:

La esposa tomó el dinero de la mesita de noche y compró un televisor. El marido cogió el televisor, lo vendió y puso el dinero en la mesita de noche. En términos de red, no hay televisión. Y según tu lógica, la esposa tiene el televisor y el dinero en la mesita de noche. Entonces deciden si comprar otro televisor o gastar todo el dinero obtenido en bebidas.

¿O cada uno de ellos tenía un televisor? Al fin y al cabo, todos ellos han tenido uno en sus manos. Exagero.


Si un asesor abrió una posición y el otro la cerró, se fue... Olvídate de ellos... No hay posición.

No hay posición.

Pero como parte de su lógica, cada EA mantiene una posición diferente. Por ejemplo, uno - "largo plazo" se sentará a la pérdida, mientras que el otro - "scalper" tomará su propia en la contra-tendencia al mismo tiempo.

 
JRandomTrader:

No hay posición.

Pero dentro de los límites de su lógica, cada EA mantiene su propia posición. Por ejemplo, uno - el "largo plazo" esperará a que se produzcan pérdidas, y el otro - el "scalper" irá a por una contra-tendencia.

Aparentemente, usted está tratando de aplicar la lógica de dos estrategias de cobertura a la red. La secuencia más lógica sería la siguiente.

Un scalper en una contra-tendencia cierra una posición y establece una orden limitada al precio TP esperado para su posición imaginaria. Y si este final de carrera funciona, la posición se restablecerá en su totalidad PERO!!! con un billete diferente. Así que no es absolutamente correcto considerarlo como una continuación de esa posición cerrada, y el EA a largo plazo no podrá determinarlo como suyo.

Otra cosa es si el scalper trabajará con un volumen menor. Entonces el billete seguirá siendo el mismo, a pesar de que el precio de apertura cambiará. En general, no intentes simplemente trasladar la estrategia a la red de cobertura, no saldrá nada bueno. La analogía funcionará, pero las acciones deben ser diferentes. Hay que tener en cuenta las particularidades de la red.

 
Alexey Viktorov:

Aparentemente, usted está tratando de aplicar la lógica de dos estrategias de cobertura a la red. Una secuencia más lógica sería la siguiente.

Un scalper en una contra-tendencia cerrará la posición y establecerá una orden límite al precio TP esperado para su posición imaginaria. Y si este final de carrera funciona, la posición se restablecerá en su totalidad PERO!!! con un billete diferente. Así que no es absolutamente correcto considerarlo como una continuación de esa posición cerrada y el EA a largo plazo no podrá determinarlo como suyo.

Otra cosa es que el scalper trabaje con valores más pequeños. Entonces el billete seguirá siendo el mismo, a pesar de que el precio de apertura haya cambiado. En general, no intente trasladar simplemente la estrategia de compensación a la cobertura, no saldrá nada bueno. La analogía funcionará, pero las acciones deben ser diferentes. Hay que tener en cuenta las particularidades de la red.

Este es sólo un ejemplo del scalper y del long riser, puede haber muchos EAs en el símbolo, y pueden tener diferentes lotes.

"El scalper cierra una posición en contratendencia y coloca un interruptor de límite al precio del TP esperado para su posición imaginaria". - Pero el revendedor asume para sí mismo que tiene una "posición imaginaria".

Y el hecho de que la posición total haya cambiado el billete - por lo que el Asesor a largo plazo no lo necesita, ya sabe que tiene su propia posición, que no está relacionada con la posición total.

Como resultado, cada EA funciona independientemente de quién esté trabajando con él en este símbolo, sin saber ni querer saber nada de él.

Y sí, no estoy tratando de transferir las estrategias para la cobertura, ya que empecé con MT5, FORTS y la red de inmediato. Sólo quería que varios robots pudieran operar con el símbolo y que pudieran seguir operando con las manos sin interferir con ellas.

 

JRandomTrader:

Pero para sí mismo, el despilfarrador piensa que tiene una "posición imaginaria".

Eso es lo que digo, hay que construir una lógica diferente para la red. No debería haber posiciones imaginarias . Sólo lo puse así porque no pude encontrar otra palabra para que me entendieras. Si hay un fill, se tiene en cuenta el volumen total de la posición y el nuevo precio de la posición abierta, si hay un cierre parcial se tiene en cuenta lo mismo y el precio y el volumen.

 
Alexey Viktorov:

Eso es lo que digo: hay que construir una lógica diferente para la red. No debe haber posiciones imaginarias . Sólo lo dije porque no encontré otra palabra para que me entendieras. Si se produce un llenado, se tiene en cuenta el volumen total de la posición y el nuevo precio de apertura; si se produce un cierre parcial, ocurre lo mismo y se tiene en cuenta el precio total y el volumen.

Entonces tendremos que establecer alguna interacción entre los robots y tener en cuenta las acciones de los "vecinos", que hoy son los mismos y mañana pueden ser diferentes. Y no está claro qué beneficios traerá esto.

Una posición imaginaria es necesaria desde el punto de vista del algoritmo del robot: si lo ha abierto, debe cerrarlo.

 
JRandomTrader:

Entonces tengo que crear algún tipo de interacción entre los robots y tener en cuenta a los "vecinos" que son uno hoy y quizás otro mañana. Y no está claro qué beneficios traerá esto.

Una posición imaginaria es necesaria desde el punto de vista del algoritmo del robot: si la abrió, debe cerrarla.

Para simplificar las cosas, sí. Estoy de acuerdo.

Entonces el "Gestor de Transportes" no ha articulado del todo el problema y sus acciones.

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

Procesamiento de OnTradeTransaction

Ilya Child, 2019.02.07 20:08

Buenas noches.

Chicos, por favor, ayuden a resolver esto. El problema probablemente no es nuevo, pero no he encontrado ninguna solución inequívoca (ni en la práctica, ni en los foros).

Estoy ejecutando 2 robots diferentes en el terminal en 2 instrumentos diferentes. Las magias son diferentes en todas partes. El robot coloca límites pendientes y el procedimiento OnTradeTransaction me permite detectar una transacción y colocar órdenes stop pendientes utilizando esta transacción.

A continuación se muestra el código de la transacción comercial

case TRADE_TRANSACTION_DEAL_ADD:
        {
         drop_info2("TRADE_TRANSACTION_DEAL_ADD\r\n"+TransactionDescription(trans));
         if((trans.deal_type==DEAL_TYPE_BUY || trans.deal_type==DEAL_TYPE_SELL) && trans.order!=0)
           {
            if(getIsDealOfExpert(trans.deal)) //функция проверки принадлежности сделки к роботу
              {
               drop_info2("Сделка наша");
               analyzeFilledOrder(trans.order,trans.volume); //процедура по выставлению отложенных стоп ордеров
              }
           }
        }
      break;

Este es el código de la función que comprueba si el acuerdo pertenece a un robot

bool getIsDealOfExpert(ulong dealTicket)
     {
      if(HistoryDealSelect(dealTicket) && HistoryDealGetInteger(dealTicket,DEAL_MAGIC)==magic_number && HistoryDealGetString(dealTicket,DEAL_SYMBOL)==symbol)
         return true;
      else
         return false;
     }

Este es el código del procedimiento para las órdenes de stop pendientes

void analyzeFilledOrder(ulong orderTicket,double volume)
  {
   bool isFindOrder=false;
   string fullComment;
   ENUM_ORDER_TYPE orderType;
   if(getIsOrderOfExpert(orderTicket,true)) //Если ордер из сделки уже в истории
     {
      fullComment=HistoryOrderGetString(orderTicket,ORDER_COMMENT);
      orderType=ENUM_ORDER_TYPE(HistoryOrderGetInteger(orderTicket,ORDER_TYPE));
      isFindOrder=true; //локальная переменная, если нашли в истории
     }
   if(!isFindOrder && getIsOrderOfExpert(orderTicket,false)) //Если не нашли ордер в истории и ордер есть не в истории
     {
      fullComment=OrderGetString(ORDER_COMMENT); 
      orderType=ENUM_ORDER_TYPE(OrderGetInteger(ORDER_TYPE));
      isFindOrder=true; //локальная переменная, если нашли не в истории
     }
   if(isFindOrder) //если хоть где-то нашли, то выставляем отложенные стоп ордера
     {
     //выставляем стоп ордера

Este es el código de la función para buscar un pedido en el historial y fuera del historial

bool getIsOrderOfExpert(ulong OrderTicket,bool isHistory)
     {
      bool is_expert=false;
      //если ордер находится в истории
      if(isHistory)
        {
         if(HistoryOrderSelect(OrderTicket) && HistoryOrderGetInteger(OrderTicket,ORDER_MAGIC)==magic_number && HistoryOrderGetString(OrderTicket,ORDER_SYMBOL)==symbol)
            is_expert=true;
        }
      else
        {
         if(OrderSelect(OrderTicket) && OrderGetInteger(ORDER_MAGIC)==magic_number && OrderGetString(ORDER_SYMBOL)==symbol)
            is_expert=true;
        }
      return is_expert;
     }

La información sobre las transacciones entrantes se publicaría en los archivos de registro en el orden en que se reciben en el terminal. Ahora tengo un problema que he enfrentado al operar en una cuenta demo:

A veces las transacciones vienen en el siguiente orden TRADE_TRANSACTION_ORDER_DELETE, luego TRADE_TRANSACTION_DEAL_ADD, luego TRADE_TRANSACTION_HISTORY_ADD. En este caso, las órdenes de stop no suelen colocarse tras la ejecución de una operación. Supongo que esto ocurre porque el pedido ya ha sido eliminado pero aún no se ha añadido al historial. Significa que no podemos encontrar la orden del acuerdo ni en el historial ni en el terminal. Aunque es dudoso, el hecho es que no se coloca ninguna orden de stop porque el robot no la encuentra después de buscar la orden en todas las dimensiones(isFindOrder=false). En todos los casos, el robot detecta la transacción correctamente, pero no llega a colocar las órdenes.Sin embargo, en ocasiones también funciona correctamente y se colocan las órdenes.

He probado diferentes enfoques, nada funciona. Ahora estoy pensando en añadir un intervalo de 1 segundo al principio del procedimiento de colocación de pedidos pendientes. No sé dónde más cavar.

Por favor, comparta sus experiencias e ideas.

¿Qué significan las órdenes de suspensión? ¿Para la posición total o sólo para la parte con la que trabaja este Asesor Experto?
Razón de la queja: