Ea está criando várias ordens pendentes/limitadas [Help pls] - página 3

 
GumRai:

Nós não sabemos o que você está tentando fazer

Se você quiser apenas uma negociação aberta de cada vez, verifique se não há nenhuma ordem aberta antes de enviar uma nova.

Se você quiser apenas uma negociação por barra, teste apenas uma vez por barra.

Se você quiser uma combinação de condições, teste a combinação.

Eu explico aqui:

Tenho no máximo 6 apoios e 6 resistências para cada hora. Pode ser 2 suportes & 2 resistências ou qualquer coisa, exceto 6 suportes & 6 resistências no máximo para cada hora.

Quero abrir um pedido limite para os níveis de S/R no início de cada hora.

Criei uma função de compra e outra de venda... para não precisar anotar o mesmo código de compra/venda para um total de 12 níveis de S/R.

Agora. quando usei este seguinte código:

int SellCall(double SC)
{
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,TimeCurrent()+3540,Red);

   return(0);
}

Ele cria várias ordens iguais:

Eu tambémusei o códigoWHRoeder. Em uma função separada. Como eu não posso declarar função dentro de uma função.

 

Seu problema não é a função que você postou, seu problema está no código que chama a função.

Obviamente, não há verificação para ver se os pedidos já foram feitos

 
GumRai:

Seu problema não é a função que você postou, seu problema está no código que chama a função.

Obviamente, não há verificação para ver se os pedidos já foram feitos

código para função de chamada (snapshot)

 if(FS == 1 || FS == 5 || FS == 7)
   {
     if( P1 == 1 || P1 ==5 || P1 ==7)
      {
      
      BuyCall(S0);
      }    
     if( P2 == 1 || P2 ==5 || P2 ==7)
      {
      
      BuyCall(S1);
      }  
     if( P3 == 1 || P3 ==5 || P3 ==7)
      {
  
      BuyCall(S2);
      }  
     if( P4 == 1 || P4 ==5 || P4 ==7)
      {
      
      BuyCall(S3);
      }      
          
     if( P5 == 1 || P5 ==5 || P5 ==7)
      {
     
      BuyCall(S4);
      }      
     if( P6 == 1 || P6 ==5 || P6 ==7)
      {
     
      BuyCall(S5);
      }  
     if( P7 == 1 || P7 ==5 || P7 ==7)
      {
      
      SellCall(R0);
      } 
     
      if( P8 == 1 || P8==5 || P8 ==7)
      {
    
      SellCall(R1);
      }  
      
     if( P9 == 1 || P9==5 || P9 ==7)
      {
      
      SellCall(R2);
      }          
          
    if( P10 == 1 || P10==5 || P10 ==7)
      {
     
      SellCall(R3);
      }   
    if( P11 == 1 || P11==5 || P11 ==7)
      {
     
      SellCall(R4);
      }                       
    if( P12 == 1 || P12==5 || P12 ==7)
      {
       
      SellCall(R5);
      }            
          
    }
   

Como verificar se os pedidos já foram feitos ou não? Com condições de compra > 0?

 
cashcube:

código para função de chamada (snapshot)

Como verificar se os pedidos já foram feitos ou não? Com condições de compra > 0?

É difícil dar conselhos, pois não sei o que você está fazendo no final da hora com pedidos não acionados e como você está gerenciando os pedidos acionados.

Você poderia criar uma matriz globalmente declarada (ou 2) e armazenar os números dos bilhetes para os pedidos abertos. Antes de abrir uma nova ordem, verifique o elemento da matriz que corresponde ao nível para um valor >0.

Naturalmente, você também precisará verificar os números dos bilhetes e, se você apagar as ordens não acionadas, defina o elemento da matriz para 0. Você também pode precisar verificar se a ordem foi fechada e, dependendo de sua lógica, redefini-la para 0

 
GumRai:

É difícil dar conselhos, pois não sei o que você está fazendo no final da hora com ordens não acionadas e como você está gerenciando as ordens acionadas.

Você poderia criar uma matriz globalmente declarada (ou 2) e armazenar os números dos bilhetes para os pedidos abertos. Antes de abrir uma nova ordem, verifique o elemento da matriz que corresponde ao nível para um valor >0.

Naturalmente, você também precisará verificar os números dos bilhetes e, se você apagar as ordens não acionadas, defina o elemento da matriz para 0. Você também pode precisar verificar se a ordem foi fechada e, dependendo de sua lógica, redefini-la para 0

Como eu estabeleço níveis de expiração de ordens não acionadas, ela expira em 0:59 ou 59 minutos. Para pedidos acionados SL & TP são definidos.

Anteriormente eu projetei o Ea que leva um pedido de compra ou venda em cada hora... nenhum código de problema era simples. Mas aqui parece muito difícil.

Ok, vou tentar codificá-lo como você disse. Se surgir algum problema, eu colocarei aqui. Além disso, será bom se você puder compartilhar qualquer exemplo de código simples para contar o número do bilhete.

Obrigado por sua sugestão.

 

Resolvi meu problema temporariamente com este código seguinte e o executei na tabela Horária. Simples

 //--- go trading only for first tiks of new bar
   if(Volume[0]>1) return(0);
 
As barras não são confiáveis (uma atualização/reconexão pode mudar o número de barras no gráfico) o volume não é confiável (falta de tiques) Use sempre o tempo. Vela nova - Fórum MQL4
 
WHRoeder:
As barras não são confiáveis (uma atualização/religação pode mudar o número de barras no gráfico) o volume não é confiável (erros de ticks) Use sempre o tempo. Vela nova - Fórum MQL4

Obrigado pelo código. Eu o acrescentei na função Tick. Mas agora minha EA não está fazendo nenhum negócio. Como eu uso a função buycall/sell call para fazer pedidos pendentes. Eu não consegui adicionar esta função dentro da função.

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{     
              BuyStopLoss = BC - (StopLoss * CalcPoint1);
              BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
              BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,TimeCurrent()+3540,Green);
         
return(0);
}


int SellCall(double SC)
{ 
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,TimeCurrent()+3540,Red);

   return(0);
}
       
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick(){
   static datetime timeCur; datetime timePre = timeCur; timeCur=Time[0];
   bool isNewBar = timeCur != timePre;
   if(isNewBar){ 
     return; // Once per bar
   }
   return; // every tick
}  

Alguma idéia?

 

Além disso, o comércio inverso em encomendas paradas também não está funcionando.

//-------------Reverse trade for buy
     for(xx =OrdersHistoryTotal()-1;xx >=0;xx --)
     {
         if(OrderSelect(xx, SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()== MagicNumber)
           {
          //for buy order reverse
          if(OrderType()==OP_BUY && OrderProfit()<0) // if last buy closed with loss
          { 
            //--- go trading only for first tiks of new bar
            if(Volume[0]>1) return(0);
            SellStopLoss = Bid + (StopLoss * CalcPoint1);
            SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
            SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Reverse Order",MagicNumber,0,Red);
          }
         break; 
          }
          }
     } 
 

Algum destaque no código reverso? por que ele não funciona?

Obrigado.

Razão: