Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 558

 

É isso aí, encontrei meu erro. Algumas pessoas precisam expressar sua pergunta a fim de entender mais tarde como erraram.

Infelizmente, aparentemente, eu sou um desses personagens. (((

 
Konstantin Nikitin:

OrderSend
OrderSelect

Presumo que se refira aonúmero do bilhete?

Alguma armadilha?

 
Decromor:

Saudações!


Uma ordem pode ser acessada usando o comando OrderSelect por seu número.

Pergunta, é possível saber antecipadamente o número de pedidos existentes, para não passar por todos eles? Por exemplo, podemos memorizar este número ao abrir um novo pedido.

Entendo que este número é atribuído em ordem a partir de 1. Quais são as nuances possíveis?

Obrigado de antemão.

  1. Você pode endereçá-lo por seu índice na lista de pedidos (ao tentar no laço), ou por seu bilhete (se for conhecido com antecedência).
  2. Não desejável - em caso de qualquer falha (reinício do Expert Advisor, reinício do terminal, falha do sistema, etc.), os bilhetes memorizados podem ser perdidos. Portanto, eles devem ser armazenados ou em variáveis globais do terminal, ou em um arquivo, o que é viável, mas mais difícil do que a busca habitual, que não é feita em cada tick, mas somente quando necessário.
  3. Não. A partir do número 1, e em ordem ascendente - somente no testador.
  4. Seja bem-vindo.
 
Artyom Trishkin:
  1. Você pode consultá-lo por seu índice na lista de pedidos (ao pesquisar no laço), ou por seu bilhete (se for conhecido com antecedência)
  2. Não desejável - em caso de qualquer falha (reinício da EA, reinício do terminal, falha do sistema, etc.), os bilhetes memorizados podem ser perdidos. Portanto, eles devem ser armazenados ou em variáveis globais do terminal, ou em um arquivo, o que é viável, mas mais difícil do que a busca habitual, que não é feita em cada tick, mas somente quando necessário.
  3. Não. A partir do número 1, e em ordem ascendente - somente no testador.
  4. Por favor.

É possível executar no código OnInit() no loop OrdersTotal() e reunir todas as informações sobre pedidos em aberto, em particular OrderTicket()?

string orders[][3];

int OnInit() {
   for (int n = OrdersTotal() + 1; n >= 0; n--) {              
      if (OrderSelect(n, SELECT_BY_POS, MODE_TRADES)) {
         int i = (ArraySize(orders) / 3);
         ArrayResize(orders, i + 1);
         orders[i][0] = IntegerToString(OrderTicket());
         orders[i][1] = IntegerToString(OrderType());
         orders[i][2] = DoubleToString(OrderOpenPrice(), Digits);   
      } 
   }
   return(INIT_SUCCEEDED);
}


Quando um pedido é automaticamente fechado por TP ou SP, é possível obter os dados deste pedido?

 
Decromor:

É possível executar o programa no corpo do OnInit() e coletar todas as informações sobre ordens em aberto, em particular OrderTicket(), no loop OrderTotal()?


Quando um pedido é fechado automaticamente por TP ou SP, é possível obter os dados deste pedido?

  1. Sim, nós podemos. E depois? As ordens podem mudar com o tempo e as informações coletadas durante a inicialização estão desatualizadas.
  2. Devemos encontrar o último pedido fechado e obter todas as informações necessárias sobre ele.
 
Artyom Trishkin:
  1. Você pode. E depois? As ordens podem mudar com o tempo, e as informações sobre elas, coletadas durante a inicialização, se tornarão desatualizadas.
  2. Necessidade de encontrar o último pedido fechado e obter todas as informações necessárias sobre ele.

Durante a COMPRA, VENDER, eu salvo os dados necessários em uma matriz e, em seguida, eu enrolo essa matriz e, dependendo do preço, faço as alterações necessárias (transferir SL para Breakeven, fechar ordem após o inverso, etc.), endereçando para a ordem necessária através do bilhete.

Mas tenho pedidos com TP e SL que podem fechar sem meu conhecimento. Não gosto da opção de procurar a última ordem fechada a cada tique e procurá-la em minha matriz para corrigi-la.

"As ordens podem mudar com o tempo, e as informações coletadas sobre elas durante a inicialização se tornarão desatualizadas". Presumo que seja isto o que se pretende - fechar o pedido?

A única opção que vejo é fazer 2 loops em um tick, o meu com pedidos eOrdensTotal() e eu também não gosto.

"Mas mais complicado do que a enumeração habitual, que não é feita em cada tic, mas somente quando necessário" Por favor, compartilhe este algoritmo.

 
Decromor:

É possível executar o programa no corpo do OnInit() e coletar todas as informações sobre ordens em aberto, em particular OrderTicket(), no loop OrderTotal()?


Quando um pedido é automaticamente fechado por TP ou SP, é possível obter os dados deste pedido?

E por que precisamos converter tudo isso em um fio? É um tipo de corda?

 
Decromor:

É possível executar o programa no corpo do OnInit() e coletar todas as informações sobre ordens em aberto, em particular OrderTicket(), no loop OrderTotal()?


Quando um pedido é automaticamente fechado por TP ou SP, é possível obter os dados deste pedido?

struct SOrders
{
     int ticket,
         type;
     double price;
} orders[];

int OnInit() {
   for (int n = 0; n < OrdersTotal(); n++)
   {              
      if(!OrderSelect(n, SELECT_BY_POS, MODE_TRADES)) continue;
      int i = ArraySize(orders);
      if(ArrayResize(orders, i+1) < i+1) continue;
      orders[i].ticket = OrderTicket();
      orders[i].type   = OrderType();
      orders[i].price  = OrderOpenPrice();
   }
   return(INIT_SUCCEEDED);
}
 
Konstantin Nikitin:
Muito obrigado pela informação, isto é novidade para mim.
 
Alexey Viktorov:

Por que traduzir tudo isso em um fio? Tipo de corda?

Porque, por exemplo, um bilhete tem tipo Int, preço Duplo, e uma matriz só pode ser de um tipo.
Razão: