Cierre de medios lotes. - página 8

 
DomGilberto:

Esto se está imprimiendo en el Diario durante mi bucle for, donde, en el caso de una orden pendiente de Buy Stop, si el 60 EMA es > que el OrderStopLoss, se cerrará la orden pendiente, abrirá una nueva con nuevo SL (que está detrás de la 60EMA), ajustar la toma de beneficios para entretener a la recompensa de 1:2, y cambiar los lotes en relación con la parada en puntos y mi perfil de riesgo (digamos 2%).

Así que cuando se hace todo esto, el "Lotes actuales" que es "LotSize" variable personalizada dentro de OrderSend funciona, es el envío de un tamaño de lote que no es correcto para el servidor para recibir? "0.18215"? ¿Podría ser un problema, a pesar de que las órdenes se envían de todos modos - esta pregunta es más en relación con "podría ser la razón por la que no puedo llamar "OrderType==OP_BUY"?

Deberías arreglar eso, validar el tamaño del lote de la misma manera que ya tienes... incluso podrías codificar una función separada para hacerlo basada en el código que ya tienes... por ejemplo:

double ValidateLots(double PositionSize)
   {
   double LotStep, MinLot;

   LotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
   MinLot  = MarketInfo(Symbol(), MODE_MINLOT);
   
   return( MathFloor(PositionSize / LotStep) * LotStep);
   }


En lugar de utilizar LotSize en su OrderSend() usaría ValidateLots(LotSize)

Aunque dudo que esto esté causando su problema. . .

 
Sí, acabo de jugar con ello. Parece que la orden simplemente se envía a través de como el servidor sólo permite 0,00 (2 decimales) de todos modos. Así que los dígitos restantes son casi irrelevantes.

¡Argh! Es tan frustrante lol - atascado en esto por mucho tiempo ahora :(

No puedo ver por qué esto es un problema y no puedo seleccionar un "OP_BUY"... Sé que probablemente he agotado este tema, pero cualquier última puñalada en la oscuridad sería muy apreciada - ¡gracias por ayudarme también!
if (direction==0){ <<<//--Buy--// This gets called upon if all the set-up is apparent.
      
      double bsl=buy_stop_price;
      double btp=buy_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_bsl/pips))/10; //--// (in process of changing at the moment)
      
      if(OpenOrdersThisPair(Symbol())==0)  //--//<--- No order open = then open one...
      {
      int BuyTicketOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); //--//<-- This is the first Order to be placed.
      }
      
         if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips) //--//<<-- This will 99% of the time be true and the order above will be cancelled and looped in the "for" until the order is triggered.
         {
         
               for(int b=OrdersTotal()-1; b >=0; b--) 
                  {
    
                     if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)==true)
                     {
                     Print(" Stop loss value for the order is ", OrderStopLoss());
                     }
    
                     else if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)==false)
                     {
                     Print(" OrderSelect failed error code is ",GetLastError());
                     }
                     if(OrderMagicNumber()==MagicNumber)
                        if(OrderSymbol()==Symbol())
                           if(OrderType()==OP_BUYSTOP)
                              if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips)
                                //if(OpenOrdersThisPair(Symbol())==1)
                                 { 
                                 DeleteOrder = OrderDelete(OrderTicket());
                                 if(DeleteOrder!=TRUE)Print("Buy Delete Order Last Error = ", GetLastError());
                                 }
                                  
                                 if(OpenOrdersThisPair(Symbol())==0)//<<-- If there are no open orders = place a new order.
                                  { 
                                  int NewBuyOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); 
                                  if(NewBuyOrder == -1)Print("New Buy Order Last Error = ", GetLastError());
                                  if(NewBuyOrder > 0)Print("NEW BUY ORDER:- Lots to open: ", DoubleToStr(LotSize, Digits), " Entry Price: ", DoubleToStr(buyPrice, Digits), 
                                  " Buy Stop Loss: ", DoubleToStr(bsl, Digits), " Buy Take Profit: ", DoubleToStr(btp, Digits), " Magic Number is: ", DoubleToStr(MagicNumber, Digits));  
                                  } 
                  }
             } 
       }
 
DomGilberto:
Hmm - sí, acabo de jugar con él. Parece que la orden sólo se envía a través de como el servidor sólo permite 0,00 (2 decimales) de todos modos. Así que los dígitos restantes son casi irrelevantes.

¡Argh! Es tan frustrante lol - atascado en esto por mucho tiempo ya :(

No puedo ver por qué esto es un problema y no puedo seleccionar un "OP_BUY"... Sé que probablemente he agotado este tema, pero cualquier última puñalada en la oscuridad sería muy apreciada - ¡gracias por ayudarme también!

Creo que tienes que mostrar todo tu código . . .

Veo algunos problemas aquí:

      int BuyTicketOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); //--//<-- This is the first Order to be placed.
      }
       //  where are you checking the return value from the OrderSend() and reporting errors ?

         if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips)    //  where is the OrderSelect() ?
 
¿Todo el código no cabe aquí? Lo he puesto en pastebin sin embargo?

-http://pastebin.com/eaY1wKbN

Lo siento por la sintaxis - un poco más difícil de ver todo, pero no tienen MQL4? Así que lo puso bajo C ++
 
DomGilberto:
¿Todo el código no cabe aquí? Lo he puesto en pastebin sin embargo?

-http://pastebin.com/eaY1wKbN

Lo siento por la sintaxis - un poco más difícil de ver todo, pero no tienen MQL4? Así que lo puso bajo C ++

No hay problema...

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+

   if(OrderSelect(OrderTicket(),SELECT_BY_TICKET,MODE_TRADES)==true && OpenOrdersThisPair(Symbol())==1 && OrderType()==OP_BUY)
     {

. . . ¿qué orden está ya seleccionada? ¿era la orden pendiente? su OrderSelect() fallará si su OrderTicket() falla a menos que ya tenga una orden seleccionada. ¿Realmente necesita este código? más adelante tiene un bucle donde selecciona las órdenes y comprueba su símbolo y número mágico y tipo...

Esto también necesita ser arreglado...

         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())

               Print("Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));

         if(OrderType()==OP_BUY && Bid>=FirstTarget_Buy+(Point/2)) // Doesn't seem to even go further than this as I do not get an error from OrderClose?
           {
            Print("Bid >= FirstTarget_Buy - Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
            bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,3,CLR_NONE);
            if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
           }

. . . añadir algunos corchetes . . .

         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {
               Print("Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));

               if(OrderType()==OP_BUY && Bid>=FirstTarget_Buy+(Point/2)) // Doesn't seem to even go further than this as I do not get an error from OrderClose?
                 {
                 Print("Bid >= FirstTarget_Buy - Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
                 bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,3,CLR_NONE);
                 if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
                 }
              }
 

Ok - He puesto más impresiones para tener un poco de claridad sobre lo que se está haciendo y qué punto. Lo he pegado abajo.

La línea donde dice "Orden Seleccionar para el cierre:-..." que es lo que se está seleccionando en el punto "Cerrar OP_BUY Medio Lotes @ 1:1 Función" que ha preguntado anteriormente. Parece que el número de entrada es diferente en este punto de la selección? Había eliminado la parte "...&& OrderType()==OP_BUY", ya que parece imprimir el resto cuando esta parte no está en la declaración "if"... ¿Esto da un poco más de claridad?

"Primera orden de compra colocada:-" es la primera función OrderSend que pasa al principio
"Checking Buy Order:-" Es la que está dentro del bucle for para eliminar y reabrir la orden pendiente si la MA es > el OrderStopLoss().
"NEW BUY ORDER:-" Es la nueva orden que se coloca dentro de ese bucle for.
"Order Select for closing:-..." - como ya se ha mencionado, es la parte que se está seleccionando para cerrar la mitad de los lotes.

Lo siento si eso fue confuso, ya que acabo de añadir estas partes en - usted no verá esto dentro de ese enlace pastebin arriba ... sólo simples funciones de impresión :)

2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Current Bid: 1.35972 FirstTarget_Buy: 1.37931
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: FirstTarget_Buy: 1.37931 // This is the price where half the lots will close.
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Order Lots Open = 0.18
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Order Ticker Number = 9
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: The Lots to close is: 0.09000
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: The Lotstep is: 0.01000
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: The minimum lots are: 0.01000
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Order Select for closing:- Lots open: 0.18 Entry Price: 1.3679 Buy Stop Loss: 1.3565 Buy Take Profit: 1.3907 Magic Number is: 1234 Order Ticket Number: 9
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: NEW BUY ORDER:- Lots to open: 0.18215 Entry Price: 1.36790 Buy Stop Loss: 1.35649 Buy Take Profit: 1.39072 Magic Number is: 1234.00000 Order Ticket Number: 8
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: open #9 buy stop 0.18 EURUSD at 1.36790 sl: 1.35649 tp: 1.39072 ok
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: delete #8 buy stop 0.18 EURUSD at 1.36790 sl: 1.35649 tp: 1.39072 ok
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Checking Buy Order:- Lots to open: 0.18 Entry Price: 1.3679 Buy Stop Loss: 1.3565 Buy Take Profit: 1.3907 Magic Number is: 1234 Order Ticket Number: 8
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: First Buy Order placed:- Lots to open: 0.18215 Entry Price: 1.36790 Buy Stop Loss: 1.35649 Buy Take Profit: 1.39072 Magic Number is: 1234.00000 Order Ticket Number: 7
 
DomGilberto:

Ok - He puesto más impresiones para tener un poco de claridad sobre lo que se está haciendo y qué punto. Lo he pegado abajo.

La línea donde dice "Orden Seleccionar para el cierre:-..." que es lo que se está seleccionando en el punto "Cerrar OP_BUY Medio Lotes @ 1:1 Función" que ha preguntado anteriormente. Parece que el número de entrada es diferente en este punto de la selección? Había eliminado la parte "...&& OrderType()==OP_BUY", ya que parece imprimir el resto cuando esta parte no está en la declaración "if"... ¿Esto da un poco más de claridad?

"Primera orden de compra colocada:-" es la primera función OrderSend que pasa al principio
"Checking Buy Order:-" Es la que está dentro del bucle for para eliminar y reabrir la orden pendiente si la MA es > el OrderStopLoss().
"NEW BUY ORDER:-" Es la nueva orden que se coloca dentro de ese bucle for.
"Order Select for closing:-..." - como ya se ha mencionado, es la parte que se está seleccionando para cerrar la mitad de los lotes.

Lo siento si eso fue confuso, ya que acabo de añadir estas partes en - usted no verá esto dentro de ese enlace pastebin arriba ... sólo simples funciones de impresión :)


Pruebe el adjunto ... es mi mejor suposición de lo que está tratando de hacer ...
Archivos adjuntos:
dom.mq4  24 kb
 

Ah, impresionante, gracias. Es un gran paso en la dirección correcta. Creo que porque está dentro de un bucle for, quiere cerrar la mitad y la mitad @ el precio... ¿En lugar de hacerlo sólo una vez? No sólo eso, sino que parece no cerrar la mitad tan pronto como el precio >= al precio de salida que quiero, en su lugar va más allá, y luego cuando el precio oscila de nuevo más bajo en el precio de salida que quiero, se cierra entonces - extraño... ¡Aprecio su paciencia en ayudarme! ¡Muy agradecido por su tiempo!


ACTUALIZACIÓN: También, acabo de descubrir, que si cambio las propiedades del experto (extern int) antes de ejecutar el probador de la estrategia, entonces el cierre de la mitad no funciona en absoluto - las cosas que afectan al cierre de la mitad es "MA_PadAmount" esto es cuántos puntos quiero añadir como una almohadilla a la pérdida de la parada que se arrastra en pips, y "OrderPrice_PadAmount" que me permite especificar cuántos pips puedo poner como una almohadilla en el precio de entrada de las órdenes ...

 
DomGilberto:
Ah, impresionante, gracias. Es un gran paso en la dirección correcta. Creo que porque está dentro de un bucle for, quiere cerrar la mitad y la mitad @ el precio... ¿En lugar de hacerlo sólo una vez? No sólo eso, sino que parece no cerrar la mitad tan pronto como el precio >= al precio de salida que quiero, en su lugar va más allá, y luego cuando el precio oscila de nuevo más bajo en el precio de salida que quiero, se cierra entonces - extraño... ¡Aprecio su paciencia en ayudarme! ¡Muy agradecido por su tiempo!
No es el bucle for, es que no tiene forma de saber que la mitad ya se ha cerrado... ¿cómo piensas manejar eso?
 
Sí, me acabo de dar cuenta cuando he quitado el bucle for. ¿Estoy en lo cierto al decir que si rastreo el número de OrderTicket desde que se selecciona por primera vez, una vez que el OrderClose ha hecho lo suyo y devuelve true, entonces podría verificar esto con el número de OrderTicket ya que serán diferentes - rompiendo así el bucle y esperar hasta que llegue otro nuevo pedido?

No estoy del todo seguro de cómo escribir eso, pero ¿es más o menos en las líneas correctas?
Razón de la queja: