Cierre de medios lotes. - página 13

 
Lo siento, pero no entiendo cómo eso me ayudaría en absoluto. No importa lo que pase en el bucle for y el void que se llame. Importa lo que llamo primero en el "int start()" seguramente.

Como he pegado arriba, si hago la mitad del pedido, irrelevante lo que es el OrderTicket(), CUALQUIER "OP_BUY" abierto será llamado una y otra vez?

Necesito una forma de escribir el código para que dentro de "in start()" y ese código de arriba, NO siga llamando al "OP_BUY" cada vez DESPUÉS de haber cerrado ya una mitad?
 
DomGilberto:
Lo siento, pero no entiendo en qué me puede ayudar eso. No importa lo que pase en el bucle for y el void que se llame. Se trata de lo que primero llamo en el "int start()" seguramente.

Como he pegado arriba, si hago la mitad del pedido, irrelevante lo que es el OrderTicket(), CUALQUIER "OP_BUY" abierto será llamado una y otra vez?

Necesito una forma de escribir el código para que dentro de "in start()" y ese código de arriba, NO siga llamando al "OP_BUY" cada vez DESPUÉS de haber cerrado ya una mitad?

El void al que se llama no es más que una función que está siendo llamada desde dentro de start()... es igual que si el código estuviera directamente en start().

pseudo código:

buscar OP_BUYs

si se encuentra - ¿el TP está en BE?

si el TP no está en BE y Bid >= primer objetivo mover el TP a BE y cerrar la mitad de la orden

si el TP está en BE no hacer nada

 

¡¡¡SI!!! ¡Gracias RaptorUK!

Lo siento, no soy tan estúpido como lo que hago saber ;) - Solo que a veces hay que reiterarme un poco las cosas cuando soy nuevo en algo....

Me he dado cuenta de que todo el mundo me lo ha dicho hace páginas, ¡me disculpo por no haberlo captado o entendido!


¡¡¡CORRECTO!!! ¡Por fin hemos conseguido cerrar la mitad, pasar al punto de equilibrio y dejar de cerrar continuamente las mitades al mismo precio :D! ¡¡¡Así que está más o menos en su punto perfecto!!!

¡Todo lo que voy a hacer ahora, es esencialmente copiar y pegar esto para mis otras salidas y cambiar algunas reglas y hay presto! Bobs tu tío = está resuelto :)

Lo colgaré todo aquí para que otros puedan utilizarlo si así lo desean - Después de todo, mucha paciencia de otros me ha permitido no sólo codificarlo, sino también entenderlo :)

 
Es extraño - a veces cuando hago un backtest el medio cierre @ 1:1 no funciona, pero luego cuando hago un backtest más corto es que funciona? Extraño... ¿es porque el probador de estrategias es una mierda, o tengo un defecto en el código?
 
Ah, y ¿qué sugeriría hacer si el precio no alcanza el primer objetivo de 1:1 PERO el stoploss es MAYOR que la entrada....? ¿Cómo puedo crear una regla en torno a que entonces....
 
DomGilberto:
Ah, y ¿qué se sugiere hacer si el precio no alcanza el primer objetivo de 1:1 PERO el stoploss es MAYOR que la entrada....? ¿Cómo podría crear una regla en torno a eso entonces....


¿cuándo se modifica para llegar al punto de equilibrio?

si no se alcanza el objetivo la operación se cerrará en OrderStopLoss()

 
deVries:


¿cuándo se modifica hasta el punto de equilibrio?

si no se alcanza el objetivo, la operación se cerrará con OrderStopLoss()


Cierro la mitad usando OrderClose() y si eso devuelve true, entonces llamo al breakeven void para mover el stoploss a break even? De esta manera el resto de la posición abierta en lotes no se cerrará continuamente porque si la posición se ha movido al punto de equilibrio, entonces he escrito que no habrá más cierres de esa posición hasta que alcance su precio fijo de take profit de 1:2.

Sin embargo, algunas operaciones irán igual a la entrada o más allá del punto de equilibrio ANTES de que la operación haya alcanzado el primer objetivo, NO activando el medio cierre...

Además, en algunas operaciones la salida a mitad de camino y el movimiento hasta el punto de equilibrio funcionan perfectamente..... ¿En algunas operaciones en las que debería funcionar, no hace nada? ¿Podría ser debido a los datos pobres y un defecto con probador de la estrategia, o hay una inconsistencia con mi código?

Ah, y todavía estoy recibiendo OrderModify 1 - jodidamente irritante ...

 

¿Cómo identificas la orden después de haberla cerrado para luego modificar la SL para que quede en paz? Sabe que no puede utilizar el número de ticket original, ¿verdad? Cuando se cierra parcialmente un pedido, se cierra el número de ticket original. La parte restante recibe un nuevo número de ticket. Una forma de identificarlo es obtener el OrderOpenTime() antes de cerrar la parte. Después de cerrar parcialmente un pedido, la parte restante obtendrá un nuevo número de ticket pero el OrderOpenTime() será el mismo que antes.

También puede utilizar ese OrderOpenTime() para identificarlo y evitar que se cierre parcialmente una y otra vez.

También puede modificarlo antes de cerrarlo parcialmente. La parte restante de su orden mantendrá el SL o TP modificado.

Aquí hay una prueba. Abierta a 0.09 cierre parcial 0.07 dejando 0.02

Observe como el número de la entrada cambia pero la hora de apertura sigue siendo la misma:

23:42:48 2013.08.01 11:28 SDCMegaTrend EURUSD,M1: open #14 buy 0.09 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 ok
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1: cerrar #14 comprar 0.07 EURUSD a 1.3240 sl: 1.3037 tp: 1.3737 al precio 1.3253
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1: Alerta: Ticket 14 OrderOpenTime antes del cierre de la pieza: 1375356521
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1: Alerta: Ticket 15 OrderOpenTime: 1375356521
23:42:48 2013.08.01 12:45 SDCMegaTrend EURUSD,M1: cierre #15 comprar 0.02 EURUSD a 1.3240 sl: 1.3037 tp: 1.3737 al precio 1.3242

 
SDC:

¿Cómo identificas la orden después de haberla cerrado para luego modificar la SL para que quede en paz? Sabe que no puede utilizar el número de ticket original, ¿verdad? Cuando se cierra parcialmente un pedido, se cierra el número de ticket original. La parte restante recibe un nuevo número de ticket. Una forma de identificarlo es obtener el OrderOpenTime() antes de cerrar la parte. Después de cerrar parcialmente un pedido, la parte restante obtendrá un nuevo número de ticket pero el OrderOpenTime() será el mismo que antes.

También puede utilizar ese OrderOpenTime() para identificarlo y evitar que se cierre parcialmente una y otra vez.

También puede modificarlo antes de cerrarlo parcialmente. La parte restante de su orden mantendrá el SL o TP modificado.

Aquí hay una prueba. Abierta a 0.09 cierre parcial 0.07 dejando 0.02

Observe como el número de la entrada cambia pero la hora de apertura sigue siendo la misma:

23:42:48 2013.08.01 11:28 SDCMegaTrend EURUSD,M1: open #14 buy 0.09 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 ok
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1: cerrar #14 comprar 0.07 EURUSD a 1.3240 sl: 1.3037 tp: 1.3737 al precio 1.3253
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1: Alerta: Ticket 14 OrderOpenTime antes del cierre de la pieza: 1375356521
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1: Alerta: Ticket 15 OrderOpenTime: 1375356521
23:42:48 2013.08.01 12:45 SDCMegaTrend EURUSD,M1: close #15 buy 0.02 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 at price 1.3242


Ah - Impresionante, gracias. Me olvidé por completo de OrderOpenTime() - ¡esa es una gran manera de hacerlo! Gracias por el consejo - Voy a experimentar con eso ahora.

Siguiendo mi anterior post, he conseguido que funcione mucho más suave ahora - el error 1 de OrderModify aparece sólo en raras ocasiones. Parece que ahora funciona con más fluidez.

El único problema es que si tengo una operación en la que el stop loss ES >= que OrderEntry() - (asumiendo que estamos hablando de un largo), entonces no cerrará la mitad de la orden porque el criterio principal para cerrar la mitad, no se ha cumplido.

Este código solitario aquí es lo que inicia el cierre de la mitad de los lotes, y la detención del cierre continuo de las mitades al mismo precio - (No es lo único que hay en "in start()", sólo lo hizo más fácil de ver):



   

int start()
{

   if(OpenOrdersThisPair(Symbol())>0) //If there is a trade open = do below, which ever is applicable.
      {
      if(OrderType()==OP_BUY && OrderOpenPrice() > OrderStopLoss())
         {
         CloseHalfOrder(); // Closes half at 1:1 - then calls another void to break even on the trade +3.
         }
      
      if(OrderType()==OP_SELL && OrderOpenPrice() < OrderStopLoss())
         {
         CloseHalfOrder1(); // Closes half at 1:1 - then calls another void to break even on the trade +3.
         }   
      } 
}
¿Cómo puedo incorporar la función OrderOpenTime() para tener un mejor control y asegurarme de que todas las operaciones se cierran con la mitad de los lotes a 1:1 SIN que se pierda ninguna cuando el stop sea >= el OrderOpen()?
 

Hay varias maneras de asegurarse de que cada orden está parcialmente cerrada, mi manera favorita de hacerlo es modificar el TP por un pip cuando lo cierro parcialmente.

Por ejemplo, necesito un TP de 100 pips, así que abro la orden con un TP de 99 pips. Sé que antes de que se alcance el take profit mi orden se cerrará parcialmente a 40 pips. Cuando eso sucede, modifico el TP a 100 pips. Por lo tanto, cualquier orden que tenga un beneficio >= 40 pips y un TP < 100 pips necesita ser parcialmente cerrada. Cualquier orden con un TP > 99 pips ya ha sido parcialmente cerrada. Si lo haces de esta manera no hay diferencia en el SL. Sólo asegúrese de normalizar todos los dobles de precios de las órdenes antes de hacer los cálculos en ellos.

Razón de la queja: