Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Lo siento, no puedo hablar ruso. Yo uso el traductor de Google.
Hace unos días encontré esta biblioteca muy interesante. Pero tengo un problema: envío una orden de mercado a través de OrderSend () y guardo la entrada devuelta por OrderSend (). Después de un tiempo, se alcanzan los stop losses o se obtienen beneficios. Entonces intento seleccionar una orden via OrderSelect(ticket, SELECT_BY_TICKET) con este ticket. En MQL4 la orden se encuentra en el historial. Pero usando esta librería con MQL5, OrderSelect fallará.
He mirado un poco en el código de MT4orders.mqh. MT4ORDERS::SelectByTicket () llama a SelectByExistingTicket(), que falla, y luego a SelectByHistoryTicket(), que espero que tenga éxito. En SelectByHistoryTicket(), HistoryDealSelect() normalmente devuelve false (excepto quizás en una prueba) porque el ticket es un identificador de posición, no un ticket de transacción. ::HistoryOrderSelect() devuelve true, porque el ticket es el mismo que el ticket de la orden (e identificador de posición) (uso MT5 en modo cobertura). Pero MT4HISTORY::IsMT4Order(Ticket) devuelve false. Espero que devuelva true. La función devolverá true si el id de posición es cero. Pero veo que tanto en la prueba como en la cuenta real, el id de posición no es cero y es igual al bit de orden en la orden.
Cualquier ayuda es bienvenida.
Hace unos días encontré esta biblioteca muy interesante. Pero tengo un problema: envío una orden de mercado a través de OrderSend () y guardo la entrada devuelta por OrderSend (). Al cabo de un rato, se alcanzan los stop losses o se obtienen beneficios. Entonces intento seleccionar una orden via OrderSelect(ticket, SELECT_BY_TICKET) con este ticket. En MQL4 la orden se encuentra en el historial. Pero usando esta libreria con MQL5, OrderSelect fallara.
Esto es correcto. Los detalles se describen aquí.
Usted puede hacer PositionTicket = OrderSend(OP_BUY, 2 lotes) y OrderClose(0.2 lotes) + OrderClose(0.3 lotes). Entonces obtendrá dos "posiciones" cerradas (0.2/0.3 lotes) y una posición abierta (1.5 lotes) con un ticket igual a PositionTicket. Esta es una peculiaridad de MT5. Por lo tanto, es incorrecto seleccionar una posición por su POSITION_ID en el Historial de Operaciones en el modo SELECT_BY_TICKET+MODE_HISTORY.
La memorización de tickets es un mal estilo, aunque es popular. La forma correcta es cuando en cada evento el robot de trading lee todo el entorno desde cero.
ZY Aquí se puede ver aproximadamente la misma situación que la descrita anteriormente
Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading
Bibliotecas: MT4Orders
fxsaber, 2018.04.14 09:10 AM
Ejemplo
Resultado
Los resultados muestran que se abrió una posición con ticket == 2. Luego se cerró dos veces, creando así dos "posiciones" cerradas en el Historial de Operaciones. Sus tickets son diferentes, pero ambas "posiciones" tienen OrderTicketOpen == 2. Es decir, debe darse cuenta de que si cierra una posición en MT5, su ticket histórico no coincide con el de tiempo real.
Observe que en MT5 incluso los comentarios al cerrar la misma posición en tiempo real son diferentes:"Hello World!" y"tp 1.23614".
Lo siento, no puedo hablar ruso. Yo uso el traductor de Google.
Hace unos días encontré esta biblioteca muy interesante. Pero tengo un problema: envío una orden de mercado a través de OrderSend () y guardo la entrada devuelta por OrderSend (). Después de un tiempo, se alcanzan los stop losses o se obtienen beneficios. Entonces intento seleccionar una orden via OrderSelect(ticket, SELECT_BY_TICKET) con este ticket. En MQL4 la orden se encuentra en el historial. Pero usando esta librería con MQL5, OrderSelect fallará.
He mirado un poco en el código de MT4orders.mqh. MT4ORDERS::SelectByTicket () llama a SelectByExistingTicket(), que falla, y luego a SelectByHistoryTicket(), que espero que tenga éxito. En SelectByHistoryTicket(), HistoryDealSelect() normalmente devuelve false (excepto quizás en una prueba) porque el ticket es un identificador de posición, no un ticket de transacción. ::HistoryOrderSelect() devuelve true porque el ticket es el mismo que el ticket de la orden (e identificador de posición) (estoy usando MT5 en modo cobertura). Pero MT4HISTORY::IsMT4Order(Ticket) devuelve false. Espero que devuelva true. La función devolverá true si el id de posición es cero. Pero veo que tanto en la prueba como en la cuenta real, el id de posición no es cero y es igual al bit de orden en la orden.
Cualquier ayuda es bienvenida.
Para una mejor comprensión de la traducción automática, adjunte el texto en inglés.
He encontrado esta biblioteca muy interesante hace unos días. Pero tengo un problema: Envío una orden de mercado a través de OrderSend() y almaceno el ticket devuelto por OrderSend(). Despues de un tiempo el stop loss o take profit es alcanzado. Entonces intento seleccionar la orden via
OrderSelect(ticket, SELECT_BY_TICKET) con este ticket. En MQL4 la orden seria encontrada en el historial. Pero usando esta libreria con MQL5, OrderSelect no tiene exito.
He mirado un poco en el código de MT4orders.mqh . MT4ORDERS::SelectByTicket() llama a SelectByExistingTicket() que falla y luego a SelectByHistoryTicket() que yo esperaría que tuviera éxito. En SelectByHistoryTicket() la función HistoryDealSelect() generalmente devuelve false (excepto quizás en el tester) porque el ticket es el identificador de posición y no el ticket de la operación. ::HistoryOrderSelect() devuelve true porque el ticket es el mismo que el ticket de la orden (y el identificador de posición)(uso MT5 en modo cobertura). Pero MT4HISTORY::IsMT4Order(Ticket) devuelve false. Yo esperaría que devolviera true. La función devolvería true si el identificador de posición fuera cero. Pero veo que tanto en el tester como en una cuenta real el identificador de posición no es cero - e igual al ticket de la orden de entrada.
En otras palabras: No entiendo por qué en la función MT4HISTORY::IsMT4Order() está el siguiente código (devuelve true si el identificador de posición es cero):
A continuación adjunto mi código de prueba:
PrintChangesOfMQL5OrderSystemState() es una función sencilla que imprime el estado del sistema de pedidos MQL5 cada vez que se detecta un cambio.
Aquí está la salida del código de prueba (ejecutado en el probador):
Puede ver que HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID) devuelve 2 y no cero. Esta es la razón por la que MT4HISTORY::IsMT4Order() devuelve false.
Cualquier ayuda es apreciada.En otras palabras: No entiendo por qué en la función MT4HISTORY::IsMT4Order() está el siguiente código (devuelve true si el id de posición es cero):
A continuación adjunto mi código de prueba:
PrintChangesOfMQL5OrderSystemState() es una función sencilla que imprime el estado del sistema de órdenes MQL5 cada vez que se detecta un cambio.
Aquí está la salida del código de prueba (ejecutado en el probador):
Se puede ver que HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID) devuelve 2 y no cero. Esta es la razón por la que MT4HISTORY::IsMT4Order() devuelve false.
No te das cuenta de que una orden en MT5 y MT4 son entidades diferentes.
Ya te han contestado más arriba.
Usted no entiende que una orden en MT5 y en MT4 son entidades diferentes.
Entiendo los sistemas de orden de MQL5 y de MQL4 y sus diferencias.
Por lo tanto, es incorrecto seleccionar una posición por su POSITION_ID en el Historial de Operaciones en modo SELECT_BY_TICKET+MODE_HISTORY.
Sí, ya sé que la función MQL5 HistoryOrderSelect() espera un ticket y no un identificador de posición.
Pero mi codigo de prueba es codigo MQL4 valido (excepto las llamadas a las funciones MQL5 HistoryOrderSelect() y HistoryDealSelect())
y en MQL4 la funcion OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) devuelve true como era de esperar.
Que yo sepa, el propósito de la librería es emular el sistema de pedidos de MQL4 lo mejor posible en MQL5. Por lo tanto, yo esperaría que con
la libreria la funcion OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) tambien devuelva true.
He mirado el código y he intentado averiguar por qué devuelve false.
Primero: Como trabajo en un sistema de cobertura MQL5, la función
ticket = OrderSend(Symbol(), OP_BUY, 1.0, ask, 10, bid - 3*Point, bid + 3*Point);
asigna a la variable 'ticket' el ticket de la orden que es igual al identificador de la posición (futura) en MQL5 hedge. Esto se puede ver en el código
de la función MT4OrderSend(). Se devuelve lo siguiente:
Al analizar lo que hace la librería al ejecutar el código
Veo que la función SelectByHistoryTicket() se ejecuta con el ticket que tengo almacenado en la variable 'ticket'.
En esta función se llama a la función HistoryOrderSelect(ticket) - con el ticket que es igual al ticket de la orden y el identificador de posición.
Con mi llamada MQL4 OrderSelect() no llamo a HistoryOrderSelect(ticket) yo mismo - está en la librería.
Sólo en mi código de prueba llamo a HistoryOrderSelect(ticket) y HistoryDealSelect(ticket) directamente para ver lo que ocurre dentro de la librería:
Resumiendo: Según el valor de retorno de OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) la librería no emula el sistema de pedidos MQL4 en MQL.
MQL4 en MQL5 correctamente.
Sí, sé que se devuelve true cuando se llama a OrderSelect() directamente después de la apertura de la posición.
En este caso tenemos una posición MQL5 abierta y la librería encuentra la posición al llamar a OrderSelect().
Esto se hace en la función interna SelectByExistingTicket() de la librería.
Pero el punto clave es que OrderSelect(ticket) devuelve false cuando la posición MQL5 es cerrada por stop loss o take profit.
Por favor, ejecuta mi código de prueba para verificarlo (si tu broker no acepta SL y TP tan cercanos, por favor, hazlos más amplios para evitar el rechazo del OrderSend()).
Pero el punto clave es que OrderSelect(ticket) devuelve false cuando la posición MQL5 se cierra por stop loss o take profit.
Leer parte de mi respuesta detallada de nuevo
Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading.
Bibliotecas: MT4Orders
fxsaber, 2018.08.06 14:21
Es correcto. Los detalles están descritos aquí.
Puedes hacer PositionTicket = OrderSend(OP_BUY, 2 lotes) y OrderClose(0,2 lotes) + OrderClose(0,3 lotes). Entonces obtendrá dos "posiciones" cerradas (0.2/0.3 lotes) y una posición abierta (1.5 lotes) con un ticket igual a PositionTicket. Esta es una peculiaridad de MT5. Por lo tanto, es incorrecto seleccionar una posición por su POSITION_ID en el Historial de Operaciones en el modo SELECT_BY_TICKET+MODE_HISTORY.
La memorización de tickets es un mal estilo, aunque es popular. La forma correcta es cuando en cada evento el robot de trading lee todo el entorno desde cero.
ZY Aquí se puede ver aproximadamente la misma situación descrita anteriormente
Los resultados muestran que se abrió una posición con ticket == 2. Luego se cerró dos veces, creando así dos "posiciones" cerradas en el Historial de Operaciones. Sus tickets son diferentes, pero ambas "posiciones" tienen OrderTicketOpen == 2. Es decir, debe darse cuenta de que si cierra una posición en MT5, su ticket histórico no coincide con el de tiempo real.
Fíjate que en MT5 incluso los comentarios al cerrar la misma posición en tiempo real son diferentes:"¡Hola Mundo!" y"tp 1.23614".
Es imposible seleccionar inequívocamente una posición MT4 cerrada por POSITION_ID en MT5, porque puede haber varias posiciones MT4 con el mismo POSITION_ID al mismo tiempo.
Quien utilice el archivo mql4_to_mql5.mqh de MT4Orders para la conversión MT4 -> MT5, por favor, elimine este trozo de código del mismo.
Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading
Probando 'CopyTicks
fxsaber, 2016.10.19 07:59
// También establece las funciones habituales de MT4: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define DEFINE_TIMESERIE(NAME,FUNC,T) \
class CLASS##NAME \
{ \
public: \
static T Get( const string Symb, const int TimeFrame, const int iShift ) \
{ \
T tValue[]; \
\
return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
} \
\
T operator []( const int iPos ) const \
{ \
return(CLASS##NAME::Get(_Symbol, _Period, iPos)); \
} \
}; \
\
CLASS##NAME NAME; \
\
T i##NAME( const string Symb, const int TimeFrame, const int iShift ) \
{ \
return(CLASS##NAME::Get(Symb, TimeFrame, iShift)); \
}
DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)
oficialmente con MT5 buiild 1860 esta pieza de código no es relevante.
Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading
Bibliotecas: MT4Orders
fxsaber, 2017.06.14 11:30 AM.
Un buen ejemplo del uso de estas funciones se encuentra en la descripción de otra biblioteca. El enfoque mostrado permite utilizar completamente el estilo MQL4 (incluyendo la capacidad de permanecer en su función On) en modo asíncrono.