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

 
GumRai:

Antes de tudo, não tente declarar uma função dentro de outra função.

Eu não consigo entender o que você está tentando fazer olhando para o código que você postou. Portanto, não posso ajudá-los.

Obrigado GumRai por sua pronta resposta. Meu programa tem muitas condições como as seguintes. Eu verifiquei até P12. É como um pivô. Se as condições satisfizerem, então ele abre negócios de limite nesses níveis P1, P2, ...., já que seu número é 12. Eu não queria escrever o código de compra/venda em cada instância. É por isso que fez funções de buycall/sellcall separadas. Abaixo do meu antigo código para venda.

     if( P1 == 1 || P1 ==5 || P1 ==7)
      {
      if ( BuyTicket == 0)
      BuyCall(S0);
      }    
     if( P2 == 1 || P2 ==5 || P2 ==7)
      {
      if ( BuyTicket == 0)
      BuyCall(S1);
      }  
         .......................many more
 
int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
  if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,expiration,Red);
   BuyTicket = 0; 
   // counter tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       SellTicket = 0;
       }
   }
  } 
 }
   return(SellTicket);
}
 

Este é o exemplo. A mesma colocação comercial em cada carrapato. Preciso colocar isto em cada hora. Como seu pivô de hora em hora.

 
int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
  if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,expiration,Red);
   BuyTicket = 0; 
   // counter tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       SellTicket = 0;
       }
   }
  } 
 }
   return(SellTicket);
}

Quando você abre um limite de venda, você coloca o BuyTicket em 0.

Em seguida você verifica se o BuyTicket==0, é claro que sim, você acabou de defini-lo.

Em seguida, você coloca o SellTicket em 0.

A seguir, Sellticket==0 para que você abra um limite de venda e defina BuyTicket para 0 novamente.

e assim por diante e assim por diante............

 
GumRai:

Quando você abre um limite de venda, você coloca o BuyTicket em 0.

Em seguida você verifica se o BuyTicket==0, é claro que sim, você acabou de defini-lo.

Em seguida, você coloca o SellTicket em 0.

A seguir, Sellticket==0 para que você abra um limite de venda e defina BuyTicket para 0 novamente.

e assim por diante e assim por diante............

Então devo remover as duas linhas que você destacou. Eu fiz isso. Agora mostrando apenas um resultado de uma hora durante 2 meses de testes de dados.

Outra coisa que noto, em minha auto-venda, é que tenho uma troca reversa na compra. Se o comércio de venda for interrompido, o comércio de compra será aberto. Agora para a função sellcall ela retorna (Selltickets) então está tudo bem?

Obrigado.

 

int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
   if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,0,Red);
   
   // reverse tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       
       }
   }
 } 
 }
   return(SellTicket);

Entendo agora neste código, primeiro verifica sellticket == 0 sim óbvio, depois coloca ordem de venda, depois compra buyticket == 0 sim, próximos lugares compra ordem...mas quando retornar...novamente verifica sellticket == 0 , não é agora...então é por isso que a Ea parou depois de tomar um conjunto. Mas como remover este problema. Em meu EA inativo os pedidos pendentes são apagados a cada 59 minutos da hora de início. Eu o defino dessa forma.

 

Agora mudei o código da seguinte forma, ele lendo para todo o suporte e resistência.

Tenho um máximo de 6 suportes e 6 resistências por uma hora. Entre esses 6 atendem as condições, então abre ordens de limites para esse 6. Se 1 atender, então abre ordens de limites para esse 6. Este é o algo.

Portanto, eu defino o código da seguinte forma para a chamada de função.

int BuyCall( double BC)
{  
      
if ( BuyTicket >= 0 && BuyTicket <= 5)
  {
   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)
{
  
 if( SellTicket >= 0 && SellTicket <= 5)
   {
   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);
}

Agora ele funciona por uma hora e verifica 6 níveis para cada compra/venda. Mas funciona por apenas uma hora. O que fazer aqui para executá-lo perfeitamente para um conjunto completo de dados.

 
if ( BuyTicket >= 0 && BuyTicket <= 5)

Isto só funcionará no testador de estratégia e não fará mais nada quando as 6 primeiras ordens forem abertas.

Não é possível usar um número de bilhete para um teste desta maneira

 
GumRai:

Isto só funcionará no testador de estratégia e não fará mais nada quando as 6 primeiras ordens forem abertas.

Não se pode usar um número de bilhete para um teste desta maneira

Obrigado por sua resposta.

Então, o que devo fazer? Se eu remover o BuyTicket =>0 ou qualquer condição BuyTicket. Então a EA está fazendo muitos negócios com cada tick.....Dando-me um erro de Orderend de 148.

 
cashcube: Então, o que devo fazer?
Anteriormente respondido.
 
cashcube:

Obrigado por sua resposta.

Então, o que devo fazer? Se eu remover o BuyTicket =>0 ou qualquer condição BuyTicket. Então a EA está fazendo muitos negócios com cada tick.....Dando-me um erro de Orderend de 148.

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.

Razão: