Cierre de medios lotes. - página 18

 


Ok (ACTUALIZACIÓN!) así que básicamente, me he librado del cierre continuo de "la mitad de la mitad de la mitad, etc." en los lotes cuando se llama a la segunda OrderClose() (donde está la declaración if toda azul - aparentemente esto funciona bien!) - SIN EMBARGO, no quiero que esto sea llamado en absoluto a menos que la función FIRST OrderClose() sea "True" y haya tenido éxito. "Close_Half_Order_Buy==True" tampoco funciona...

Me encantaría la ayuda de alguien para terminar esto :)

( He quitado muchos de los "Prints", en aras de la claridad en la carne del código).

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+
void CloseHalfOrder()
{   
   
   static datetime partclosedonce;
   static datetime partclosedtwice; 
   
   double minLot=MarketInfo(Symbol(),MODE_MINLOT);

   double lotStep=MarketInfo(Symbol(),MODE_LOTSTEP);

   double half=MathFloor(OrderLots()/2/lotStep)*lotStep;
   
   double EMA_Bar = iClose(NULL, PERIOD_H1, 1);
   double EMA_MA = iMA(Symbol(),60,21,0,1,0,0);

   
for(int c=OrdersTotal()-1; c>=0; c--)
      {
      if(OrderSelect(c,SELECT_BY_POS,MODE_TRADES)==true)

      double FirstTarget_Buy = OrderOpenPrice()+(( OrderTakeProfit()-OrderOpenPrice())/2);
      	Print("FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
      
      if(OrderMagicNumber()==MagicNumber)
         if(OrderSymbol()==Symbol())
            if(OrderLots()>minLot)
               if(OrderOpenTime() != partclosedonce)
            {
            
            if(OrderType()==OP_BUY && Bid >= FirstTarget_Buy+(Point/2)) 
               {
               bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,5,Blue);
               if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
               }
            }
         
      if(Close_Half_Order_Buy==True && OrderOpenPrice() > OrderStopLoss())
         {
         MoveToBreakEven(); 
         }
          if(Close_Half_Order_Buy==True)
               {
               partclosedonce = OrderOpenTime();
               } 
      
      if(partclosedonce != partclosedtwice && OrderOpenTime() != partclosedtwice) // I dont want this to run UNLESS the first OrderClose() is successful.
         {
          if(OrderType()==OP_BUY && EMA_Bar < EMA_MA)
               {
               bool EMA_Buy_Close=OrderClose(OrderTicket(),half,Bid,5,CLR_NONE);
               if(EMA_Buy_Close!=TRUE)Print("EMA_Buy_Close Last Error = ",GetLastError());
               if(EMA_Buy_Close==True)partclosedtwice = OrderOpenTime();
               }     
          }        
     }
}


	          
 
¿Alguien?
 
DomGilberto:


Ok (¡ACTUALIZACIÓN!) así que básicamente, me he librado del cierre continuo de "la mitad de la mitad de la mitad, etc." en los lotes cuando se llama a la segunda OrderClose() (donde está la declaración if toda azul - ¡aparentemente esto funciona bien!) - SIN EMBARGO, no quiero que esto sea llamado en absoluto a menos que la función FIRST OrderClose() sea "True" y haya tenido éxito. "Close_Half_Order_Buy==True" tampoco funciona...

Me encantaría la ayuda de alguien para terminar esto :)

El siguiente código compila (declarando la variable MagicNumber y comentando la función MoveToBreakEven()) pero no era probado.

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+
void CloseHalfOrder() {
   static bool FirstBuyTarget_hit = false, SecondBuyTarget_hit = false;
   int ct = 0;
   double minLot = MarketInfo(Symbol(),MODE_MINLOT);
   double lotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
   double EMA_Bar = iClose(NULL, PERIOD_H1, 1);
   double EMA_MA = iMA(Symbol(),60,21,0,1,0,0);
        
   for(int c = OrdersTotal() - 1; c >= 0; c--)
      if (OrderSelect(c,SELECT_BY_POS))
         if (OrderSymbol() == Symbol() && OrderType() <= OP_SELL)
            if (OrderMagicNumber() == MagicNumber) {
               double half=MathFloor(OrderLots()/2/lotStep)*lotStep;
               double FirstTarget_Buy = OrderOpenPrice() + ((OrderTakeProfit() - OrderOpenPrice()) / 2);
               Print ("FirstTarget_Buy: ", DoubleToStr(FirstTarget_Buy,Digits));
                                        
               ct++;
                                        
               if (!FirstBuyTarget_hit)
                  if (OrderType() == OP_BUY && Bid >= FirstTarget_Buy + (Point/2)) {
                     if (OrderClose(OrderTicket(),half,Bid,5,Blue)) {
                        MoveToBreakEven();
                        FirstBuyTarget_hit = true;
                        break;
                     }
                     else
                        Print("Close_Half_Order_Buy Last Error = ", GetLastError());
                  }
                                        
               if (FirstBuyTarget_hit && !SecondBuyTarget_hit) 
                  if (OrderType() == OP_BUY && EMA_Bar < EMA_MA) {
                     if (OrderClose(OrderTicket(),half,Bid,5,CLR_NONE))
                        SecondBuyTarget_hit = true;
                     else
                        Print("EMA_Buy_Close Last Error = ",GetLastError());                    
                  }

               break;
            }
   if (ct == 0) {
      FirstBuyTarget_hit = false;
      SecondBuyTarget_hit = false;
   }
}

El código anterior asume que sólo se coloca una orden por par de divisas.

 

Omg ¡muchas gracias por tu ayuda! Realmente lo aprecio :)

Te importaría ayudarme con una última cosa; en este momento tengo un objetivo de toma de beneficios FIJO 1:2 (TP duro). En realidad quiero eliminar esto de la orden. Sin embargo, como se puede ver arriba, las funciones pertinentes de OrderClose() están utilizando el OrderTakeProfit() para calcular dónde deben cerrar las funciones de OrderClose().

Mi pregunta es, ¿hay alguna forma de almacenar el precio de OrderTakeProfit(), pero en lugar de tenerlo fijo en la orden, quiero cerrar una cantidad determinada de lotes usando OrderClose() @ el precio de OrderTakeProfit()? La razón es que a veces tengo una operación que se ejecuta para grandes ganancias, pero porque tengo OrderTakeProfit() fijado con la orden abierta, todos los lotes se cerrarán allí y sólo quiero cerrar parcialmente algunos lotes a ese precio de salida. Utilizo un trailing stop para los grandes corredores... Espero que tenga sentido?

¡Eso es todo! Entonces, ¡ya he terminado! ¡Por fin!

ACTUALIZACIÓN: El código de arriba es una buena manera de escribirlo. He jugado un poco, pero no se cierra en el orden correcto. Todavía sólo se cierra la mitad de lo que viene primero. Es algo parecido a lo que tenía antes usando static datetime? ¿Alguna idea?

 
(siento que he agotado este hilo)

Tengo literalmente esas 2 últimas preguntas de arriba y esto está hecho? Todo lo que necesito saber es cómo puedo almacenar el precio de OrderTakeProfit(), para que cuando lo modifique, pueda seguir usando ese precio exacto para hacer un OrderClose()? ¿Funcionará un Static Double?
 
DomGilberto:

ACTUALIZACIÓN: El código anterior es una buena forma de escribirlo. He jugado un poco, pero no se cierra en el orden correcto. Sigue cerrando la mitad de lo que viene primero. Es algo parecido a lo que tenía antes usando static datetime? ¿Alguna idea?

Publica cualquier cambio que hayas hecho en el código anterior y publica las entradas de registro/diario (o capturas de pantalla).

 
DomGilberto:

Omg ¡muchas gracias por tu ayuda! Realmente lo aprecio :)

Te importaría ayudarme con una última cosa; en este momento tengo un objetivo de toma de beneficios FIJO 1:2 (TP duro). En realidad quiero eliminar esto de la orden. Sin embargo, como se puede ver arriba, las funciones pertinentes de OrderClose() están utilizando el OrderTakeProfit() para calcular dónde deben cerrar las funciones de OrderClose().

Mi pregunta es, ¿hay alguna manera de almacenar el precio de OrderTakeProfit(), pero en lugar de tenerlo fijo en la orden, quiero cerrar una cantidad determinada de lotes usando OrderClose() @ el precio de OrderTakeProfit()? La razón es que a veces tengo una operación que se ejecuta para grandes ganancias, pero porque tengo OrderTakeProfit() fijado con la orden abierta, todos los lotes se cerrarán allí y sólo quiero cerrar parcialmente algunos lotes a ese precio de salida. Utilizo un trailing stop para los grandes corredores... Espero que tenga sentido?

¡Eso es todo! Entonces, ¡ya he terminado! ¡Por fin!

ACTUALIZACIÓN: El código de arriba es una buena manera de escribirlo. He jugado un poco, pero no se cierra en el orden correcto. Todavía sólo se cierra la mitad de lo que viene primero. Es algo parecido a lo que tenía antes usando static datetime? ¿Alguna idea?


establezca su takeprofit en un nivel enorme y todavía puede utilizar sus funciones relevantes de OrderClose() que están utilizando el OrderTakeProfit() para calcular donde lasfunciones de OrderClose() deben cerrar en. sólo hacer un cambio en el cálculo donde las funciones de OrderClose() deben cerrar en
 
deVries - literalmente, acaba de darse cuenta de eso esta mañana... Empezó a poner otra modificación... luego se dio cuenta de que debería cambiarla justo desde que se hace el primer pedido...

Trece - No he hecho ningún cambio en absoluto. Funcionó de la misma manera que el código que publiqué, pero estás usando un bool estático en lugar de un datetime estático? Esa es la única diferencia real que pude ver cuando ejecuté la prueba retrospectiva? Aparte de eso, la segunda función OrderClose() con la media móvil y el cierre por debajo de ella; ¿todavía se cierra si eso viene primero antes del otro orderclose()?
 
DomGilberto:

Trece - No he hecho ningún cambio en él en absoluto. Funciona de la misma manera que el código que he publicado, pero estás usando un bool estático en lugar de un datetime estático? Esa es la única diferencia real que pude ver cuando ejecuté la prueba retrospectiva? Aparte de eso, la segunda función OrderClose() con la media móvil y el cierre por debajo de ella; ¿todavía se cierra si eso viene primero antes del otro orderclose()?
Con tu uso del signo de interrogación, no estoy seguro de si me estás preguntando o me estás diciendo la parte resaltada. Si el probador muestra que el segundo cierre parcial ocurrió antes que el primero, por favor publique los resultados de sus operaciones del registro/diario que fueron generados por el probador de la estrategia mostrando que el segundo cierre parcial (la media móvil) ocurrió antes que el primer cierre parcial.
 
Thirteen:
Con el uso del signo de interrogación, no estoy seguro de si me estás preguntando o diciéndome la parte resaltada. Si el probador muestra que el segundo cierre parcial se produjo antes de la primera, por favor, publicar los resultados de su comercio desde el registro / diario que fueron generados por el probador de la estrategia que muestra que el segundo cierre parcial (la media móvil) se produjo antes del primer cierre parcial.

Gracias por responderme Trece - Publicaré el registro más tarde hoy :)