Cierre de medios lotes. - página 3

 
DomGilberto:

¿MathFloor redondea los decimales hacia abajo al número ENTERO más cercano?

MathFloor() hace lo que dice la documentación. . . "La función MathFloor devuelve un valor numérico que representa el mayor número entero que es menor o igual que x".

DomGilberto:


¿Tiene sentido FirstTarget como parámetro personalizado dentro de "OrderClose()" - Suponiendo que "sizeClose" fuera correcto? (ver código citado)

No. . . tienes esto:

FirstTarget = OrderTakeProfit()-OrderOpenPrice()/2+OrderOpenPrice();

// meaning this

FirstTarget = OrderTakeProfit() - ( OrderOpenPrice() / 2 ) + OrderOpenPrice();

cuando probablemente quiere decir esto. . .

FirstTarget = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 ) ;

Utilice paréntesis (y espacios) para que las cosas sean claras y sin ambigüedades.

DomGilberto:


Su código no ayudó - lo siento.

¿Por qué? ¿Está mal? ¿En qué sentido?

DomGilberto:


¿Se pueden imprimir variables personalizadas? Si es así, debo estar haciéndolo mal ya que no aparece en el diario.

Sí, puedes imprimir cualquier variable. ¿Qué está haciendo? Muestre su código.

 
 if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_BUYSTOP)
   {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES); 
      
      double Lots=OrderLots(); 
      
      double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT),
                lotStep = MarketInfo(Symbol(), MODE_LOTSTEP),
                half    = MathFloor(Lots/2/lotStep)*lotStep;
                
                if (half < minLot) half = Lots;
         
         half=Lots/2; 
         OrderClose(OrderTicket(),half,FirstTarget_Buy,3,DarkViolet);
         }
   } 
     
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
   if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_SELLSTOP)
    {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES);
      
      double FirstTarget_Sell = OrderOpenPrice() - ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
       
       if (half < minLot) half = Lots;
       half=Lots/2;
       OrderClose(OrderTicket(),half,FirstTarget_Sell,3,DarkViolet); 
       }
    } 


Con respecto a la impresión de variables personalizadas, ¿cómo podría hacer esto para "FirstTarget_Buy"?

Voy a pasar tiempo revisando todo mi código e imprimiendo mucho - entiendo cómo hacerlo con bools e ints (el entero -1 falla y el bool es una declaración verdadera o falsa - fácil.) pero no entiendo cómo hacerlo cuando se asignan funciones a una variable personalizada?

¡Gracias por arrojar luz sobre la fórmula "FirsTarget" de arriba! Lo siento, quería decir que su código no ayudó en el sentido de que no estoy entendiendo cómo poner la fórmula juntos ... Lo encuentro realmente contra intuitivo - Habría pensado que llamar a "OrderSelect" le permitiría simplemente ver cuál era el tamaño del lote en ese tickorder... y luego simplemente dividirlo...

¡Lo siento por venir como un completo idiota!

 
DomGilberto:

Siento haber quedado como un completo imbécil.

En absoluto, sólo tienes que encontrar tu punto ciego e iluminarlo, una vez que lo hayas hecho te preguntarás por qué te resultaba tan difícil, todo es fácil cuando sabes cómo.

DomGilberto:

Con respecto a la impresión de variables personalizadas, ¿cómo podría hacer esto para "FirstTarget_Buy"?

Voy a pasar tiempo revisando todo mi código e imprimiendo un montón - entiendo cómo hacerlo con bools e ints (el entero -1 falla y el bool es una declaración verdadera o falsa - fácil.) pero no entiendo cómo hacerlo cuando se asignan funciones a una variable personalizada?

Como esto . . . también tenga en cuenta el comentario sobre llaves rizadas
 if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_BUYSTOP)
   {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES); 
      
      double Lots=OrderLots(); 
      
      double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );

      Print("FirstTarget_Buy: ", DoubleToStr(FirstTarget_Buy, Digits) );   // prints FirstTarget_Buy with the same number of digits as the current symbol
         {                                                                                        // why this brace ?   
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT),
                lotStep = MarketInfo(Symbol(), MODE_LOTSTEP),
                half    = MathFloor(Lots/2/lotStep)*lotStep;
                
                if (half < minLot) half = Lots;
         
         half=Lots/2; 
         OrderClose(OrderTicket(),half,FirstTarget_Buy,3,DarkViolet);
         }                                                               // why this brace ?  
   } 

DomGilberto:

Me refería a que tu código no ayudó en el sentido de que no estoy entendiendo cómo armar la fórmula... Lo encuentro realmente contra intuitivo - Habría pensado que llamar a "OrderSelect" le permitiría simplemente ver cuál era el tamaño del lote en ese tickorder... y luego simplemente dividirlo...

