¡Ayúdame a cerrar el orden al final del bar! - página 2

 

Hmm, ¿entonces esto sería bueno?

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

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

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

}}

En realidad cambié Time[1] por Time[0] porque Time[1] se saltaba 1 barra más, así que Time[0] está representando en realidad el Open[0].

 
Proximus:

Hmm entonces esto sería bueno?

En realidad cambié Time[1] por Time[0] porque Time[1] se saltaba 1 barra más, así que Time[0] está representando en realidad a Open[0].

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

y comprobar también si orderclose tiene éxito

 
deVries:

y comprobar también si orderclose tiene éxito

Bien, si no tiene éxito, entonces cuando la función start() se repita, probará de nuevo que if() antes de orderclose() y como las condiciones seguirán siendo verdaderas para proceder, intentará cerrarlo de nuevo.
 
Proximus:
Bueno, si no tiene éxito, entonces cuando la función start() se repite, probará de nuevo que if() antes de la orderclose() y como las condiciones seguirán siendo verdaderas para proceder, intentará cerrarla de nuevo.
¿No quieres saber que ha fallado? y si ha fallado por qué ha fallado? y cuál era el valor de las variables relevantes en ese momento que han podido hacer que falle? si sabes todo esto puedes arreglarlo para que no falle la próxima vez....
 
Proximus:

Hmm, ¿entonces esto sería bueno?

En realidad cambié Time[1] por Time[0] porque Time[1] se saltaba 1 barra más, así que Time[0] está representando en realidad el Open[0].

No, esto siempre se cerrará independientemente de que el tick sea el tick de la siguiente barra o no, para cualquier barra siguiente a la barra en la que se abrió la operación y cualquier momento durante esa barra Time[0] siempre será mayor que OrderOpenTime().

Si quiere cerrar tan cerca del cierre de la barra entonces tiene que determinar si el tick actual es el primer tick de la nueva barra... entonces también tiene que asegurarse de que el cierre funciona porque sólo tendrá una oportunidad por barra.
 
Proximus:
Bueno, si no tiene éxito, entonces cuando la función start() se repita, probará de nuevo el if() antes de orderclose() y como las condiciones seguirán siendo verdaderas para proceder, intentará cerrarlo de nuevo.


usted comenzó que tiene que cerrar el último tick de la barra

tratamos de entender que no es posible saber cuando viene la última barra de ticks

ahora no importa si el cierre falla lo intentamos de nuevo, de nuevo, de nuevo en los siguientes ticks

también te perdiste otros cambios que sugerí

¿que sentido tiene refrescar las barras después del cierre de la orden?

y sabes por qué el deslizamiento en lugar de TAKEPROFITPIPS

depende del errorreturn puedes intentar cerrarlo 2 veces en el mismo bucle

si el contexto de la operación está demasiado ocupado y tiene más operaciones dentro del bucle para cerrar la n gran posibilidad de que fallan también

 
RaptorUK:
No, esto siempre se cerrará independientemente de que el tick sea el de la siguiente barra o no, para cualquier barra siguiente a la barra en la que se abrió la operación y cualquier momento durante esa barra Time[0] siempre será mayor que OrderOpenTime().

Si quiere cerrar tan cerca del cierre de la barra entonces tiene que determinar si el tick actual es el primer tick de la nueva barra... entonces también tiene que asegurarse de que el cierre funciona porque sólo tendrá una oportunidad por barra.

¿No se repite el start() después de cada tic? ¿Me equivoco?

De todos modos imagínate así:

OrderOpenTime() = 12:12:01 (12 H 12 MIN 1 SEC)

La orden se abre, el paquete de la función Orderclose() está después de mi OrderSend() en el código principal así que, justo después de abrir la orden mi paquete OrderClose() probará si las condiciones se cumplieron para cerrar la orden o no:

Time[0] es el precio de apertura de esta barra, por lo que por lógica común debe ser menor que el tiempo de apertura de la orden, ya que la orden no puede abrirse antes de la misma barra abierta.Es: 12:12:00

Así que por todos los medios :

if(Time[0]>OrderOpenTime())

Si no se puede cerrar, por cualquier razón, como el deslizamiento o así, no hay problema, el start() se repite

Y para la siguiente repetición el Time[0] será 100% mayor que el tiempo de apertura de la orden, porque es lógico, así que si el primer cierre falla el otro OrderClose() ocurrirá cada vez que el start() se repita, y como creo que el start() se repite cada tick, entonces no creo que haya una mejor manera de cerrar la orden más rápido, espero haberlo explicado claramente :)

 
deVries:


usted comenzó que tiene que cerrar el último tick de la barra

intentamos que entienda que no es posible saber cuando viene la última barra de ticks

ahora no importa si el cierre falla lo intentamos de nuevo, de nuevo, de nuevo en los siguientes ticks

también te perdiste otros cambios que sugerí

¿que sentido tiene refrescar las barras después del cierre de la orden?

y sabes por qué el deslizamiento en lugar de TAKEPROFITPIPS

depende del errorreturn puedes intentar cerrarlo 2 veces en el mismo bucle

si el contexto de la operación está demasiado ocupado y tiene más operaciones dentro del bucle para cerrar la n gran posibilidad de que fallan también

Yo uso TAKEPROFITPIPS porque esa es mi variable para TAKEPROFIT, y ya que permito un deslizamiento máximo tanto como mi nivel de TP, porque es lógico que no debes tener más deslizamiento que tu TP si cierras las órdenes con OrderClose(), porque si lo haces entonces el TAKEPROFIT la cerrará en tu lugar de manera más eficiente que el OrderClose().
 
Proximus:

¿No se repite el start() después de cada tic? ¿Me equivoco?

Sí, start() se llama por cada tick a menos que se siga ejecutando. . .

Proximus:

De todas formas imagínate así:

OrderOpenTime() = 12:12:01 (12 H 12 MIN 1 SEC)

La orden se abre, el paquete de la función Orderclose() está después de mi OrderSend() en el código principal así que, justo después de abrir la orden mi paquete OrderClose() probará si las condiciones se cumplieron para cerrar la orden o no:

Time[0] es el precio de apertura de esta barra, por lo que por lógica común debe ser menor que el tiempo de apertura de la orden, ya que la orden no puede abrirse antes de que la misma barra se abra.Es: 12:12:00

Así que por lógica :

Si no se puede cerrar, por cualquier razón, como el deslizamiento o así, no hay problema, el start() se repite

Y para la siguiente repetición el Time[0] será 100% mayor que el tiempo de apertura de la orden, porque es lógico, así que si el primer cierre falla el otro OrderClose() ocurrirá cada vez después cuando el start() se repita, y como creo que el start() se repite por cada tick, entonces no creo que haya una mejor manera de cerrar la orden más rápido, espero haberlo explicado claramente :)

Sí, pero eso no es lo que pedías en tu primer post de este hilo... ahora dices que está bien que el cierre se retrase por Periodo y luego otro Periodo, etc. Si quieres cerrar lo más cerca posible del final de la barra entonces tienes que hacerlo en el primer tick de la siguiente barra, y debes comprobar si el cierre ha fallado y reintentarlo de la manera correcta para que consigas cerrarlo.
 

Es bastante raro que el precio de cierre de una barra no se repita en la barra siguiente, no necesariamente su precio de apertura...