Cierre de medios lotes. - página 16

 
Ok he hecho un pequeño progreso. Pero tengo un problema. Si coloco una orden por primera vez en cualquier par, NO cerrará la mitad de la orden A MENOS que tenga una operación para comparar en el historial... En cuyo caso, si la primera operación fue 1:1, no cerrará la mitad de la posición ya que no tiene nada con lo que comparar en el historial... Asimismo, no estoy del todo seguro de lo que estoy haciendo mal, pero incluso cuando hay una operación en el historial con la que comparar, (OrderOpenTime()), sigue cerrándola continuamente al mismo precio...

int start()
{
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
if(OrderSelect(OrderTicket(),SELECT_BY_TICKET, MODE_TRADES)==True)
{  
   OrderEntryTime            = OrderOpenTime();
   datetime OrderEntryClosed = OrderCloseTime(); 
    CurrentSymbol            = OrderSymbol();
     if(OrderType() <= OP_SELL && CurrentSymbol == Symbol())
         {   
         Print(" The Selected Order ", CurrentSymbol, " matches this pair: ", Symbol());
         Print(" The Open Time of this order was: ", TimeToStr(OrderEntryTime, TIME_MINUTES | TIME_DATE));  
         }
         
  if(OpenOrdersThisPair(Symbol())>0 && CurrentSymbol==Symbol())
     {
      // Need a for loop to compare historically closed trades that match with Symbol() and the "datetime OrderEntryTime = OrderOpenTime();" above.
     CheckHistoricalTrades(); 
     }
   }
}
}  
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  

void CheckHistoricalTrades()
{
for(int Pos=OrdersHistoryTotal()-1; Pos >= 0; Pos--) 
    {
     if (OrderSelect(Pos, SELECT_BY_POS, MODE_HISTORY)  
        &&  OrderMagicNumber()  == MagicNumber            
        &&  CurrentSymbol       == Symbol()            
        &&  OrderType()         <= OP_SELL
        &&  OrderEntryTime    >  OrderOpenTime() && OrderType()==OP_BUY)
          {
          Print(" Last Order Open Time: ", TimeToStr(OrderOpenTime(), TIME_MINUTES | TIME_DATE), 
                  " Was not the same as current order: ", TimeToStr(OrderEntryTime, TIME_MINUTES | TIME_DATE));
          CloseHalfOrder();
          }
                if(OrderEntryTime > OrderOpenTime() && OrderType()==OP_SELL)
                  {
                  Print("Last Order Open Time: ", TimeToStr(OrderOpenTime(), TIME_MINUTES | TIME_DATE), 
                     " Was not the same as current order: ", TimeToStr(OrderEntryTime, TIME_MINUTES | TIME_DATE));
                  CloseHalfOrder1(); // This just closes half of the position at 1:1 - then if OrderStopLoss > OrderOpenPrice() = MoveToBreakEven() void kicks in. 
                  }
                      
     }
}  
Sé que el problema me está mirando a la cara, pero no puedo verlo...
 
Estas son las impresiones de la revista - algunas impresiones no se muestran arriba - pero todas las anteriores sí.
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: Last Order Open Time: 2010.02.04 09:22 Was not the same as current order: 2010.02.25 01:16 //>>> "Last Order Open time" here doesn't make sense?
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: SELL First Target Closed: 0.03 OP_SELL First Closed - Open Time: 2010.02.05 15:07 //>>> This is the same as "The Last Order Open Time"?
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: close #16 sell 0.03 GBPJPY at 138.270 sl: 138.240 tp: 135.082 at price 136.637  //>>> Therefore, it closed it here.
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: Ask >= FirstTarget_Sell - Current Ask: 136.637 FirstTarget_Sell: 136.676     //>>> The ask is at the OrderClose() price.
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: FirstTarget_Sell: 136.676
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: Order Ticker Number = 10
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: The Lots to close is: 0.030
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: Last Order Open Time: 2010.02.05 15:07 Was not the same as current order: 2010.02.25 01:16
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1:  The Open Time of this order was: 2010.02.25 01:16
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1:  The Selected Order GBPJPY matches this pair: GBPJPY
 
DomGilberto:

El problema que tengo es que estoy tratando de cerrar parcialmente el mismo "OP_BUY" o "OP_SELL" hasta 4 veces a diferentes precios... Creo que la pregunta que debería hacer es, ¿puedo conseguir una manera, en la que tengo una regla que TODOS los cierres parciales (de cualquier lote y precio en UNA operación dada) sólo se cerrarán parcialmente UNA vez en sus parámetros predefinidos "OrderClose()" establecidos...?

Esta forma en que estoy buscando hacerlo ahora con la comparación de la OrderOpenTime() esencialmente sólo funcionará una vez, y restringirá cualquier otro tipo de función OrderClose() de suceder en absoluto ... Estoy queriendo encontrar una manera en la que pueda tener una regla aplicada a 4 funciones OrderClose()... (si eso tiene sentido?)

Sé que la gente está sugiriendo abrir 4 órdenes, pero sin profundizar demasiado, es menos eficiente para mí hacerlo de esa manera.

Por qué no tener simplemente un array bidimensional que almacene el número de ticket y el número de cierres parciales disponibles que quedan por realizar.

Esquema/Pseudocódigo:

1. definir un array bidimensional estático: cOrders[][2].

2. para cada nuevo pedido introducido: redimensionar la primera dimensión de cOrders a tamaño+1, poner el número de ticket del nuevo pedido en [x][0] y el número de cierres parciales que quedan por realizar (en este caso, 4) en [x][1].

3. en cualquier intervalo de tiempo (por ejemplo, cada start()), recorra el array, seleccione cada orden utilizando el número de ticket almacenado y determine si es necesario realizar un cierre parcial.

4. si es necesario realizar un cierre parcial (ver paso 3), cerrar parcialmente el pedido utilizando OrderClose() y actualizar cOrders[x][0] para reflejar el nuevo número de ticket y reducir cOrders[x][1] en 1.

5. eliminar de cOrders todas las órdenes que hayan sido cerradas o que su número de cierres parciales por realizar sea 0.

El único problema es qué hacer cuando se reinicia la plataforma o el ordenador. Podría almacenar esa información en un archivo y leer el archivo en init() al reiniciar la plataforma.

 
Thirteen:

Por qué no tener simplemente un array bidimensional que almacene el número de ticket y el número de cierres parciales disponibles que quedan por realizar.

Esquema/Pseudocódigo:

1. definir un array bidimensional estático: cOrders[][2].

2. para cada nuevo pedido introducido: redimensionar la primera dimensión de cOrders a tamaño+1, poner el número de ticket del nuevo pedido en [x][0] y el número de cierres parciales que quedan por realizar (en este caso, 4) en [x][1].

3. en cualquier intervalo de tiempo (por ejemplo, cada start()), recorra el array, seleccione cada orden utilizando el número de ticket almacenado y determine si es necesario realizar un cierre parcial.

4. si es necesario realizar un cierre parcial (ver paso 3), cerrar parcialmente el pedido utilizando OrderClose() y actualizar cOrders[x][0] para reflejar el nuevo número de ticket y reducir cOrders[x][1] en 1.

5. eliminar de cOrders todas las órdenes que hayan sido cerradas o que su número de cierres parciales por realizar sea 0.

El único problema es qué hacer cuando se reinicia la plataforma o el ordenador. Se podría almacenar esa información en un archivo y leer el archivo en init() al reiniciar la plataforma.

Creo que la forma más fácil de hacerlo es con Números Mágicos. . . usar partes del número para definir diferentes parámetros, por ejemplo: número de piezas, número de orden, día, mes, número de EA. . . todas las piezas tendrían el mismo Número Mágico y podrían ser rastreadas fácilmente en el Historial. Asumo que la parte cerrada y la parte abierta izquierda tienen ambas el mismo Número Mágico. . .
 
Sí, eso creo. El número mágico es siempre el mismo "1234"?

No tengo ni idea de cómo utilizar partes del número mágico para definir diferentes parámetros? Creo que usar OrderOpenTime() no va a ser una ruta lógica... No puedo creer lo largo que se está haciendo este hilo. Lol.

Juro por Dios que voy a hacer un hilo sobre esto una vez que yo (con mucha ayuda de todos los demás!) han descifrado.
 
RaptorUK:
Creo que la forma más fácil de hacer esto es con Números Mágicos... usar partes del número para definir diferentes parámetros, por ejemplo: número de partes, número de orden, día, mes, número de EA... todas las partes tendrían el mismo Número Mágico y podrían ser rastreadas fácilmente en el Historial. Asumo que la parte cerrada y la parte abierta izquierda tienen ambas el mismo Número Mágico. . .

El uso del Número Mágico para codificar piezas de información es muy posible, pero veo un par de posibles limitaciones. Primero, el Número Mágico es un int y por lo tanto tiene 10 dígitos donde el dígito más a la izquierda sólo puede ser un 1 o 2 (y si el dígito más a la izquierda es un 2, el segundo dígito más a la izquierda debe ser 7 o menos). En segundo lugar, podría llevar más tiempo por start() revisar todo el historial para encontrar todas las partes de cada orden sólo para determinar si la orden actual necesita (o puede) cerrarse parcialmente. No estoy seguro de si ese mayor tiempo sería trivial o no.

 

Espera, ¿no puedo tener varios magicnumbers? ¿Utilizar uno para el OrderSend() inicial, uno para el OrderModify(), después de que la mitad de la posición se cierre en el primer objetivo de 1:1, modificar la orden para cambiar el MagicNumber? Por lo tanto, cuando primero quiero cerrar la mitad a 1:1, sólo se cerrará a 1:1 siempre y cuando el "OP_BUY" abierto actual se corresponda con el número mágico que le di por primera vez? Después de que se ha cerrado parcialmente, modificar y cambiar ese número mágico?

¿Idiota? ¿No es realmente sencillo?

ACTUALIZACIÓN: Obviamente tengo que dejar de mirar esto hoy - no se puede modificar un MagicNumber - aunque ojalá se pudiera... (facepalm) - Imagínate lo fácil que sería todo esto...

 
DomGilberto:
Espera, ¿no puedo tener varios números mágicos? ¿Utilizar uno para la OrderSend() inicial, uno para la OrderModify(), después de que la mitad de la posición se cierre en el primer objetivo de 1:1, modificar la orden para cambiar el MagicNumber? Por lo tanto, cuando primero quiero cerrar la mitad a 1:1, sólo se cerrará a 1:1 siempre y cuando el "OP_BUY" abierto actual se corresponda con el número mágico que le di por primera vez? Después de que se ha cerrado parcialmente, modificar y cambiar ese número mágico?

¿Idiota? ¿No es realmente sencillo?

No. En primer lugar, después del OrderSend() inicial, no puedes añadir/modificar el Número Mágico usando OrderModify(). Segundo, cuando haces un cierre parcial de la orden usando OrderClose(), la nueva orden (supongo) obtiene el mismo Número Mágico que la orden anterior.

 
Thirteen:

No. En primer lugar, después del OrderSend() inicial, no puedes añadir/modificar el Número Mágico usando OrderModify(). En segundo lugar, cuando se hace un cierre parcial de la orden utilizando OrderClose(), la nueva orden (supongo) obtiene el mismo Número Mágico que la orden anterior.


Sí, me he dado cuenta de lo retrasado que estoy siendo. Un día largo.

Sí, después del primer cierre parcial, a la posición restante se le sigue asignando el mismo número mágico con el que empezó.

Ahora sí que me frustra... Si pudiera modificar el número mágico, sería demasiado fácil... Tiene que haber una forma lógica de cerrar parcialmente una posición UNA VEZ - y hacerlo múltiples veces a cualquier precio predefinido especificado dentro de OrderClose() - ¡Necesita haber una actualización que nos permita modificar el MagicNumber()!
 

No estás pensando con lógica en absoluto.

1. ¿En qué te ayudaría modificar el número mágico más que conocer el OrderOpenTime()? Es exactamente lo mismo que un identificador de esa orden.

2. ¿Por qué lo conviertes a formato día/hora/minutos con timetostr? OrderOpenTime() ya está en el formato timestamp que tiene este aspecto: 1375356521 representa la hora exacta al segundo en que se abrió la orden.

Si pudieras cambiar el número mágico, compararías el número mágico de la orden para asegurarte de que no tiene el número mágico que significa que ya estaba parcialmente cerrada, ¿verdad?

Si pudieras hacer eso, ¿por qué no puedes comparar el OrderOpenTime de la orden con el timestamp que sabes que significa que es una que ya estaba parcialmente cerrada?

static datetime alreadypartclosed;

si la orden de cierre parcial es exitosa

alreadypartclosed = OrderOpenTime();

cuando la orden cumple los criterios para el cierre parcial

if(OrderOpenTime() != alreadypartclosed )

Si está gestionando varias órdenes abiertas al mismo tiempo, utilice un array[] para mantener cada marca de tiempo de las órdenes cerradas parcialmente.

Razón de la queja: