OrdersTotal(), PositionsTotal()

Para adicionar comentários, por favor Faça o login ou registrar
Cristiano Santos
70
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?

wagnerhsilveira
8
wagnerhsilveira  
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
Murilo Falleiros
618
Murilo Falleiros  
Olá, como pretende usá-las? Note que ambas procuram por ordens e posições em aberto, não o histórico destas.
Murilo Falleiros
618
Murilo Falleiros  
Para histórico, procure HistoryDealsTotal() e HistoryOrdersTotal()
Cristiano Santos
70
Cristiano Santos  
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.

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

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

Rogerio Giannetti Torres
2758
Rogerio Giannetti Torres  
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());

Cristiano Santos
70
Cristiano Santos  
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);
}
Rogerio Giannetti Torres
2758
Rogerio Giannetti Torres  
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.

Cristiano Santos
70
Cristiano Santos  
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.

Rogerio Giannetti Torres
2758
Rogerio Giannetti Torres  
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);
  }
12
Para adicionar comentários, por favor Faça o login ou registrar