Bibliotecas: MT4Orders - página 69

 

Parte de um anúncio do Freelance.

Конвертация должна быть выполнена в родном MQL5 без использования сторонних библиотек типа MT4Orders.

O desenvolvedor deve fornecer o código-fonte antes que o trabalho seja encerrado para que seja possível verificar como a conversão é feita.

Aparentemente, algo não está funcionando bem em algum lugar.

 
fxsaber #:

O arquivo está quebrado.

---

O arquivo contém a versão mais recente

// 01.06.2021
// Correção: compatibilidade com o compilador build 2449 e superior.
// Correção: sincronização aprimorada. O ByPass.mqh deve ter a versão mais recente.
// Adicionar: OrderLots(true) - tamanho sincronizado da posição selecionada, levando em conta todas as ordens que fecham essa posição.
 
Vitaly Muzichenko #:

O arquivo está quebrado

É necessário fazer o download.

 
fxsaber #:

Necessidade de fazer download.

Sim, de fato. É um milagre, arquivos diferentes.

Obrigado!
 
// Lista de modificações:
// 06.01.2022
// Correção: definição precisa dos dados de abertura de posição e do tamanho da comissão. Funciona corretamente apenas no modo ByPass.
// Adicionar: Adicionado OrderDealsAmount() - o número de transações MT5 envolvidas na formação da posição. Funciona corretamente apenas no modo ByPass.

Para quem lida com execuções parciais e sobreposições de CloseBy, recomendo esta atualização.

 
fxsaber #:

Para quem lida com execuções parciais e sobreposições de CloseBy, recomendo esta atualização.

Verifique a precisão dos cálculos no script.

#define  MT4ORDERS_BYPASS_MAXTIME 1000000 // Modo ByPass para cálculos precisos.
#include <MT4Orders.mqh> // https://www.mql5.com/pt/code/16006

// Resumo de todas as operações monetárias - estilo MT5.
double GetProfitMT5( void )
{
  double Res = 0;
  
  if (HistorySelect(0, INT_MAX))
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
      
      Res += HistoryDealGetDouble(Ticket, DEAL_PROFIT) +
             HistoryDealGetDouble(Ticket, DEAL_SWAP) +
             HistoryDealGetDouble(Ticket, DEAL_COMMISSION);
    }
    
  return(Res);
}

// Resumo de todas as operações monetárias - estilo MT4.
double GetProfitMT4( void )
{
  double Res = 0;

  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)  
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      Res += OrderProfit() + OrderSwap() + OrderCommission();
    
  return(Res);
}

void OnStart()
{
  if (PositionsTotal())
    MessageBox("The script works only if there are no open positions."); // Verificar apenas se não há posições abertas.
  else
  {
    const double ProfitMT5 = GetProfitMT5(); // Resumo de todas as operações monetárias - estilo MT5.
    const double ProfitMT4 = GetProfitMT4(); // Resumo de todas as operações monetárias - estilo MT4.
    
    // Compare as somas das transações em dinheiro calculadas por diferentes métodos.
    Alert("MT5 (" + DoubleToString(ProfitMT5, 8) + ") == MT4 (" + DoubleToString(ProfitMT4, 8) + ") - " +
          (string)(bool)!NormalizeDouble(ProfitMT4 - ProfitMT5, 8));
    Print(__MT4ORDERS__);
  }  
}


O resultado é uma linha.

Alert: MT5 (0.00000000) == MT4 (-0.00500000) - false
Alert: MT5 (0.00000000) == MT4 (0.00000000) - true

false - MT4Orders tem um erro em algum lugar. Por favor, verifique em contas complicadas. Se for falso, informe-me.

 
fxsaber #:

Verifique a precisão dos cálculos no script.

Verifique-o em contas complicadas.

A verificação mostrou que a biblioteca com um histórico de negociação muito complexo funciona perfeitamente. Confiabilidade de 100%.

 

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

Bibliotecas: MT4Orders

fxsaber, 2022.01.06 03:18 AM

// Lista de modificações:
// 06.01.2022
// Correção: definição precisa dos dados de abertura de posição e do tamanho da comissão. Funciona corretamente apenas no modo ByPass.
// Adicionar: Adicionado OrderDealsAmount() - o número de transações MT5 envolvidas na formação da posição. Funciona corretamente apenas no modo ByPass.

Usando o CustomReport como exemplo, deixe-me mostrar como ele se parece

Da esquerda para a direita, os locais destacados.

  • OrderDealsAmount. Há posições que foram geradas pelo número correspondente de transações. Em geral, essas podem ser não apenas transações ENTRY_IN, mas também outros tipos de transações.
  • Por esse motivo, os preços de abertura podem ser fracionários - o preço médio ponderado por volume de todas as transações que formaram a posição.
  • Tamanho da comissão em pips. Não deve ser muito diferente (se o volume for grande) em um símbolo. Caso contrário, é um bug do MT4Orders.

O caso na captura de tela é bastante simples. Há casos muito mais complicados em que o OrderDealsAmount é medido em dezenas. Por exemplo, no MT5, pode haver posições com o mesmo tíquete que não se sobrepõem no tempo de vida. A MT5-GUI mostrará que se trata de uma posição, com o horário de abertura da primeira posição. E o MT4Orders mostrará várias posições com diferentes horários de abertura (e preços) e OrderTicketOpen (tíquete da negociação de abertura).


Em resumo, tudo é muito preciso e no estilo usual do MT4. Somente no modo ByPass.

 
// Lista de modificações:
// 12.01.2022
// Correção: OrderPrint() gera dados corretos de tipos raros de ordens/negociações do MT5.
 
// Lista de modificações:
// 14.01.2022
// Correção: acelerou significativamente o OrderSelect(index, SELECT_BY_POS, MODE_HISTORY) no modo ByPass.