Bibliotecas: MT4Orders - página 45

 
Andrey Khatimlianskii:

Tienes que pensar en cada frase.

Por desgracia, este es el coste del formato de comunicación.


MT5 siempre muestra las tomas en forma de mercados. Si son mercados o limitadores en realidad depende de las implementaciones de pasarelas de terceros. En este caso, estos mercados se envían como limitadores.

MT5 actúa sólo como base de datos.

 
fxsaber:

MT5 siempre muestra tomadores en forma de mercados. Si son mercados o limitadores en realidad depende de las implementaciones de pasarelas de terceros. En este caso estos mercados se envían como limitadores.

¿Estamos hablando de cómo se muestra la ejecución TP?

Entonces veo de que va el post original)

 
fxsaber :

Estoy desarrollando características de la conversión de indicadores para la autoeducación. Aquí hay tres indicadores más.

Como de costumbre - el código original de MT4 no tocó.

La fuente muestra claramente lo que los autores utilizan StringConcatenate en sus códigos. ¡Esto es simplemente estúpido!

HI...


¿Cómo te fue con la conversión a MT5?

 

Tengo una cuenta de compensación. Abro y cierro una posición en ella por marketplaces. Al cerrar una posición, OrderSend devuelve 0. Lo cual no es un error, pero tampoco un éxito.

Miro el siguiente código en OrderSend

    return((arrow_color == INT_MAX) ? (MT4ORDERS::NewOrderCheck() ? 0 : -1) :
           ((((int)arrow_color != INT_MIN) || MT4ORDERS::NewOrderCheck()) &&
            MT4ORDERS::OrderSend(MT4ORDERS::LastTradeRequest, MT4ORDERS::LastTradeResult) ?
            (MT4ORDERS::IsHedging ? (long)MT4ORDERS::LastTradeResult.order : // PositionID == Result.order - Función MT5-Hedge
             ((MT4ORDERS::LastTradeRequest.action == TRADE_ACTION_DEAL) ?
              (MT4ORDERS::IsTester ? (::PositionSelect(MT4ORDERS::LastTradeRequest.symbol) ? PositionGetInteger(POSITION_TICKET) : 0) :
                                      // HistoryDealSelect en MT4ORDERS::OrderSend
                                      ::HistoryDealGetInteger(MT4ORDERS::LastTradeResult.deal, DEAL_POSITION_ID)) :
              (long)MT4ORDERS::LastTradeResult.order)) : -1));

MT4ORDERS::OrderSend devuelve true. MT4ORDERS::LastTradeRequest.action == TRADE_ACTION_DEAL también es true. MT4ORDERS::IsTester también es true. Pero PositionSelect(MT4ORDERS::LastTradeRequest.symbol) devuelve false. Al parecer, esto se debe a que la posición está cerrada. ¿Es esto un error o una característica? ¿O he entrado de nuevo en un área que no es totalmente compatible con esta librería?

 
traveller00:

Tengo una cuenta de compensación. Abro y cierro una posición en ella por marketplaces. Al cerrar una posición, OrderSend devuelve 0. Lo cual no es un error, pero tampoco un éxito.

Elcierre de una posición se suele hacer a través de OrderClose. Si cierras una posición vía OrderSend, es lógico que devuelva cero, porque MT4Style-OrderSend devuelve un ticket de una posición abierta. Pues bien, si la has cerrado, no hay nada que devolver. Un error es cuando -1.


Si usas OrderSend para cerrar parcialmente o dar la vuelta, debería (supuestamente) devolver un ticket de la posición cambiada. Cero - cuando no hay ticket a devolver.

 

Estoy intentando configurar la ejecución parcial de órdenes en mi cabeza, pero aún no lo entiendo del todo. Y las cuentas demo la mayoría de las veces escupen el volumen y no permiten comprobarlo experimentalmente.

Hay 2 situaciones: uso MT4 puro con la opción"Ejecución Parcial de Órdenes Límite" y uso MT5 con la librería MT4Orders. Se coloca una orden limitada y se ejecuta parcialmente.

1. En MT4, según tengo entendido, habrá 2 órdenes: 1 para el volumen parcialmente ejecutado como orden no limitada, pero ya ejecutada, y 1 para el volumen restante como orden limitada. Las órdenes serán independientes, la 2ª orden es colocada esencialmente por el broker. Una vez ejecutado el volumen restante, habrá 2 órdenes, sólo que ambas ejecutadas. ¿Lo he entendido bien? Porque mirando el esquema de API en MT4 solo me vino a la mente esto, no veo ningún trabajo con ejecución parcial allí, así como colocar el tipo de orden, como FOK u otra cosa.

