Problemas de comprobación del comercio abierto - página 6

 

Nunca he probado esto, pero no creo que sea válido. . .

OrderType()==(OP_BUYSTOP||OP_SELLSTOP) &&     // The order selected is either a pending buy on stop order or a buy on sell order
OrderMagicNumber()==(Mnumber1||Mnumber1))    // The orders magic number is the same as the magic number used in this ea

Creo que hay que hacer esto. . .

((OrderType()==OP_BUYSTOP)|| (OrderType()== OP_SELLSTOP)) &&     // The order selected is either a pending buy on stop order or a buy on sell order
((OrderMagicNumber()== Mnumber1) || (OrderMagicNumber()==Mnumber2))    // The orders magic number is the same as the magic number used in this ea

la razón por la que pienso esto es . . . ¿a qué equivale esto? (OP_BUYSTOP||OP_SELLSTOP) Podría funcionar si las variables fueran bool. . . pero no creo que pueda funcionar con int.

Una cosa menor, no necesitas el OderSelect antes del OrderDelete. En general, sólo necesitas OrderSelect cuando utilizas una función Order que no utiliza ticket int. Por ejemplo, OrderComment( ), OrderCommission( ), etc

 
Ok gracias Raptor, acabo de actualizar el código en mi post. Acabo de recordar que ustedes mencionaron que no era bueno usar barras para un contador, así que lo cambié para usar el tiempo de la barra. Voy a arreglar la lógica y ver si funciona.
 

Ok he reparado la lógica. Pero todavía no borra las órdenes.


Como mencioné antes cambié el contador de barras a tiempo...


extern string  sComment4                = "Max Hours allowed before pending orders are deleted";
extern int     pendinglimit        = 4;

// * EVERYTIME A TRADE GETS TRIGGERED 

bartraded = TimeHour(TimeCurrent());


   if(TimeHour(TimeCurrent()) > (bartraded + pendinglimit) && Tradeopen()==true)      // Check to see if pending orders have expired
     {
        for(int tnumber = OrdersTotal()-1; tnumber >= 0 ; tnumber--)                  //scan through open orders
        {
          if (OrderSelect(tnumber, SELECT_BY_POS) &&   
             ((OrderType()==OP_BUYSTOP)|| (OrderType()== OP_SELLSTOP)) &&               // The order selected is either a pending buy on stop order or a buy on sell order
             ((OrderMagicNumber()== Mnumber1) || (OrderMagicNumber()==Mnumber3)))       // The orders magic number is the same as the magic number used in this ea
          
               {
                OrderDelete(tnumber);                                                 // Delete it
               }
        }
     }
 

dazamate:
Ok gracias Raptor, acabo de actualizar el código en mi post. Acabo de recordar que ustedes mencionaron que no era bueno usar barras para un contador, así que lo cambié para usar la hora de la barra. Voy a arreglar la lógica y ver si funciona.
"Bares no es confiable (una vez que alcanzas el máximo de barras en el gráfico no cambiará y el código se rompe.) Volumen[0]==1 no es confiable, si pierdes un tick el código se rompe. Siempre use el tiempo".

es cierto, pero hay que ver el contexto de cuando se hizo este comentario. . . Los bares no son fiables. . .

int Bars 

Number of bars in the current chart

pero eso no significa que no puedas usar números de barra en lugar de número de horas. Por ejemplo, ¿cómo se las arreglará su código el viernes por la noche y el domingo? ¿el límite pendiente equivale a 4 horas o a 4 barras?

¿Qué pasa si se coloca una operación a las 22:00? ¿22 + 4 = 26?

if(TimeHour(TimeCurrent()) > (bartraded + pendinglimit) && Tradeopen()==true)      // Check to see if pending orders have expired
 

De acuerdo, veo el problema con la estrategia de tiempo. Pero si usamos barras como contador una vez que el gráfico llega a las barras máximas también fallará ahí, ¿no?

Voy a volver a ello y ver lo que puedo llegar a ...

 

Bien, ¿qué tal este enfoque?


extern string  sComment4                = "Max Hours allowed before pending orders are deleted";
extern int     pendinglimit        = 4;
 
// * EVERYTIME A TRADE GETS TRIGGERED* 

bartraded = 0;


  if (Time0 == Time[0]) return; Time0 = Time[0];          // make sure each bar is only scanned once
       {   
//-----------------------------------------------------------------------------------------------------------------------------------------------
//TRADE COUNTER
   

   bartraded++;  // Each time a new bar opens add 1 to the counter

//------------------------------------------------------------------------------------------------------------------------------------------------
// DELETE PENDING ORDERS THAT HAVE NOT BEEN TRIGGERED WITHIN 'pendinglimit'

   if(bartraded > pendinglimit && Tradeopen()==true)      // Check to see if pending orders have expired
     {
        for(int tnumber = OrdersTotal()-1; tnumber >= 0 ; tnumber--)                  //scan through open orders
        {
          if (OrderSelect(tnumber, SELECT_BY_POS) &&   
             ((OrderType()==OP_BUYSTOP)|| (OrderType()== OP_SELLSTOP)) &&               // The order selected is either a pending buy on stop order or a buy on sell order
             ((OrderMagicNumber()== Mnumber1) || (OrderMagicNumber()==Mnumber3)))       // The orders magic number is the same as the magic number used in this ea
          
               {
                OrderDelete(tnumber);                                                 // Delete it
               }
        }
     }
 
dazamate:

De acuerdo, veo el problema con la estrategia de tiempo. Pero si usamos barras como contador una vez que el gráfico alcanza el máximo de barras también fallará ahí, ¿no?


No, la barra H1 actual es siempre la barra 0... en 60 minutos la barra H1 actual será la barra 0...el problema de las barras es si usas Bars , es decir, el número total de barras en tu gráfico, o si estás mirando las barras del extremo izquierdo de tu gráfico.

El número de barra para TimeHour(TimeCurrent () es 0, puede obtener el número de barra para el momento en que su operación fue colocada (¡necesita calcularlo, no almacenarlo!) usando iBarShift y luego hacer algo como esto...

if (iBarShift(symbol, TF, Time_order_Placed)+1 >  pendinglimit) && Tradeopen()==true)  
 

Bien, a la tercera va la vencida, me costó un poco entender lo que querías decir. Esto es lo que he hecho. Pero los pedidos siguen sin borrarse >:(


static datetime tradeopened;


//Everytime a trade is opened I run
 tradeopened = TimeCurrent();


 if((iBarShift(hothand(),60 ,tradeopened)>pendinglimit) && Tradeopen()==true)          // Check to see if pending orders have expired
     {
        for(int tnumber = OrdersTotal()-1; tnumber >= 0 ; tnumber--)                  //scan through open orders
        {
          if (OrderSelect(tnumber, SELECT_BY_POS) &&   
             ((OrderType()==OP_BUYSTOP)|| (OrderType()== OP_SELLSTOP)) &&     // The order selected is either a pending buy on stop order or a buy on sell order
             ((OrderMagicNumber()== Mnumber1) || (OrderMagicNumber()==Mnumber3)))     // The orders magic number is the same as the magic number used in this ea
          
               {
                OrderDelete(tnumber);                                                 // Delete it
               }
        }
     }
 
Sí, sólo leer de nuevo su comentario y lo que he hecho está mal,
tradeopened = TimeCurrent()
no me da la hora de apertura de la barra ¿tendría que usar Time[0]?
 

Prueba esto ;-)

OrderDelete(OrderTicket( ) );                    // Delete it