Problemas na verificação de comércio aberto - página 6

 

Eu nunca tentei isso, mas não acho que seja 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

Eu acho que você precisa fazer isso . .

((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

a razão pela qual eu acho que isso é . . . o que isso equivale a ? (OP_BUYSTOP||OP_SELLSTOP) Poderia funcionar se as variáveis fossem bool. . . mas não acho que possa funcionar com int.

Uma pequena coisa, você não precisa do OderSelect antes da OrderDelete. Em geral, você só precisa do OrderSelect quando você usa uma função OrderSelect que não usa int ticket. ex. OrderComment( ), OrderComission( ), etc.

 
Ok, obrigado Raptor, acabei de atualizar o código no meu posto. Acabei de lembrar como vocês mencionaram que não era bom usar barras para um contador, então eu o mudei para usar o tempo de barras. Vou consertar a lógica e ver se ela funciona.
 

Ok, eu consertei a lógica. Mas isso não elimina as ordens ainda.


Como mencionei antes, mudei o contador de barras para o tempo.


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, obrigado Raptor, acabei de atualizar o código em meu correio. Acabei de lembrar como vocês mencionaram que não era bom usar barras para um contador, então eu o troquei para usar o tempo de barra. Vou consertar a lógica e ver se ela funciona.
"As barras não são confiáveis (uma vez que você atinja o máximo de barras no gráfico, não mudará e as quebras de código.) Volume[0]==1 não é confiável, se você perder uma marca de quebra de código. Use sempre o tempo".

é verdade, mas você precisa olhar para o contexto de quando este comentário foi feito ... As barras não são confiáveis . .

int Bars 

Number of bars in the current chart

mas isso não significa que você não possa usar números de barra em vez de número de horas. Por exemplo, como seu código se comportará na sexta-feira à noite e no domingo ? o pendinglimit equivale a 4 horas ou 4 barras ?

Também o que acontece com isto se uma troca for colocada às 22:00 ? 22 + 4 = 26 ?

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

Muito bem, vejo aí o problema com a estratégia do tempo. Mas se usarmos barras como um contador quando o gráfico atingir o máximo de barras, ele também falhará lá, certo?

Voltarei a ele e verei o que posso fazer...

 

Ok, que tal esta abordagem


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:

Muito bem, vejo aí o problema com a estratégia do tempo. Mas se usarmos barras como um contador quando o gráfico atingir o máximo de barras, ele também falhará lá, certo?


Não, a barra H1 atual é sempre barra 0 . em 60 minutos a barra H1 atual será barra 0 .a questão das barras é se você usar barras, ou seja, o número total de barras em seu gráfico, ou se você estiver olhando para as barras à extrema esquerda de seu gráfico.

O número da barra para TimeHour(TimeCurrent () é 0, você pode obter o número da barra para o tempo em que sua profissão foi colocada (você precisa calcular isto não armazená-la ! ! ! !) usando iBarShift , então faça algo assim ..

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

OK Terceira vez com sorte, levei um tempo para descobrir o que você estava tentando dizer ali. Então, eis o que fiz. Mas as ordens ainda não são apagadas >:(


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
               }
        }
     }
 
Sim, apenas lendo sobre seu comentário novamente e o que eu fiz está errado,
tradeopened = TimeCurrent()
não me dará o tempo de abertura do bar, eu teria que usar o Tempo[0]?
 

Tente isto ;-)

OrderDelete(OrderTicket( ) );                    // Delete it