2. Para MT5, la orden seguirá siendo 1, sigue siendo una orden limitada, pero habrá una división de volúmenes en ORDER_VOLUME_INITIAL y ORDER_VOLUME_CURRENT. MT4Orders devolverá ORDER_VOLUME_CURRENT y para obtener el segundo volumen tendrás que tirar de la API nativa de MT5. Cuando se llene el volumen restante, la orden seguirá siendo 1, pasará de Límite a Ejecutada, y el precio se recalculará a la media. ¿Estoy entendiendo esto correctamente?

 
traveller00:

Estoy intentando configurar la ejecución parcial de órdenes en mi cabeza, pero aún no lo entiendo del todo. Y cuentas demo en su mayoría escupen en el volumen y no permiten comprobar experimentalmente.

Hay 2 situaciones: uso MT4 puro con la opción"Ejecución Parcial de Órdenes Límite" y uso MT5 con la librería MT4Orders. Se coloca una orden limitada y se ejecuta parcialmente.

1. En MT4, según tengo entendido, habrá 2 órdenes: 1 para el volumen parcialmente ejecutado como orden no limitada, pero ya ejecutada, y 1 para el volumen restante como orden limitada. Las órdenes serán independientes, la 2ª orden es colocada esencialmente por el broker. Una vez ejecutado el volumen restante, habrá 2 órdenes, sólo que ambas ejecutadas. ¿Lo he entendido bien? Porque mirando el esquema de la API en MT4 solo me vino a la mente esto, no veo ningún trabajo con la ejecución parcial allí, así como la colocación del tipo de orden, como FOK u otra cosa.

Correcto.

2. Para MT5, la orden seguirá siendo 1, sin dejar de ser una orden limitada, pero habrá una división de volúmenes en ORDER_VOLUME_INITIAL y ORDER_VOLUME_CURRENT. MT4Orders devolverá ORDER_VOLUME_CURRENT y para obtener el segundo volumen tendrás que tirar de la API nativa de MT5. Cuando se llene el volumen restante, la orden seguirá siendo 1, pasará de Límite a Ejecutada, y el precio se recalculará a la media. ¿Estoy entendiendo esto correctamente?

Se generarán muchas operaciones con la misma DEAL_ORDER. La orden puede incluso ser modificada (precio abierto) o eliminada por usted. Es decir, su estado puede ser CANCELADA, pero ha generado varias operaciones. Por eso no siempre es posible conocer el valor del deslizamiento.


No tengo conocimiento de ello. Tal vez es posible influir en el precio a través de demo-limitadores en MOEX-demo contorno. Entonces es fácil reproducir la situación: poner BuyLimit dentro del spread e inmediatamente hacer unos pequeños SELL-mercados.


ORDER_VOLUME_INITIAL - no vi un escenario donde esta información pudiera ser útil.


Si no hubiera posiciones abiertas (no es necesario para Hedge), la ejecución parcial crea una Posición MT5 y una Orden MT5 con el mismo ticket. Además, crea operaciones con el mismo PositionID. Por eso en el modo SELECT_BY_TICKET, a diferencia de MT4, se puede priorizar dónde buscar primero (en el Histórico o entre las vivas) - MODE_HISTORY/MODE_TRADES. Y la selección por Ticket, en consecuencia, no es unívoca.


Por eso recomiendo hacerlo vía SELECT_BY_POS.

 
fxsaber:

ORDER_VOLUME_INITIAL - No he visto ningún escenario en el que esta información pudiera ser útil.

Lo utilizo junto con ORDER_VOLUME_CURRENT para determinar cuánto se ha vertido y cuánto queda aún en el limitador. Principalmente para mis propias estadísticas para hacer el proceso más claro.


Gracias por la explicación detallada. Significa que me imaginaba todo correctamente, así que lo estoy haciendo. Lo único que no tuve en cuenta es que la ejecución parcial en MT5 creará una nueva orden de mercado.

 
fxsaber:

El cierre de una posición se suele realizar a través de OrderClose.

Pero en este caso es imposible trabajar a través del Limitador. ¿O es posible de alguna manera?

 
traveller00:

Y en este caso, no hay manera de trabajar a través del limitador. ¿O hay alguna manera?

Yo cierro posiciones fijando un takeout al precio actual. Pero el takeout no siempre tiene forma de límite (depende del software del broker). Por eso esta solución no siempre es adecuada.

Si es necesario ser exacto con un limitador. Establezco un limitador y, en caso de cobertura, cierro las posiciones opuestas mediante OrderCloseBy.