Bibliotecas: MT4Orders - página 10

 
Aliaksandr Kryvanos:

seleção por símbolo e majic não funciona

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
}

OrderSelect não funciona, não seleciona uma ordem (ticket por índice) para trabalhar com ela, exemplo simples no anexo e não funciona no MT5 por algum motivo.

Seu código não funcionará no MT4 como gostaríamos que funcionasse. Porque há um erro nele - você define suas posições como zero majic, mas as compara com outro valor.
OrderSend(Symbol(),OP_BUY, 0.01,Ask, 0, 0,0,"",0,0,clrNONE);
Corrija seu código da seguinte forma
OrderSend(Symbol(),OP_BUY, 0.01,Ask, 0, 0,0,"",MagicNumber,0,clrNONE);
O alarme é falso.
[Excluído]  
Obrigado, peço desculpas, mas aconteceu que eu estava tentando traduzir um EA para a versão do MT5, e isso me tomou muito tempo, e a lógica de negociação não correspondia, verifiquei a magia e tudo o que poderia afetá-la, então escrevi um exemplo simples e ele não funcionou. Mas depois descobri meu erro, e o exemplo acima não tem nada a ver com isso. Eu queria excluir minha postagem, mas não tive tempo.
 
Aliaksandr Kryvanos:

A seleção por símbolo e majic não funciona

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
}

OrderSelect não funciona, não seleciona uma ordem (ticket por índice) para trabalhar com ela, exemplo simples no anexo e não funciona no mt5 por algum motivo

Você não define a magia em OrderSend
[Excluído]  

Olá, tenho uma dúvida: como posso obter dados sobre erros ao enviar ordens para o MT5, na versão MT4 é assim

bool CloseError = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
if (CloseError == false)
{
  ResetLastError();
  error = GetLastError();
  Print(" CloseOpenedTrades OrderClose failed" + " - ticket=", OrderTicket() + string(error) + ") " + ErrorDescription(error) + " - ticket= ", OrderTicket());
}

O código de erro está contido na estrutura MqlTradeResult, não poderei usar o código acima no MT5 sem acesso ao resultado, como posso modificar o mt4orders.mqh para retornar os erros do servidor de negociação?

 
Aliaksandr Kryvanos:

Olá, tenho uma dúvida: como posso obter dados sobre erros ao enviar ordens para o MT5, na versão MT4 é assim

bool CloseError = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
if (CloseError == false)
{
  ResetLastError();
  error = GetLastError();
  Print(" CloseOpenedTrades OrderClose failed" + " - ticket=", OrderTicket() + string(error) + ") " + ErrorDescription(error) + " - ticket= ", OrderTicket());
}

O código de erro está contido na estrutura MqlTradeResult, não poderei usar o código acima no MT5 sem acesso ao resultado, como posso modificar o mt4orders.mqh para retornar os erros do servidor de negociação?

Você pode fazer com que GetLastError retorne mais valores - complemente-o com códigos de MqlTradeResult.
[Excluído]  
Ou seja, se houver um erro ao fechar um pedido, GetLastError() retornará o código de erro (do servidor de negociação), mesmo que não verifiquemos MqlTradeResult Result; Result.retcode in OrderSend(Request, Result)?
 
Aliaksandr Kryvanos:
Ou seja, se houver um erro ao fechar um pedido, GetLastError() retornará o código de erro (do servidor de negociação), mesmo que não verifiquemos MqlTradeResult Result; Result.retcode in OrderSend(Request, Result)?

Sim, não é difícil de implementar.

Aliaksandr Kryvanos:
bool CloseError = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
if (CloseError == false)
{
  ResetLastError();
  error = GetLastError();
  Print(" CloseOpenedTrades OrderClose failed" + " - ticket=", OrderTicket() + string(error) + ") " + ErrorDescription(error) + " - ticket= ", OrderTicket());
}

Não entendo o significado do destaque.

[Excluído]  
fxsaber:

Sim, não é difícil de implementar.

Não entendo o significado da parte destacada.

estava no EA para o mt4

Você diz que não é difícil de implementar, mas, na verdade, GetLastError() pode retornar um erro do servidor de negociação se a ordem não for enviada, sem analisar a estrutura MqlTradeResult.

Você pode simplesmente adicionar uma verificação a:

static bool NewOrderSend( const MqlTradeRequest &Request )
  {
    MqlTradeResult Result;
    if (::OrderSend(Request, Result) || Result.retcode != TRADE_RETCODE_DONE)
    {
      Print("OrderSend() error: ", ResultRetcodeDescription(Result.retcode));
      return(false);
    }
    else
    {
      return(true);
    }

    //return(MT4ORDERS::OrderSend(Request, Result) ? Result.retcode < TRADE_RETCODE_ERROR : false);
  }

mas é necessário fazer isso, se GetLastError() pode funcionar como está?

 
Aliaksandr Kryvanos:

Esse era o caso do consultor mt4

Então, há um erro na lógica.

Você diz que não é difícil de implementar, mas, na verdade, GetLastError() pode retornar um erro do servidor de negociação, se a ordem não for enviada, sem analisar a estrutura MqlTradeResult.

Você pode simplesmente adicionar uma verificação a:

static bool NewOrderSend( const MqlTradeRequest &Request )
  {
    MqlTradeResult Result;
    if (::OrderSend(Request, Result) || Result.retcode != TRADE_RETCODE_DONE)
    {
      Print("OrderSend() error: ", ResultRetcodeDescription(Result.retcode));
      return(false);
    }
    else
    {
      return(true);
    }

    //return(MT4ORDERS::OrderSend(Request, Result) ? Result.retcode < TRADE_RETCODE_ERROR : false);
  }

mas é necessário fazer isso, se GetLastError() pode funcionar como está?

Não estou entendendo. Sua implementação em if contém um erro. Além disso, existe algo como TRADE_RETCODE_DONE_PARTIAL - é uma execução bem-sucedida do OrderSend.

E mesmo que você corrija seu código, ele registrará apenas uma mensagem de erro (e talvez alguém não queira vê-la todas as vezes). Mas ela NÃO estará disponível na MQL.

Portanto, a variante em que GetLastError retorna tanto os erros de tempo de execução padrão quanto os códigos de retorno adicionais do servidor de negociação parece ser a mais adequada.

[Excluído]  
Entendo. Você pode me dar uma ideia de como fazer com que o GetLastError() também produza erros do servidor de comércio? Muito obrigado