Discussão do artigo "Biblioteca para criação simples e rápida de programas para MetaTrader (Parte XXI): classes de negociação - objeto básico de negociação multiplataforma" - página 2

 
Artyom Trishkin:


Obrigado, este é um trabalho importante e útil....

 
Vladimir Pastushak:

Obrigado, este é um trabalho importante e útil....

De nada

 
Olá Artyom - existe uma maneira mais fácil de obter o número do tíquete depois de fazer uma ordem ou abrir uma posição? Isso parece muito complicado :-(
long CMySetup::PlaceOrder()
{
   bool order_ok;
   if (m_direction == POSITION_TYPE_BUY) {
      order_ok = m_engine.PlaceBuyLimit(m_lot_size, m_symbol, m_entry, m_hard_stop, m_ratio_target, m_magic, m_comment, m_expiry);
   }
   else {
      order_ok = m_engine.PlaceSellLimit(m_lot_size, m_symbol, m_entry, m_hard_stop, m_ratio_target, m_magic, m_comment, m_expiry);
   }

   if (order_ok) {
      CArrayObj* list = m_engine.GetListHistoryOrders();
      if (list != NULL) {
         list.Sort(SORT_BY_ORDER_TIME_OPEN);
         COrder* order = list.At(list.Total() - 1);
         if (order != NULL) {
            m_ticket = order.Ticket();
         }
      }
   }
   return m_ticket;
}
 
Dima Diall :
Olá Artyom - existe uma maneira mais fácil de obter o número do tíquete depois de fazer uma ordem ou abrir uma posição? Isso parece muito complicado :-(

Os consultores de teste exibem todos os dados da última ordem colocada ou posição aberta. Isso significa que a biblioteca conhece esses dados. Ela implementa a funcionalidade de eventos, e a biblioteca relata todos os eventos definidos. Dessa forma, você precisa controlar esses eventos e obter o objeto da última ordem ou posição e, a partir dele, obter um tíquete (e todos os outros parâmetros da ordem ou posição). Ainda não é possível dar nenhum exemplo. Mas voltarei em breve e poderei ajudar.
Você pode ver por si mesmo onde os consultores de teste obtêm os dados do evento e os imprimem no registro. Da mesma forma, você pode acessar o mesmo ponto em seu programa e obter dados desses eventos.

В тестовых советниках же показываются все данные последнего выставленного ордера или открытой позиции. Это означает, что библиотека знает эти данные. В ней реализован событийный функционал, и о всех установленных событиях библиотека сообщает. Соответственно, вам нужно контролировать эти события и получать объект последнего ордера или позиции, а из него брать тикет (и все остальные параметры ордера или позиции). Сейчас пока нет возможности привести какой-либо пример. Но в скором времени вернусь и смогу помочь.
Можете самостоятельно поглядеть откуда тестовые советники берут данные о событиях и распечатывают их в журнал. Соответственно, можете из своей программы получить доступ к той же точке и брать данные от этих событий.

 
Artyom Trishkin:

Os consultores de teste exibem todos os dados da última ordem colocada ou posição aberta. Isso significa que a biblioteca conhece esses dados. Ela implementa a funcionalidade de eventos, e a biblioteca relata todos os eventos definidos. Dessa forma, você precisa controlar esses eventos e obter o objeto da última ordem ou posição e, a partir dele, obter um tíquete (e todos os outros parâmetros da ordem ou posição). Ainda não é possível dar nenhum exemplo. Mas voltarei em breve e poderei ajudar.
Você pode ver por si mesmo onde os consultores de teste obtêm os dados do evento e os imprimem no registro. Da mesma forma, você pode acessar o mesmo ponto em seu programa e obter dados desses eventos.

Sim, eu entendo - estou dando uma olhada mais de perto e me perguntando se tenho a garantia de que meu manipulador de eventos será chamado imediatamente e, se várias ordens/posições tiverem sido solicitadas, que tipo de análise preciso realizar para garantir que eu combine corretamente os eventos com cada solicitação... tudo isso apenas para descobrir o número do ticket que, por exemplo, para ordens pendentes, a biblioteca recebe em 'm_result' dentro de CTradeObj::SetOrder()

#ifdef __MQL5__
   return(!this.m_async_mode ? ::OrderSend(this.m_request,this.m_result) : ::OrderSendAsync(this.m_request,this.m_result));
#else 
   ::ResetLastError();
   int ticket=::OrderSend(this.m_request.symbol,
                          this.m_request.type,
                          this.m_request.volume,
                          this.m_request.price,
                          (int)this.m_request.deviation,
                          this.m_request.sl,
                          this.m_request.tp,
                          this.m_request.comment,
                          (int)this.m_request.magic,
                          this.m_request.expiration,
                          clrNONE);
// ...
   if(ticket!=WRONG_VALUE)
     {
      this.m_result.order=ticket;
      this.m_result.price=(::OrderSelect(ticket,SELECT_BY_TICKET) ? ::OrderOpenPrice() : this.m_request.price);
      this.m_result.volume=(::OrderSelect(ticket,SELECT_BY_TICKET) ? ::OrderLots() : this.m_request.volume);
      return true;
     }
// ... 
#endif

É por isso que eu acho que seria mais útil que o número do tíquete (ou -1 se não for bem-sucedido) fosse retornado de CEngine::PlaceBuyLimit() e de toda essa família de métodos, porque quando você coloca uma ordem ou abre uma posição, na maioria das vezes você quer registrar imediatamente o número do tíquete para poder consultá-lo mais tarde... Na minha humilde opinião, forçar o usuário do DoEasy a implementar o tratamento de eventos para isso faz com que a biblioteca pareça desnecessariamente complicada .

Provavelmente há um bom motivo para a sua abordagem, portanto, não sei se você concorda; caso contrário, eu gostaria muito de entender o raciocínio por trás da sua decisão de design ;-)

 
Dima Diall :

Sim, eu entendo - estou dando uma olhada mais de perto e me perguntando se tenho a garantia de que meu manipulador de eventos será chamado imediatamente e, se várias ordens/posições tiverem sido solicitadas, que tipo de análise preciso realizar para garantir que eu combine corretamente os eventos com cada solicitação... tudo isso apenas para descobrir o número do tíquete que, por exemplo, para ordens pendentes, a biblioteca recebe em 'm_result' dentro de CTradeObj::SetOrder()

É por isso que eu acho que seria mais útil que o número do tíquete (ou -1 se não for bem-sucedido) fosse retornado de CEngine::PlaceBuyLimit() e de toda essa família de métodos, porque quando você coloca uma ordem ou abre uma posição, na maioria das vezes você quer registrar imediatamente o número do tíquete para poder consultá-lo mais tarde... Na minha humilde opinião, forçar o usuário do DoEasy a implementar o tratamento de eventos para isso faz com que a biblioteca pareça desnecessariamente complicada .

Provavelmente há um bom motivo para a sua abordagem, portanto, não sei se você concorda; caso contrário, eu gostaria muito de entender o raciocínio por trás da sua decisão de design ;-)

Tudo é muito simples. Na MQL5, o sucesso do envio de uma ordem de negociação para o servidor não garante sua execução. O sucesso do envio é uma verificação da exatidão dos parâmetros em uma ordem de negociação. A execução da ordem é de responsabilidade da bolsa. Só podemos usar o fato de uma mudança no ambiente de negociação e, após detectar essa mudança, seguir em frente. É por esse motivo que não uso os dados recebidos na resposta do servidor.

Всё очень просто. В MQL5 успешность отсылки торгового приказа на сервер не гарантирует его исполнения. Успешность отсылки - это просо проверка на корректность параметров в торговом приказе. Исполнение приказа лежит на стороне биржи. Мы можем лишь использовать факт изменения торгового окружения, и после обнаружения его изменения уже двигаться дальше. Именно по этой причине я не использую данные, полученные в ответе сервера.

 
Artyom Trishkin:

Tudo é muito simples. Na MQL5, o sucesso do envio de uma ordem de negociação para o servidor não garante sua execução. O sucesso do envio é uma verificação da exatidão dos parâmetros em uma ordem de negociação. A execução da ordem é de responsabilidade da bolsa. Só podemos usar o fato de uma mudança no ambiente de negociação e, após detectar essa mudança, seguir em frente. É por esse motivo que não uso os dados recebidos na resposta do servidor.

Certo, estou tentando implementar essa abordagem em minha estrutura de EA para facilitar o gerenciamento usando o TestDoEasyPart39.mq5 como guia, mas estou tendo alguns problemas com eventos perdidos - ainda estou investigando/depurando (tudo no modo testador por enquanto)... Gostaria de receber outros exemplos de código de como você mesmo faz isso em outros EAs, se puder compartilhar alguns.

Ainda estou usando a versão da biblioteca da Parte 39; essa é a melhor versão a ser usada no momento ou você recomenda a atualização para uma versão mais recente?

 
Dima Diall :

OK, estou tentando implementar essa abordagem em minha estrutura de EA para facilitar o gerenciamento, usando seu TestDoEasyPart39.mq5 como guia, mas estou tendo alguns problemas com eventos perdidos - ainda estou investigando/depurando (tudo no modo testador por enquanto)... Gostaria de receber outros exemplos de código de como você mesmo faz isso em outros EAs, se puder compartilhar alguns.

Ainda estou usando a versão da biblioteca da Parte 39; essa é a melhor versão a ser usada no momento ou você recomenda a atualização para uma versão mais recente?

Até o momento, todas as versões subsequentes são dedicadas à criação de indicadores.

Voltarei aos consultores em breve. Lá também verificarei as mensagens dos usuários de que alguns eventos de negociação (que ocorrem simultaneamente) são perdidos.
E então poderei mostrar a você como usar o modelo de evento da biblioteca.

Пока все последующие версии посвящены созданию индикаторов.

Скоро опять вернусь к советникам. Там и проверю сообщения пользователей о том, что некоторые торговые события (происходящие одновременно) теряются.
И там же смогу тогда показать как использовать событийную модель библиотеки.

 
Artyom Trishkin:

Até o momento, todas as versões subsequentes são dedicadas à criação de indicadores.

Voltarei aos conselheiros em breve. Lá também verificarei as mensagens dos usuários de que alguns eventos de negociação (que ocorrem simultaneamente) são perdidos.
E então poderei mostrar a você como usar o modelo de evento da biblioteca.

Quando você espera começar a trabalhar novamente nos recursos para consultores especializados? Dependendo de sua resposta, talvez eu precise escolher escrever minha própria classe/métodos multiplataforma para simplificar a colocação de ordens, a abertura de posições, etc., pelo menos para meu projeto atual.

Ao lidar com eventos de negociação, como TRADE_EVENT_PENDING_ORDER_PLASED ou TRADE_EVENT_POSITION_OPENED, como posso garantir que um determinado evento corresponda a uma solicitação de negociação específica que enviei anteriormente? Atualmente, tenho apenas uma ordem/posição por símbolo, portanto, é fácil verificar se o símbolo do evento corresponde à minha solicitação... No entanto, mais tarde meu EA deverá ser capaz de abrir várias ordens/posições no mesmo símbolo (usando um único número mágico), e espero que não seja necessário comparar o preço de entrada, SL, TP, etc. Eu estava pensando em usar números mágicos diferentes, ou aquele recurso que agrupa os grupos nº 1 e nº 2 no número mágico.

Estou um pouco confuso e não tenho certeza de qual é a melhor abordagem para associar eventos de negociação a solicitações - você poderia me ajudar com isso por enquanto? Se eu puder associar de forma confiável uma solicitação de negociação ao seu número de tíquete, acredito que poderei continuar usando o DoEasy para esse projeto.

Library for easy and quick development of MetaTrader programs (part XXVI): Working with pending trading requests - first implementation (opening positions)
Library for easy and quick development of MetaTrader programs (part XXVI): Working with pending trading requests - first implementation (opening positions)
  • www.mql5.com
I have already mentioned the concept of a pending request in a number of previous articles. In this article, we are going to figure out what it is and why we need it, as well as start implementing pending requests. When receiving and handling a trade server error, we sometimes need to wait and repeat the request. In the simplest case, waiting...
 
Dima Diall :

Quando você espera começar a trabalhar novamente em recursos para consultores especializados? Dependendo de sua resposta, talvez eu precise escolher escrever minha própria classe/métodos multiplataforma para simplificar a colocação de ordens, a abertura de posições, etc., pelo menos para meu projeto atual.

Ao lidar com eventos de negociação, como TRADE_EVENT_PENDING_ORDER_PLASED ou TRADE_EVENT_POSITION_OPENED, como posso garantir que um determinado evento corresponda a uma solicitação de negociação específica que enviei anteriormente? Atualmente, tenho apenas uma ordem/posição por símbolo, portanto, é fácil verificar se o símbolo do evento corresponde à minha solicitação... No entanto, mais tarde meu EA deverá ser capaz de abrir várias ordens/posições no mesmo símbolo (usando um único número mágico), e espero que não seja necessário comparar o preço de entrada, SL, TP, etc. Eu estava pensando em talvez usar números mágicos diferentes, ou aquele recurso que agrupa os grupos nº 1 e nº 2 no número mágico.

Estou um pouco confuso e não tenho certeza de qual é a melhor abordagem para associar eventos de negociação a solicitações. Se eu puder associar de forma confiável uma solicitação de negociação ao seu número de tíquete, acredito que poderei continuar usando o DoEasy para esse projeto.

Se você precisar comparar uma solicitação de negociação e uma posição, a maneira mais fácil é definir o identificador da posição (não mágico). Cada solicitação tem seu próprio identificador. A mágica do consultor pode ser deixada como uma para todas as posições. Então, por meio do identificador (ele é gravado na mágica de uma posição ou ordem e nunca será perdido), você poderá comparar com precisão a solicitação e a posição/ordem a qualquer momento.