Ea está criando várias ordens pendentes/limitadas [Help pls]

 

Oi, eu fiz um Ea, mas quando eu volto a testar, ele cria muitos pedidos pendentes em cada tick. Como parar isso. Só preciso de um pedido de cada vez, não preciso de sua cópia.

Se eu executar este EA em tabela horária com"somente preço aberto", então ele não cria cópia.

Além disso, minha EA tem a opção de inverter o comércio se o limite de compra falhar, então ela abre o comércio de venda. Por favor, avise-me também que eu o configurei adequadamente ou não. Qualquer ajuda será apreciada.

Obrigado por seu tempo.

// Main function//
if(condition)
   {
     if( condition )
      {
      if ( BuyTicket == 0)
      BuyCall(S0);
      }    
     if( condition)
      {
      if ( BuyTicket == 0)
      BuyCall(S1);
      }  

   etc etc... // many conditions
}

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

   // reverse trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
     }    
   }
      
return(BuyTicket);
}
 
cashcube: Como impedir isso.
Como você acha? Você verifica se já está saindo antes de abrir um novo.
 
WHRoeder:
cashcube : Como impedir isso.
Como você acha que isso deve ser feito? Você procura por um já existente antes de abrir um novo.

Então, o que fazer? Remover o bilhete de compra == 0 & bilhete de venda == 0 código?
 
As EA's devem ser codificadas para se recuperar. Se a energia falhar, o sistema operacional falhar, o terminal ou gráfico for fechado acidentalmente, no próximo tick, qualquer variável estática/global do ticket terá sido perdida. Você terá uma ordem aberta, mas não a conhece, portanto, as EA nunca tentarão fechá-la, rastrear SL, etc. Como você vai se recuperar? Use um loopOrderSelect para recuperar, ou armazenamento persistente (GV/arquivo) dos números de bilhetes necessários.
 
WHRoeder:
As EA's devem ser codificadas para se recuperar. Se a energia falhar, o sistema operacional falhar, o terminal ou gráfico for fechado acidentalmente, no próximo tick, qualquer variável estática/global do ticket terá sido perdida. Você terá uma ordem aberta, mas não a conhece, portanto, as EA nunca tentarão fechá-la, rastrear SL, etc. Como você vai se recuperar? Use um loopOrderSelect para recuperar, ou armazenamento persistente (GV/arquivo) dos números de bilhetes necessários.

Olá, eu acrescentei o código da seguinte maneira.

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{  
  if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
    {      
  if ( BuyTicket == 0)
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;
   // counter trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        if(!OrderSelect(SellTicket, SELECT_BY_TICKET) == true)
        {
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
        }
     }    
  }
 }

Continua recebendo os mesmos pedidos várias vezes a cada carrapato.

Além disso, se eu remover o sinal "!", então ele não aceita nenhuma negociação.

Por último, tenho que remover a verificação de buyticket & sellticket de minha função principal?

Obrigado.

 
if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
  1. Não colar código
    Reproduzir vídeo
    Por favor, edite seu post.
    Para grandes quantidades de código, anexe-o.

  2. Você nunca escreveria se( (2+2 == 4) == verdadeiro), pois não? se(2+2 == 4) for suficiente. Portanto, não escreva if(bool == verdadeiro), apenas use if(bool) ou if(! bool). O código torna-se autodocumentado quando você usa nomes de variáveis significativas, como bool isLongEnabled. Long_Entry soa como um preço de gatilho ou um número de bilhete e "se entrada longa" é uma frase incompleta.
  3. Onde você verifica se o BuyTicket foi fechado? Selecionar por bilhete será sempre verdadeiro (dado um número de bilhete válido), o pedido poderá ser qualquer um dos pedidos pendentes, abertos, fechados ou excluídos.
  4. Você ignorou completamente minha sugestão de um loop OrderSelect.
 

Olá WHReder obrigado por sua resposta.

Sim, eu acrescentei esses no código SRC. Mas não apareceu quando eu editei.

Eu removi == termos verdadeiros, como você sugeriu.

Por favor, não me entenda mal, tenho um ponto fraco na compreensão deste loop de seleção de ordem. Eu não ignorei. Tentei adicioná-lo, mas é muito complexo, executando-o mostra 16 erros e 2 avisos. Nesse código, o que é MN.Count?

// extern int     Magic.Number.Base          = ...
// int      magic.number.max;                   // Export to OpenOrder/MySelect
// string   market.pair;                        // Export to OpenOrder/MySelect
// int init(){
//    market.pair       = Symbol();
//    magic.number.max  = Magic.Number.Base + MN.COUNT - 1;

Sobre a verificação do bilhete de compra fechado. Eu não verifiquei porque, eu verifiquei se o preço atual está abaixo do preço de compra e depois o comércio de compra foi fechado. então abri ordem de venda.

 Bid < BuyStopLoss 

Abra a ordem de venda.

 

Eu arranjo o código um pouco assim... Mas mostrando 2 erros agora... "MySelect" & "MyOrdersTotal" só podem ser decodificados em âmbito global.

int BuyCall( double BC)
{  
//-----------code
bool MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){
   if(!OrderSelect(iWhat, eSelect, ePool) )  return (false);
   int      mn = OrderMagicNumber();
   if(mn < MNB1              )  return (false);
   if(mn > MNB2               )  return (false);
   if(OrderSymbol()      != Pair   )  return (false);
   if(ePool != MODE_HISTORY               )  return (true);
   return(OrderType() <= OP_SELL); 
                                   
                                   
}
int MyOrdersTotal(int op=-1, int ePool=MODE_TRADES){   #define  OP_ALL -1
   if(ePool == MODE_TRADES)            iPos = OrdersTotal()        - 1;
   else                                iPos = OrdersHistoryTotal() - 1;
   for(nOrders=0; iPos >= 0; iPos--) if(
      MySelect(iPos, SELECT_BY_POS, ePool)) if(
      op == OP_ALL || op == OrderType()
   )  nOrders++;
   return(nOrders);
}

  if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
    {      
  if ( BuyTicket == 0)
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;
   // counter trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
        {
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
        }
     }    
  }
 }
      
return(BuyTicket);
}
 
Você não pode declarar uma função dentro de outra função
 
GumRai:
Você não pode declarar uma função dentro de outra função.

Então, como posso fazer isso? Tenho muitas condições a serem verificadas individualmente para abrir uma ordem de compra/venda.

É por isso que fiz uma função de compra/venda para tornar o código mais fácil.

É apenas a EA que está realizando tantos negócios. Não sei como impedir isso.

 
GumRai:
Você não pode declarar uma função dentro de outra função.

cashcube:

Então, como posso fazer isso? Tenho muitas condições a serem verificadas individualmente para abrir uma ordem de compra/venda.

É por isso que fiz uma função de compra/venda para tornar o código mais fácil.

É apenas a EA que está realizando tantos negócios. Não sei como impedir isso.

Primeiro 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.