Erros típicos e como lidar com eles quando se lida com o ambiente comercial - página 9

 
Algotrader18:

Boa tarde!

Tenho uma pergunta semelhante para todos e especialmente para o fxsaber.
Parece ser uma pergunta primitiva, mas não consigo encontrar a resposta para ela.
Aqui https://www.mql5.com/ru/forum/6343/page939 foi-me dito: "Tente procurá-lo. O fxsaber tem trabalhado neste problema há algum tempo. O que deu certo, eu não sei, não estou interessado". Por isso, decidi perguntar-lhe.

A questão é esta. Abri posição e quero imprimir o conteúdo da MqlTradeResult:

retcode, pedido e volume são impressos, mas o negócio e o preço são sempre zeros.
Por favor, me informe o que estou fazendo de errado e como obter acesso (pelo menos, imprima-o primeiro) ao conteúdo da estrutura de resultados?

Que tal isso?

//+------------------------------------------------------------------+
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
//---
   request.action   = TRADE_ACTION_DEAL;    // type of trade operation
   request.symbol   = Pair1;                // symbol
   request.volume   = lots;                 // volume of lot
   request.type     = oper;                 // order type
   request.price    = priceOpen;            // price for opening
   request.deviation= Slippage;             // allowed deviation from the price
   request.magic    = magic;   
//---
   if(OrderSend(request,result))
     {
      Print ("retcode = " +IntegerToString (result.retcode) + "; ");        
      Print ("deal = " +IntegerToString (result.deal) + "; ");
      Print ("order = " +IntegerToString (result.order) + "; "); 
      Print ("volume = " +DoubleToString (result.volume) + "; ");  
      Print ("price = " +DoubleToString (result.price) + "; ");
     }
   else
     {
      // Здесь действия при ошибке открытия
     }
//+------------------------------------------------------------------+
 
Algotrader18:

Abro uma posição e quero imprimir o conteúdo da MqlTradeResult desta forma:

O retcode, o pedido e o volume são impressos, mas o negócio e o preço são sempre zeros.
Por favor, informe o que estou fazendo de errado e como obter acesso (pelo menos imprima-o primeiro) ao conteúdo da estrutura de resultados?

Os zeros são escritos em resultado.

 
Artyom Trishkin:

Que tal isso?

Obrigado, mas o resultado é o mesmo...
 
fxsaber:

Zeros e são prescritos no resultado.

Bem, então não está nada claro - eu pensei que estava fazendo algo errado, e se há zeros lá, qual é o objetivo do resultado?
Vejo um pedido aberto, recebo result.retcode 10009 e result.price = 0 ?
Você pode explicar o significado do resultado se ele não contiver um resultado?
 
Algotrader18:
Por favor, explique qual é o objetivo do resultado se ele não contém o resultado?

Esta é uma característica da MT5 onde o resultado é apenas um pedido (bilhete e sem preço), mas não uma negociação. Você tem várias opções

  1. Descubra por conta própria como as coisas funcionam.
  2. Utilização de desenvolvimentos já preparados de nível superior (o nível inferior está oculto) onde quase todas as armadilhas são contornadas.
 
fxsaber:

Esta é uma característica da MT5 onde o resultado é apenas um pedido (bilhete e sem preço), mas não uma negociação. Você tem várias opções

  1. Descubra por conta própria como as coisas funcionam.
  2. Utilização de desenvolvimentos já preparados de nível superior (o nível inferior está oculto) onde quase todas as armadilhas são contornadas.
Obrigado.

Na MQL4 não havia nenhuma estrutura de resultados e recebemos um ticket e selecionamos a ordem apropriada e solicitamos os dados necessários. A MQL5 tem a estrutura de resultados que contém muitos dados necessários, e seria ilógico não usá-la.

1. Antes de fazer uma pergunta sobre o fórum, tentei "descobrir por mim mesmo como tudo funciona" e o que vejo - na estrutura de resultados:

struct MqlTradeResult
  {
   uint     retcode;          // Operation return code
   ulong    deal;             // Deal ticket, if it is performed
   ulong    order;            // Order ticket, if it is placed
   double   volume;           // Deal volume, confirmed by broker
   double   price;            // Deal price, confirmed by broker
   double   bid;              // Current Bid price
   double   ask;              // Current Ask price
   string   comment;          // Broker comment to operation (by default it is filled by description of trade server return code)
   uint     request_id;       // Request ID set by the terminal during the dispatch
   uint     retcode_external; // Return code of an external trading system
  };


