OrdersTotal(), PositionsTotal()

 

Olá a todos,

Gostaria de ver com vocês o seguinte:

Fazendo alguns testes as funções OrdersTotal() e PositionsTotal() sempre retornam zero. Alguém já passou por isso?

 
Cristiano Santos:

Olá a todos,

Gostaria de ver com vocês o seguinte:

Fazendo alguns testes as funções OrdersTotal() e PositionsTotal() sempre retornam zero. Alguém já passou por isso?

Acredito que tu tenhas que chamar a função PositionSelect(_Symbol) antes
 
Olá, como pretende usá-las? Note que ambas procuram por ordens e posições em aberto, não o histórico destas.
 
Para histórico, procure HistoryDealsTotal() e HistoryOrdersTotal()
 
Murilo Falleiros:
Olá, como pretende usá-las? Note que ambas procuram por ordens e posições em aberto, não o histórico destas.

Pretendo utilizá-las para limitar o número de ordens aceitas no dia.

 
Murilo Falleiros:
Para histórico, procure HistoryDealsTotal() e HistoryOrdersTotal()

Testei esses também. Retornou zero. Preciso utilizar o PositionSelect também?

 
Cristiano Santos:

Testei esses também. Retornou zero. Preciso utilizar o PositionSelect também?

Oi Cristiano,

mostra a parte do código que você faz o teste da quantidade ordens pendentes (OrdersTotal() ) e da quantidade de posições em aberto (PositionsTotal());

 
Rogerio Giannetti Torres:

Oi Cristiano,

mostra a parte do código que você faz o teste da quantidade ordens pendentes (OrdersTotal() ) e da quantidade de posições em aberto (PositionsTotal());

int numOrdensAceitas()
{
  int numOrdens = 0;
  for(int i = PositionsTotal()-1; i>=0; i--)
  {
    string symbol = PositionGetSymbol(i);
    ulong magic = PositionGetInteger(POSITION_MAGIC);

    if(symbol == _Symbol && magic==magic_number && OrderGetInteger(ORDER_STATE) == ORDER_STATE_STARTED)
    {
      numOrdens++;
    }
  }
  return(numOrdens);
}
 
Cristiano Santos:

Oi Cristiano,

bom é o seguinte; se existir uma posição aberta, isto é: uma ordem foi executada e a posição continua aberta o laço do for vai ser executado, não tem erro nenhum no for, porém tem um problema no código, pois o teste do status da ordem está totalmente fora de contexto,

"Não confunda ordens pendentes com posições, que também são exibidos na aba "negócios" da "caixa de ferramentas" do terminal do cliente. Uma ordem é um pedido para conduzir a  transação, enquanto que uma posição é um resultado de um ou mais  negócios."

Coloca um Print(" Qtd. Posições: ",PositionsTotal()); logo abaixo do for para exibir a quantidade de POSIÇÕES abertas no MT5.

 
Rogerio Giannetti Torres:

Oi Cristiano,

bom é o seguinte; se existir uma posição aberta, isto é: uma ordem foi executada e a posição continua aberta o laço do for vai ser executado, não tem erro nenhum no for, porém tem um problema no código, pois o teste do status da ordem está totalmente fora de contexto,

"Não confunda ordens pendentes com posições, que também são exibidos na aba "negócios" da "caixa de ferramentas" do terminal do cliente. Uma ordem é um pedido para conduzir a  transação, enquanto que uma posição é um resultado de um ou mais  negócios."

Coloca um Print(" Qtd. Posições: ",PositionsTotal()); logo abaixo do for para exibir a quantidade de POSIÇÕES abertas no MT5.

Entendi. O que eu quero é limitar o número de ordens executadas no dia. Quando digo executadas me refiro a uma ordem que foi enviada e gerou um negócio.

 
Cristiano Santos:

Entendi. O que eu quero é limitar o número de ordens executadas no dia. Quando digo executadas me refiro a uma ordem que foi enviada e gerou um negócio.

Opa Cristiano, entendi o que você quer, então para isso você deve ler o histórico de ordens executadas no dia e não emitir novas ordens quando bater no limite. Essa sugestão já foi dada, então vou anexar um modelo de código para você seguir.



int DoResultadoDia()
  {
   int acmOrdensExecutadas=0;
   HistorySelect(StringToTime(TimeToString(TimeTradeServer(), TIME_DATE)), INT_MAX);  // Seleciona histórico do dia
   int total = HistoryDealsTotal();
   for(int i = 0; i < total; i++)
     {
      Ticket = HistoryDealGetTicket(i);
      if(HistoryDealGetString(Ticket, DEAL_SYMBOL) == _Symbol
         && HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_IN
        )
        {
            acmOrdensExecutadas++;
        }
     }
   return(acmOrdensExecutadas);
  }
Razão: