Bibliotecas: MT4Orders - página 77

 
Aleksey Vyazmikin Depois de estudar o GetLastError, concluí que não é razoável complementá-lo.
// Lista de modificações:
// 08.02.2017:
// Adicionar: Variáveis MT4ORDERS::LastTradeRequest e MT4ORDERS::LastTradeResult содержат соответствующие данные MT5-OrderSend.

Agora é possível obter todos os dados do MT5-OrderSend na íntegra.

Print(MT4ORDERS::LastTradeResult.retcode); // Código de retorno da operação
Print(MT4ORDERS::LastTradeResult.retcode_external); // Código de retorno de um sistema de negociação externo 

Os próprios códigos do MT5 estão aqui. Compare com os códigos do MT4.


Observe que, no MT5, GetLastError() não retorna erros de negociação. Portanto, se quiser fazer como no MT4, você precisará gerar seu próprio erro correspondente por meio de SetUserError. Mas, mesmo assim, o ERR_USER_ERROR_FIRST não lhe dará a versão do MT4.

 

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Bibliotecas: MT4Orders

fxsaber, 2022.07.20 00:39

// Lista de modificações:
// 20.07.2022
// Adição: Adicionado OrderLotsOpen() - posição completa/volume da ordem antes de fechar/excluir. Funciona corretamente apenas no modo ByPass.

Exemplo.

#define  MT4ORDERS_BYPASS_MAXTIME 1000000 // Tempo máximo (em µs) para aguardar a sincronização do ambiente de negociação
#include <MT4Orders.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define  PRINT(A) Print(#A + " = " + (string)(A) + "\n")


void OnStart()
{
  const ulong Ticket = OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0); // Abriu uma posição para um lote.

  for (int i = 1; i <= 4; i++)    
    if (OrderSelect(Ticket, SELECT_BY_TICKET) && !OrderCloseTime())
    {
      OrderClose(OrderTicket(), 0.1 * i, OrderClosePrice(), 0); // Feche em 0,1, 0,2, 0,3, ... lotes.
      
      if (OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
      {
        OrderPrint();
        
        PRINT(OrderLotsOpen()); // Volume da posição antes do fechamento correspondente. É retirado do histórico de negociação.
      }
    }
}


Resultado.

#50167020751 2022.07.20 09:58:58.401 buy 0.10 EURUSD 1.02471 0.00000 0.00000 2022.07.20 09:58:58.457 1.02468 0.00 0.00 -0.29 0
OrderLotsOpen() = 1.0

#50167020753 2022.07.20 09:58:58.401 buy 0.20 EURUSD 1.02471 0.00000 0.00000 2022.07.20 09:58:58.512 1.02468 0.00 0.00 -0.59 0
OrderLotsOpen() = 0.9

#50167020754 2022.07.20 09:58:58.401 buy 0.30 EURUSD 1.02471 0.00000 0.00000 2022.07.20 09:58:58.567 1.02468 0.00 0.00 -0.88 0
OrderLotsOpen() = 0.7

#50167020755 2022.07.20 09:58:58.401 buy 0.40 EURUSD 1.02471 0.00000 0.00000 2022.07.20 09:58:58.622 1.02468 0.00 0.00 -1.17 0
OrderLotsOpen() = 0.4
 

Peculiaridade da apresentação de posições fechadas pela biblioteca em comparação com o MT5.


Situação de negociação.

  1. A BuyLimit foi aberta para 1 lote.
  2. A BuyLimit foi parcialmente executada para 0,4 lote às 12:00.
  3. A posição de 0,4 lote foi fechada às 13:00.
  4. O restante da BuyLimit foi executado - 0,6 lote às 14:00.
  5. A posição de 0,6 lote foi fechada às 15:00.

O MT5 mostrará que houve uma posição que abriu às 12:00 e fechou às 15:00. Os preços de abertura/fechamento dessa posição podem ser muito estranhos.


O MT4Orders mostrará que havia duas posições: uma que abriu às 12:00 e fechou às 13:00, e outra que abriu às 14:00-15:00. Os preços de abertura/fechamento serão adequados.

 
fxsaber #:

Parte do MT5-Market é escrita por meio dessa biblioteca. O principal motivo é a facilidade de uso.

Sim, é uma conquista. Entretanto, a verificação de erros na aceitação do mercado não recria todas as situações.

fxsaber #:

Sobre o tópico de erros.

Os próprios códigos do MT5 estão aqui. Compare com os códigos do MT4.


Observe que, no MT5, GetLastError() não retorna erros de negociação. Portanto, se quiser fazer como no MT4, você precisará gerar seu próprio erro correspondente por meio de SetUserError. Mas, mesmo assim, o ERR_USER_ERROR_FIRST não lhe dará a versão do MT4.

Obrigado pelas informações, mas não sou muito bom nisso.

Entendi corretamente que é suficiente substituir

int er=GetLastError();

para

int er=MT4ORDERS::LastTradeResult.retcode_external;

e já processar os novos códigos de erro?

A propósito, não encontrei análogos de erros para o MT5, no MT4 eles são: 135, 145, 146 - existe algum?

 
Aleksey Vyazmikin #:

Sim, é uma conquista. No entanto, a verificação de erros de admissão de marquise não recria todas as situações.

Infelizmente, tenho apenas ideias teóricas sobre o mercado. Não tenho prática de passar pelas verificações.

Entendi corretamente que é suficiente substituir e já processar novos códigos de erro?

Correto. Somente retcode. O análogo de ResetLastError é o mesmo esquema - atribuição de zero.

A propósito, não encontrei análogos de erros para o MT5, no MT4 eles são: 135, 145, 146 - existe algum?

Não conheço os tipos de erros, pois não os utilizo em Expert Advisors de combate. Provavelmente, você deve tentar reproduzir cada erro no MT4 e, em seguida, ter uma ideia clara da natureza deles e compará-los com erros semelhantes no MT5. Talvez já existam tabelas de correspondência em algum lugar. Não é fato que todos os códigos tenham homônimos em outra plataforma.

 
fxsaber #:

É isso mesmo. Apenas retcode. Um análogo de ResetLastError no mesmo esquema - atribuição de zero.

Então, a redefinição de erros pode ser integrada à sua classe de alguma forma? Porque a quarta classe não precisava disso de alguma forma.

Ou basta chamar as informações sobre o último erro e, em seguida, redefini-lo imediatamente, ou seja, trocar as funções que você tem em seu exemplo?

fxsaber #:

Não conheço os tipos de erros, pois não os utilizo em Expert Advisors de combate. Provavelmente, você deve tentar reproduzir cada erro no MT4 e, em seguida, ter uma ideia clara da natureza deles e compará-los com os semelhantes no MT5. Talvez já existam tabelas de correspondência em algum lugar. Não é fato que todos os códigos tenham seus homônimos em outra plataforma.

Eu estava procurando por essa tabela e não a encontrei. Os erros nem sempre estão no código - há problemas por parte da central de corretagem.

Entendi que se o problema for de qualquer tipo com o trabalho com ordens, então GetLastError(); retorna o código 4756, o que não é ruim, se for o caso.

 
Aleksey Vyazmikin #:

Então, a redefinição de erros pode ser integrada em sua aula? Quero dizer, quatro não pareciam precisar disso.

Ou basta chamar as informações sobre o último erro e, em seguida, redefini-lo de uma vez, ou seja, trocar as funções que você tem em seu exemplo?

Não vejo a necessidade de redefini-la. Eu disse para obter compatibilidade adicional com a forma como presumo que o MT4 funcione.

 
fxsaber #:

Não vejo a necessidade de reinicializar. Isso foi dito para aumentar a compatibilidade com a forma como presumo que o MT4 funcione.

Ainda preciso esclarecer: esses erros estão abaixo do código chamado?

Print(MT4ORDERS::LastTradeResult.retcode); // Código de retorno da operação

Porque coisas semelhantes - o que é necessário eu não entendo - o mesmo código abaixo retorna erros da estrutura MqlTradeResult?

Print(MT4ORDERS::LastTradeResult.retcode_external); // Código de retorno de um sistema de negociação externo 
 
Aleksey Vyazmikin #:

Ainda vou esclarecer: esses erros são o que chamamos de código abaixo?

Porque coisas semelhantes - o que é necessário eu não entendo - o mesmo código abaixo retorna erros da estrutura MqlTradeResult?

retcode - erro do MT5. retcode_external - um campo que pode ser preenchido opcionalmente pelo desenvolvedor de uma ponte de terceiros.

 
fxsaber #:

retcode - erro do MT5. retcode_external - um campo que pode ser preenchido opcionalmente pelo desenvolvedor de uma ponte de terceiros.

Entendi, obrigado. Acho que os padrões serão suficientes por enquanto.