preço presente em dobro; // Preço de negociação, confirmado pelo corretor.

No código da amostra do desenvolvedor

//--- send the request
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());     // if unable to send the request, output the error code
//--- information about the operation
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
resultado.deal, ou seja, assume-se que faz sentido e nem sempre é representado por zero na estrutura de resultados. Outros exemplos podem ser dados que indicam que o resultado.preço, bem como o resultado.deal pode ser obtido da MqlTradeResul, que é o que eu tentei fazer.


Em nenhum lugar eu vi informação de que "Esta é uma característica da MT5, quando o resultado é apenas um pedido (bilhete e sem preço), mas não um acordo". Por favor, diga-me com base em quais informações você chegou a esta conclusão.

2. Se você souber de algum desenvolvimento de "nível superior já pronto (nível baixo está oculto)", que lhe permita obter os parâmetros de uma posição imediatamente após sua abertura (o código 10009 aparece), sem seleção prévia por bilhete, por favor, me dê um exemplo ou me dê um link para ele.

 
Algotrader18:
Obrigado.

Na MQL4 não havia nenhuma estrutura de resultados e recebemos um ticket e selecionamos a ordem apropriada e solicitamos os dados necessários. A MQL5 tem a estrutura de resultados com muitos dados necessários e seria ilógico não utilizá-la.

1. Antes de fazer uma pergunta no fórum, eu tentei "descobrir por mim mesmo como tudo funciona" e o que eu vejo é que a estrutura resulta:


Há um preço duplo; // Preço de negócio, confirmado pelo corretor.

No código da amostra do desenvolvedor

resultado.deal, ou seja, assume-se que faz sentido e nem sempre é representado por zero na estrutura de resultados. Há outros exemplos que mostram que o resultado.preço assim como o resultado.deal podem ser obtidos da MqlTradeResul, que é o que eu tentei fazer.


Em nenhum lugar vi informação de que "esta é uma característica da MT5 onde o resultado é apenas um pedido (bilhete e sem preço), mas não um negócio". Por favor, diga-me com base em quais informações você chegou a esta conclusão.

2. Se você souber de algum desenvolvimento de "nível superior já preparado (o nível inferior está oculto)", que permita obter os parâmetros de uma posição imediatamente após sua abertura (o código 10009 aparece), sem seleção prévia por bilhete, dê um exemplo ou dê um link para ele.

Um pedido comercial resulta em uma rejeição ou em uma ordem de mercado. Isto não é um comércio, nem é uma posição gerada por um comércio.

  1. Uma ordem comercial para abrir uma posição é enviada para o servidor (ordem = ordem)
  2. Se o pedido for aceito, o resultado de aceitar o pedido e colocá-lo na fila é devolvido.
  3. Se a ordem tiver sido executada, o negócio - o resultado da execução da ordem - aparece.
  4. O resultado de uma troca será ou uma nova posição, ou o aumento/diminuição do tamanho de uma posição existente, ou o fechamento de uma posição, ou um rollover. Ou uma nova posição (em uma conta hedging).
 
Artyom Trishkin:

Um pedido comercial resulta em uma rejeição ou em uma ordem de mercado. Isto não é um comércio, nem é uma posição gerada por um comércio.

  1. Uma ordem comercial para abrir uma posição é enviada para o servidor (ordem = ordem)
  2. Se o pedido for aceito, o resultado de aceitar o pedido e colocá-lo na fila é devolvido.
  3. Se a ordem tiver sido executada, aparecerá uma negociação como resultado da execução da ordem.
  4. O resultado de uma troca será ou uma nova posição, ou um aumento/diminuição no tamanho de uma posição existente, ou o fechamento de uma posição, ou um rollover. Ou uma nova posição (no caso de uma conta de cobertura)
Obrigado - por favor, me diga:
- Após qual etapa você acha que aparece a Estrutura de Resultado da Solicitação de Comércio (MqlTradeResult), dentre as que você listou?