Usted puede simplemente OrderSelect la orden, el uso OrderLots() y dividir por dos ... usted puede hacer eso, y en muchas situaciones que va a funcionar. Yo escribo código para todos los casos que puedo prever para no tener que arreglarlo continuamente cuando se rompe. . .

Si el tamaño de su posición es de 2.0 lotes; esto dividido por dos es 1.0 lotes y esto funcionará. . .

Si su tamaño de posición es de 0.3 lotes; esto dividido por dos es 0.15 lotes y esto será un tamaño de posición inválido si MODE_LOTSTEP es 0.1 . . . puede usar 0.1 o 0.2 NO 0.15 así que necesita codificar esta comprobación y ajuste.


Lo que tienes aquí no funcionará en todos los casos. . .

double Lots = OrderLots(); 
      

         
         half = Lots / 2; 
 

¡Ahhhh! Acabo de pasar los últimos 15-20 minutos revisando las impresiones por todos lados - estoy empezando a entender en qué me estoy equivocando. Básicamente estoy seleccionando el pedido PENDIENTE... SIN EMBARGO, como es una orden pendiente, en el momento en que la selecciono, hay una alta probabilidad de que los OrderLots, el stop y los objetivos hayan cambiado, por lo que tendré que ponerla en un bucle para que esté sincronizada con la forma en que mis órdenes pendientes se calculan constantemente antes de que se activen.

Ese maldito doubletostr :P - ¡Apuntado RaptorUK! Ahora veo que se calcula correctamente, gracias a tu ajuste :)

Creo que ahora sé cómo hacer la mayor parte de ella - Sólo por curiosidad, lo que "si" declaración funcionaría para llamar sólo la orden que se ha disparado. Por el momento, lo tengo llamando a cuando tengo una orden de mercado abierta, pero estoy tratando de averiguar cómo llamar a cuando la orden pendiente se ha disparado?

El código de abajo y la correspondiente declaración "if" sólo parece llamar a las órdenes pendientes abiertas. ¿Sólo quiero una manera de "ir a" una función personalizada específica (void por ejemplo) sobre la base de que una orden se ha disparado? (¡si es que tiene sentido!)

Gracias por aclararme tanto :)

int OpenOrdersThisPair(string pair)
{
   int total=0;
      for(int i=OrdersTotal()-1; i >= 0; i--)
         {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()==pair) total++;
         }
         return (total);
}         

if(OpenOrdersThisPair(Symbol())>0)
 
DomGilberto:

¡Ahhhh! Acabo de pasar los últimos 15-20 minutos limpiando las huellas por todas partes, y empiezo a entender en qué me estoy equivocando.

Es fácil cuando se sabe cómo

DomGilberto:


Creo que sé cómo hacer la mayor parte de ella ahora - Sólo por curiosidad, lo que "si" declaración funcionaría para llamar sólo la orden que se ha disparado. Por el momento, lo tengo llamando a cuando tengo una orden de mercado abierta, pero estoy tratando de averiguar cómo llamar a cuando la orden pendiente se ha disparado?

Cuando una Orden Pendiente se ha disparado se convertirá en una OP_BUY u OP_SELL, así que...

if(OrderType() == OP_BUY || OrderType() == OP_SELL)
   { 
   
   }

Un consejo, utilice más espacios . . . cuando usted consigue un error de división por cero y quiere encontrar donde está sucediendo es fácil de buscar el espacio / espacio y sólo encontrar sus divisiones en lugar de todos sus comentarios . . . así que uso espacios alrededor de = + - / % etc.

 
Ah, por supuesto (¡palma de la cara!)

Buen consejo, lo haré. Gracias por tu ayuda :) Si lo consigo, te informaré de ello.
 
Ok, ¡he vuelto! ... Sin embargo, no son tan buenas noticias: he intentado y probado múltiples variaciones de código sin suerte. Aquí es donde estoy en este momento.

No obtengo ninguna información sobre las impresiones. No aparece absolutamente nada en el Diario. Supongo que esto se debe a que no se está seleccionando nada en cuanto al tipo de pedido desde la primera declaración "if". Por lo que puedo ver aquí en el código, habría pensado que no estoy muy lejos, al menos...?
if(OrderType() == OP_BUY ){
   
      for( int c=OrdersTotal()-1; c >=0; c-- )
      {
         if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
            Print("Order Ticker Number = ",OrderTicket());
            Print("Order Lots Open = ", OrderLots());
            } 
         else if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==false){
            Print("Order Select returned the error of ", GetLastError());
            }
            if(OrderMagicNumber()==MagicNumber)
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)
                  if(OpenOrdersThisPair(Symbol())==1) 
                    //if( Bid == FirstTarget_Buy)            
         
         
         double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
            Print("FirstTarget_Buy: ", DoubleToStr( FirstTarget_Buy, Digits ));
            }
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT);{
                Print("The minimum lots are: ", DoubleToStr( minLot, Digits ));
                }
                        
         double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);{
                Print("The Lotstep is: ", DoubleToStr( lotStep, Digits ));
                }
                
         double half    = MathCeil(OrderLots()/2/lotStep)*lotStep;{
                Print("The Lots to close is: ", DoubleToStr( half, Digits ));
                }

                bool Close_Half_Order = OrderClose(OrderTicket(),half,FirstTarget_Buy,3,CLR_NONE);
            if(Close_Half_Order!=TRUE)Print("Close_Half_Order Last Error = ", GetLastError());
      } 
   }
 
DomGilberto:
Bien, ya he vuelto. ... Sin embargo, no son tan buenas noticias: he intentado y probado múltiples variaciones de código sin suerte. Aquí es donde estoy en este momento.

No obtengo ninguna información sobre las impresiones. No aparece absolutamente nada en el Diario. Supongo que esto se debe a que no se está seleccionando nada en cuanto al tipo de pedido desde la primera declaración "if". Por lo que puedo ver aquí en el código, habría pensado que no estoy muy lejos, al menos...?

¿Cómo está seleccionando la Orden antes de hacer esto?

if(OrderType() == OP_BUY ){

Todavía tienes problemas aquí

      for( int c=OrdersTotal()-1; c >=0; c-- )
      {
         if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
            Print("Order Ticker Number = ",OrderTicket());
            Print("Order Lots Open = ", OrderLots());
            } 
         else if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==false){
            Print("Order Select returned the error of ", GetLastError());  //  OrderSelect has failed,  why do you continue . . . 
            }
            if(OrderMagicNumber()==MagicNumber)                            //  . . . to this line ?
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)
                  if(OpenOrdersThisPair(Symbol())==1) 
                    //if( Bid == FirstTarget_Buy) 
 

¿Por qué no...?

for( int c = OrdersTotal()-1; c >= 0; c-- )
   {
   if( OrderSelect(c, SELECT_BY_TICKET, MODE_TRADES) )
      {
      Print("Order Ticker Number = ",OrderTicket());
      Print("Order Lots Open = ", OrderLots());
      } 
   else 
      {
      Print("Order Select returned the error of ", GetLastError()); 
      continue;                                                        // try next order position in the loop
      }
   if(OrderMagicNumber() == MagicNumber)    
      if(OrderSymbol() == Symbol())
         if(OrderType() == OP_BUY)
            if(OpenOrdersThisPair(Symbol()) == 1) 
 
No puedo creer que esté cometiendo estos errores de novato... ¡Me molesta! Sí, ya lo tengo imprimiendo y seleccionando la orden. Este es el código que está trabajando en términos de la impresión - los lotes todavía no se están cerrando a cabo sin embargo? También he pegado los mensajes del diario a continuación.
  if(OrderSelect(OrdersTotal(),SELECT_BY_TICKET,MODE_TRADES)==true && OpenOrdersThisPair(Symbol())==1){
         
         double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
           Print("FirstTarget_Buy: ", DoubleToStr( FirstTarget_Buy, Digits ));
         }
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT);{
                Print("The minimum lots are: ", DoubleToStr( minLot, Digits ));
                }
                        
         double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);{
                Print("The Lotstep is: ", DoubleToStr( lotStep, Digits ));
                }
                
         double half    = MathCeil(OrderLots()/2/lotStep)*lotStep;{
                Print("The Lots to close is: ", DoubleToStr( half, Digits ));
                }
      for( int c=OrdersTotal()-1; c >=0; c-- )
      {
         if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
            Print("Order Ticker Number = ",OrderTicket());
            Print("Order Lots Open = ", OrderLots());
            } 
         else{
           Print("Order Select returned the error of ", GetLastError()); // Order Select does not seem to want to work?
            continue;
            }
            if(OrderMagicNumber()==MagicNumber)
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)
                  if(OpenOrdersThisPair(Symbol())==1) 

                bool Close_Half_Order = OrderClose(OrderTicket(),half,FirstTarget_Buy,3,CLR_NONE);
            if(Close_Half_Order!=TRUE)Print("Close_Half_Order Last Error = ", GetLastError());
      } 
   }
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: Order Select returned the error of 0    // Not sure what is going on here?		
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The Lots to close is: 0.09000           // This is the right calculation based 
                                                                                                                      // upon the total lots opened on a pending order - to half.
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The Lotstep is: 0.01000
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The minimum lots are: 0.01000
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: FirstTarget_Buy: 1.37931                // This price is also correct.


Razón de la queja: