Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 854

 
Estou a brincar com o CTrade::PositionClose(const ulong ticket,const ulong deviation=ULONG_MAX) e percebo que não está exactamente organizado no interior. Trata-se de 2 códigos de retorno - bool e ResultRetcode(). RetCode nem sempre é zerado internamente antes de retornar falso, por isso se PositionClose der falso, RetCode pode muito bem retornar TRADE_RETCODE_DONE. Seria bom que os programadores sincronizassem estes 2 valores de retorno.
 
. ... Rick D. ... .:
Estou a brincar com o CTrade::PositionClose(const ulong ticket,const ulong deviation=ULONG_MAX) e percebo que não está exactamente organizado no interior. Trata-se de 2 códigos de retorno - bool e ResultRetcode(). RetCode nem sempre é zerado internamente antes de retornar falso, por isso se PositionClose der falso, RetCode pode muito bem retornar TRADE_RETCODE_DONE. Seria bom que os programadores sincronizassem estes 2 valores de retorno.

Código + exemplo + registos.

 
Encontrei um insecto estranho. Talvez seja apenas para mim.

COrderInfo::OrderType() retorna sempre 0.

Para o verificar, pode colocar manualmente qualquer encomenda pendente (BuyStop, SellStop, ...),
depois introduzi-lo no guião.
#include <Trade\Trade.mqh>

COrderInfo m_order;

void OnStart()
{
  ulong ticket = 250262937; //здесь ваш тикет
  
  if (!m_order.Select(ticket))
  {
    PrintFormat("COrderInfo::Select(#%I64u) failed", ticket);
    return;
  }
  
  PrintFormat("OrderType= %d", m_order.Type());
}

Talvez algo com a tabela de funções virtuais? Na depuração, eu só chego ao virtual int CObject::Type()

PS. Eu próprio já o descobri. COrderInfo tem 2 métodos semelhantes: Type() e OrderType().

 
Vladimir Karputov:

Código + exemplo + registos.

Veja a que situação me refiro.

#include <Trade\Trade.mqh>

CTrade m_trade;

void OnStart()
{ 
  int LErr;
  bool bRC;
  double price;

  ResetLastError();
  
  price = 0.0;
  bRC = m_trade.Buy(0.1, "EURUSD", price, 0.0, 0.0);

  LErr = GetLastError();

  PrintFormat("! Buy:  (bRC= %s)(RetCode= %u: %s)(LErr= %d)",
    ticket,
    (string)bRC, 
    m_trade.ResultRetcode(), 
    m_trade.ResultComment(), 
    LErr
  );
  
  //В m_trade.ResultRetcode() теперь TRADE_RETCODE_DONE
  
  //---

  ulong ticket = 1; //Позиции с таким тикетом нет
  
  ResetLastError();

  bRC = m_trade.PositionClose(ticket);  

  LErr = GetLastError();
  
  PrintFormat("! Close #%I64u:  (bRC= %s)(RetCode= %u: %s)(LErr= %d)",
    ticket,
    (string)bRC, 
    m_trade.ResultRetcode(), 
    m_trade.ResultComment(), 
    LErr
  );
  
  //В m_trade.ResultRetcode() все еще TRADE_RETCODE_DONE
}

Não vejo nenhum SetResultRetcode e SetResultComment métodos no CTrade para os reiniciar antes de cada nova operação.

Tenho de herdar a minha turma, onde acrescento um único método


class CTradeEx : public CTrade
{
public:
  void SetResult(MqlTradeResult& result)
  {
    m_result = result;
  }  
};
 
. ... Rick D. ... .:

Veja a que situação me refiro.

Não vejo nenhum SetResultRetcode e SetResultComment métodos no CTrade para os reiniciar antes de cada nova operação.

Para quê? Funções completamente desnecessárias.

Primeiro: dispara no ar - envia uma ordem comercial sem verificar primeiro - sem verificar o que a operação devolveu. Veja a referência:PositionClose é do tipo bool.

Em segundo lugar, vejamos a cadeia de fecho da posição: quando a posição não é encontrada (não pode ser seleccionada pelo bilhete especificado), "falso" é devolvido.

//+------------------------------------------------------------------+
//| Close specified opened position                                  |
//+------------------------------------------------------------------+
bool CTrade::PositionClose(const ulong ticket,const ulong deviation)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- check position existence
   if(!PositionSelectByTicket(ticket))
      return(false);
   string symbol=PositionGetString(POSITION_SYMBOL);
//--- clean

Nesse caso, as estruturas não são limpas em lado nenhum - porque não faz sentido - afinal, a posição não podia ser seleccionada antes, daí não haver informação nas estruturas.

 
Vladimir Karputov:

Qual é o objectivo? Funções completamente desnecessárias.

Primeiro: dispara no ar - envia uma ordem comercial sem verificar primeiro - sem verificar o que a operação devolveu. Vejamos a referência:PositionClose é do tipo bool.

Em segundo lugar, vejamos a cadeia de fecho da posição: quando a posição não é encontrada (não pode ser seleccionada pelo bilhete especificado), "falso" é devolvido.

Ao mesmo tempo, as estruturas não são desobstruídas em lado nenhum, uma vez que não faz sentido - afinal, a posição não podia ser seleccionada antes, daí não haver informação nas estruturas.

1) Podemos também dizer que ResetLastError() é uma função absolutamente desnecessária.

2) Há uma verificação para o resultado devolvido. Imagine, por analogia, que chama alguma função WinAPI, retorna um erro, e GetLastError() (análogo de ResultRetcode) retorna qualquer último código.

Se eu acrescentar alguma verificação antes de chamar PositionClose (o que farei), não substitui qualquer outra verificação antes de qualquer outra chamada, quando o RetCode não muda.

O meu consultor especializado escreve informações no diário de bordo. Tudo o que preciso é escrever em log sã ResultRetcode e ResultComment se alguma chamada devolvida for falsa.

 
. ... Rick D. ... .:

1) Poderíamos também dizer que ResetLastError() é completamente desnecessário.

2) Há uma verificação do resultado da devolução. Imagine, por analogia, que chama alguma função WinAPI, retorna um erro, e GetLastError() (análogo de ResultRetcode) retorna qualquer último código.

Se eu acrescentar alguma verificação antes de chamar PositionClose (o que farei), não substitui qualquer outra verificação antes de qualquer outra chamada quando o RetCode não muda.

O meu consultor especializado escreve informações no diário de bordo. Tudo o que preciso de fazer é escrever sã ResultRetcode e ResultComment no registo, se alguma chamada devolvida for falsa.

Leia na ajuda de classe CTrade quando precisar deverificar o resultado da execução do pedido de troca (código de retorno do servidor de troca) chamando o métodoResultRetcode().

 
Vladimir Karputov:

Ler na ajuda de classe CTrade quandoverificar o resultado da execução do pedido de troca (código de retorno do servidor de troca) chamando o métodoResultRetcode().

Pode afirmar que

1) Se o PositionClose devolve falsos, então o Retcode nunca é preenchido?

2) Se PositionClose retorna verdadeiro, então o Retcode é sempre povoado?

 
Vladimir Karputov:

Ordem -> comércio -> posição. Tirar o preço de abertura da posição.

Pode mostrar uma imagem de como esta Ordem -> comércio -> posição, está abaixo de onde os ofícios estão escritos para não permitir a cópia lá


 
Seric29:

Pode mostrar uma imagem de como esta Ordem -> comércio -> posição, está no fundo onde as trocas são escritas para não o deixar copiar.


Por favor, ou reescreva a sua pergunta ou ponha sinais de pontuação, ou melhor ainda acrescente numa imagem o quê, onde e quem. Caso contrário, acontece que vejo cartas familiares, mas não consigo compreender o significado e o seu ponto de vista.