- De acordo com a descrição da MQL5:
"Estrutura do resultado da solicitação de comércio (MqlTradeResult)
Como resposta a uma solicitação comercial, o servidor comercial retorna dados contendo o resultado do processamento da solicitação comercial como uma estrutura especial pré-definida MqlTradeResult". e "10009 TRADE_RETCODE_DONE Order executed".

Isto é, o código de retorno do servidor comercial 10009 significa que o pedido de OrderSend foi executado com sucesso, isto é, se eu solicitar dados da MqlTradeResult, após receber o código 10009, como posso explicar esse resultado.price = 0 ?
 
Algotrader18:
Obrigado:
- após qual passo, daqueles listados por você, a estrutura da solicitação comercial (MqlTradeResult) aparece?

- De acordo com a descrição da MQL5:
"Estrutura do resultado da solicitação de comércio (MqlTradeResult)
Como resposta a uma solicitação comercial, o servidor comercial retorna dados contendo o resultado do processamento da solicitação comercial como uma estrutura especial pré-definida MqlTradeResult". e "10009 TRADE_RETCODE_DONE Order executed".

Portanto, o código de retorno do servidor 10009 significa que o pedido de OrderSend foi executado com sucesso, ou seja, se eu solicitar dados da MqlTradeResult, após receber o código 10009, como posso explicar esse resultado.preço = 0 ?

10009 TRADE_RETCODE_DONE - você mesmo o descreveu - a ordem foi executada. Isto é simplesmente o fato de que a ordem foi colocada em fila de espera com sucesso no servidor para execução.

Além disso, se esta ordem for executada (afinal de contas, ela pode ser rejeitada pelo servidor), então há uma negociação - este é o resultado da negociação com o preço de abertura.

Leia sobre

OnTradeTransaction

É chamado em Expert Advisors quando ocorre um evento TradeTransaction. A função é destinada a processar os resultados da execução dos pedidos comerciais.

nuloOnTradeTransaction( )
const MqlTradeTransaction&trans,// estrutura de uma transação comercial
const MqlTradeRequest&solicitação,// estrutura da solicitação
const MqlTradeResultado& resultado// estrutura da resposta
);

Документация по MQL5: Обработка событий / OnTradeTransaction
Документация по MQL5: Обработка событий / OnTradeTransaction
  • www.mql5.com
При обрабокте транзакций типа TRADE_TRANSACTION_REQUEST для получения дополнительной информации необходимо анализировать второй и третий параметры функции OnTradeTransaction() – Отправка торгового запроса на покупку приводит к цепи торговых транзакций, которые совершаются на торговом счете: 1) запрос  принимается на обработку, 2) далее для...
 
Algotrader18:

Em nenhum lugar eu vi a informação de que "Esta é uma característica da MT5 onde o resultado é apenas uma ordem (bilhete e sem preço), mas não uma negociação". Por favor, diga-me com base em quais informações você chegou a esta conclusão.

Experiência própria.

2. Se você souber de algum desenvolvimento de "nível superior já pronto (nível baixo está oculto)", que lhe permita obter os parâmetros de uma posição imediatamente após sua abertura (o código 10009 aparece), sem seleção prévia por bilhete, por favor dê um exemplo ou um link para ele.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void Variant1()
{
  if (OrderSelect(OrderSend(_Symbol, OP_BUY, 0.1, Ask, 100, 0, 0), SELECT_BY_TICKET))
    OrderPrint();
}

void Variant2()
{
  OrderSend(_Symbol, OP_SELL, 0.1, Bid, 100, 0, 0);
  MqlTradeResult result = MT4ORDERS::LastTradeResult;
  
  Print ("retcode = " +IntegerToString (result.retcode) + "; ");        
  Print ("deal = " +IntegerToString (result.deal) + "; ");
  Print ("order = " +IntegerToString (result.order) + "; "); 
  Print ("volume = " +DoubleToString (result.volume) + "; ");  
  Print ("price = " +DoubleToString (result.price) + "; ");
}

void OnStart()
{
  Variant1();
  Variant2();
}
#2212868739 2018.11.02 21:09:33 buy 0.10 EURUSD 1.13895 0.00000 0.00000 1.13892 -0.18 0.00 -0.26 0
retcode = 10009; 
deal = 2210317244; 
order = 2212868740; 
volume = 0.10000000; 
price = 1.13892000; 


Há outra opção, mas é "avançada".

Razão: