¡Ayúdame a cerrar el orden al final del bar!

 

Necesito ayuda para formular un código que cierre la orden exactamente al final de la barra.Es para un EA especial de scalper, por lo que necesita precisión milimétrica.Permítanme ilustrar lo que quiero decir:



Aquí podéis ver por ejemplo un gráfico M15 de EUR/USD.Ahora imaginad que tengo algún indicador que me lleva a una operación larga justo en la apertura de la vela marcada como X, por lo que subió y luego siguió una vela bajista, con un mínimo muy bajo, pero eso no importa, lo que importa es que en base a mis cálculos, la salida óptima aquí sería el punto de cierre de la barra marcada como 1.¡La parte complicada es que no sé cómo cerrar la orden al precio de cierre de la barra nº 1, y aquí necesito ayuda!

La mejor solución que se me ocurre por ahora es esta (en el caso de esta operación imaginaria de COMPRA):


/////////////////OrderSelect() and other stuff

if( OrderType() == OP_BUY ){
    
if( /* blablabla condition && */ Time[0]>OrderOpenTime()  ){

OrderClose( OrderTicket(), OrderLots(),OrderClosePrice() ,TAKEPROFITPIPS,CLR_NONE);             
RefreshRates();    

}}

Este código cierra la operación de compra exactamente en el Open[0], pero no en el Close[1].Verás, porque si te fijas en la imagen y compruebas la barra marcada como 2, puedes ver que la barra 2 no se abrió a ese precio como se cerró la anterior, sino que se abrió a un precio ligeramente diferente.Y a veces ocurre un gap enorme como aquí:



Así que la experiencia dice que:

Close[1] != Open[0]

Por eso necesito que la orden se cierre justo en Close[1].

La única solución factible que he pensado es contar el tiempo, por ejemplo este es el gráfico M1 y M15, contar el número de segundos ya sea 60 para M1 o 900 para M15 en cualquier caso y cerrar la orden en los segundos 59 o 599. El problema con esto es que los ticks son de 6 segundos supongo (corrígeme si me equivoco) y no se puede golpear con precisión porque debido a este problema de tiempo y el problema de deslizamiento adicional que podría cerrar la operación mucho después de la barra se cierra.

Así que recapitulemos mi pregunta, ¿es posible contar el tiempo tal y como lo he descrito anteriormente, si es así, entonces cómo evadir el problema del deslizamiento y el retraso de los ticks?

O si se le ocurren otras soluciones para cerrar la orden justo en Close[1] y no en Open[0], entonces estoy abierto a ello.

 
Proximus:

Necesito ayuda para formular un código que cierre la orden exactamente al final de la barra.

no hay una situación en la que se pueda decir que el último tick de este momento es un tick antes del último tick de la barra actual
 

Módulo, comprueba cuando no hay resto. buena suerte

if( !MathMod( TimeCurrent(), PERIOD_M5 * 60 ) ) 

      OrderClose( OrderTicket(), OrderLots(), Bid , slippage );
 
trevone:

Módulo, comprueba cuando no hay resto. buena suerte

Eso no funcionará . . . será antes del final de la barra o después . . . nunca al final de la barra. Como dijo deVries, no es posible detectar el final de la barra actual, pero sí el inicio de la siguiente. . .
 
RaptorUK:
Eso no funcionará... o será antes del cierre de la barra o después... nunca al cierre de la barra. Como dijo deVries, no es posible detectar el final de la barra actual, pero podemos detectar el inicio de la siguiente. . .


Si pudiera ser cada vez antes del cierre, pero lo más cerca posible del cierre, entonces aceptaría esa solución también, pero si es sólo 1 vez después del cierre entonces no es mejor que la que pensé y por lo tanto no es aceptable.


¿Y qué pasa con la otra solución, la de tomar el 1 segundo antes del cierre de la barra?

Así en el caso de M1

if( Time[0]>=OrderOpenTime()+59  ) 

      OrderClose( OrderTicket(), OrderLots(), Bid , slippage );

En este caso, ¿cómo resolver el problema de los ticks, si es que los hay?

 
Proximus:

Si pudiera ser cada vez antes del cierre, pero lo más cerca posible del cierre, entonces aceptaría esa solución también, pero si es sólo 1 vez después del cierre entonces no es mejor que la que pensé y por lo tanto no es aceptable.


¿Y qué pasa con la otra solución, la de tomar el 1 segundo antes del cierre de la barra?

Así en el caso de M1

En este caso, ¿cómo resolver el problema de los ticks si es que lo hay?




si no es así, esto hace que se espere un minuto más y también en ese caso si hay algún....
 
Proximus:

Si pudiera ser cada vez antes del cierre, pero lo más cerca posible del cierre, entonces aceptaría esa solución también, pero si es sólo 1 vez después del cierre entonces no es mejor que la que pensé y por lo tanto no es aceptable.Pero ¿por qué exactamente se cierra después del tick actual?

Las cosas sólo ocurren en un EA ( y en un indicador ) cuando hay un tick, no tienes forma de saber cuándo es el último tick de una barra hasta que tienes el primer tick en la siguiente barra... incluso si el tick es a los 59 minutos y 59 segundos después de la hora para una barra H1, todavía podría haber otro tick durante ese segundo...

Proximus:

¿Y qué hay de la otra solución, la de tomar el 1 segundo antes del cierre de la barra?

Así en el caso de M1

En este caso, ¿cómo se resuelve el problema de los ticks, si es que los hay?

. . y no se puede esperar al último segundo de la barra porque puede que no haya ticks durante los últimos 5 segundos de la barra por lo que en ese caso nunca se "verá" el último segundo de la barra.

 
RaptorUK:

Las cosas sólo ocurren en un EA ( y en un Indicador) cuando hay un tick, no tienes forma de saber cuándo es el último tick de una barra hasta que tienes el primer tick en la siguiente barra... incluso si el tick es a los 59 minutos y 59 segundos después de la hora para una barra H1, todavía podría haber otro tick durante ese segundo...

. . y no puede esperar al último segundo de la barra porque puede que no haya ticks durante los últimos 5 segundos de la barra, así que en ese caso nunca "verá" el último segundo de la barra.

Entonces, ¿debo entender que si los tipos de cambio interbancarios no cambian en un período de tiempo determinado, el corredor no llama a los nuevos datos de precios?

Pensaba que un tick en MT4 significaba que siempre se refrescaba el precio después de X segundos sin importar el precio o el volumen, así que digamos que la tasa de refresco sería de 3 segundos, entonces sabrías que en el M1 tenías que cerrar esa operación justo a los 57 segundos o antes.


Dada esta situación, ¿no podría utilizar el:

RefreshRates();   

Para llamar a la última garrapata a los 58 segundos y salir a los 59?

 
Proximus:

Entonces, ¿debo entender que si los tipos de cambio interbancarios no cambian en un período de tiempo determinado, el corredor no llama a los nuevos datos de precios?

Pensé que un tick en MT4 significaba que siempre refresca el precio después de X períodos de segundos sin importar el precio o el volumen, así que digamos que la tasa de refresco sería de 3 segundos, entonces usted sabría que en el M1 tuvo que cerrar esa operación justo a los 57 segundos o antes.

Si los precios del Broker no cambian, Bid y Ask, no hay un nuevo tick... alrededor de la medianoche GMT en algunos de los pares menos negociados puede no haber ticks durante un minuto o más... un nuevo tick no se genera después de un tiempo preestablecido, sucede cuando hay un cambio en el precio, Bid o Ask ( y tal vez en algunas otras circunstancias, cambio en otros parámetros del símbolo )....

Proximus:

Dada esta situación, ¿no podría utilizar el:

Llamar al último tick a los 58 segundos y salir a los 59?

¿Cómo se llama a RefreshRates() si no hay ningún tick?
 

Gracias por la aclaración de cómo funcionan los ticks en MT4.

RaptorUK:

Si los precios del broker no cambian, Bid y Ask, no hay un nuevo tick... alrededor de la medianoche GMT en algunos de los pares menos negociados puede no haber ticks durante un minuto o más... un nuevo tick no se genera después de un tiempo preestablecido, sucede cuando hay un cambio en el precio, Bid o Ask ( y tal vez en algunas otras circunstancias, cambio en otros parámetros del símbolo )....

¿Cómo se llama a RefreshRates() si no hay ningún tick?

Bueno, yo pensaba queRefreshRates() forzaría al broker a llamar a un nuevo conjunto de feed de su proveedor de liquidez, pero supongo que no es así.


En cualquier caso, si alguien puede encontrar una solución mejor que esta, por favor compártala conmigo, es muy importante.

/////////////////OrderSelect() and other stuff

if( OrderType() == OP_BUY ){
    
if( /* blablabla condition && */ Time[0]>OrderOpenTime()  ){

OrderClose( OrderTicket(), OrderLots(),OrderClosePrice() ,TAKEPROFITPIPS,CLR_NONE);             
RefreshRates();    

}}
 
Proximus:

Gracias por la aclaración de cómo funcionan los ticks en MT4.

RaptorUK:

Si los precios del Broker no cambian, Bid y Ask, no hay un nuevo tick... alrededor de la medianoche GMT en algunos de los pares menos negociados puede no haber ticks durante un minuto o más... un nuevo tick no se genera después de un tiempo preestablecido, sucede cuando hay un cambio en el precio, Bid o Ask ( y tal vez en algunas otras circunstancias, el cambio en otros parámetros del símbolo )...

¿Cómo se llama a RefreshRates() si no hay un tick?

Bueno, yo pensé que el RefreshRates() obligaría al corredor a llamar a un nuevo conjunto de alimentación de su proveedor de liquidez, pero supongo que no es.


En fin, si alguien puede encontrar una solución mejor a mi problema que esta, por favor compártala conmigo, es muy importante.


Lo mejor que puede hacer es utilizar el siguiente tick después del último tick de la barra, es decir, el primer tick de la siguiente barra.
Razón de la queja: