Bibliotecas: MT4Orders - página 83

 
fxsaber #:

A biblioteca (MT4Orders.mqh) não consome essa quantidade de memória. Você pode executar, por exemplo, esse EA para ver por si mesmo.

Provavelmente, você está trabalhando com indicadores de forma incorreta: você cria novos identificadores de indicadores, mas não exclui os antigos.

Eu não uso nenhum indicador.

Embora você esteja certo, a biblioteca não consome essa quantidade de memória, no entanto, ela a utiliza:

HistorySelect(0,INT_MAX);

De acordo com esta página:

https://www.mql5.com/pt/articles/211

"A tentativa de lidar com todo o histórico de negociação, na maioria dos casos, está errada. Quando o número de transações/ordens processadas fica em torno de milhares e dezenas de milhares, o trabalho do programa fica drasticamente mais lento."

No caso de haver mais de 1 milhão de negociações, sua biblioteca armazena todas elas em uma matriz.

Agradeço por ter criado essa biblioteca, que faz a ponte entre o mt4 e o mt5, e por tê-la compartilhado com todos, sem tentar destruí-la. Só acho lamentável que haja apenas um lugar on-line que descreva como obter os valores de swap e de comissão corretamente (dado que a corretora realmente os fornece), e que esteja escrito de forma tão ofuscada.

Orders, Positions and Deals in MetaTrader 5
Orders, Positions and Deals in MetaTrader 5
  • www.mql5.com
Creating a robust trading robot cannot be done without an understanding of the mechanisms of the MetaTrader 5 trading system. The client terminal receives the information about the positions, orders, and deals from the trading server. To handle this data properly using the MQL5, it's necessary to have a good understanding of the interaction between the MQL5-program and the client terminal.
 
pcdeni #:

Embora você esteja certo, a biblioteca não consome essa quantidade de memória, no entanto, ela usa isso:

De acordo com esta página:

https://www.mql5.com/pt/articles/211

"A tentativa de lidar com todo o histórico de negociação, na maioria dos casos, está errada. Quando o número de transações/ordens processadas fica em torno de milhares e dezenas de milhares, o trabalho do programa fica drasticamente mais lento."

Caso haja mais de 1 milhão de negociações, sua biblioteca armazena todas elas em uma matriz.

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

double GetSummaryCommissionMQL5()
{
  double Res = 0;
  
  if (HistorySelect(0, INT_MAX))
    for (uint i = HistoryDealsTotal(); (bool)i--; )
      Res += HistoryDealGetDouble(HistoryDealGetTicket(i), DEAL_COMMISSION);

  return(NormalizeDouble(Res, 2));
}

double GetSummaryCommissionMQL4()
{
  double Res = 0;
  
  for (uint i = OrdersHistoryTotal(); (bool)i--; )
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      Res += OrderCommission();

  return(NormalizeDouble(Res, 2));
}

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

void OnStart()
{
  PRINT(MQLInfoInteger(MQL_MEMORY_USED));
  PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));

  PRINT(GetSummaryCommissionMQL5());

  PRINT(MQLInfoInteger(MQL_MEMORY_USED));
  PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));

  PRINT(GetSummaryCommissionMQL4());

  PRINT(MQLInfoInteger(MQL_MEMORY_USED));
  PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));

  PRINT(HistoryDealsTotal());
  PRINT(HistoryOrdersTotal());
  PRINT(PositionsTotal());
}


Resultado.

MQLInfoInteger(MQL_MEMORY_USED) = 1
TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1203

GetSummaryCommissionMQL5() = -43568.97
MQLInfoInteger(MQL_MEMORY_USED) = 1
TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1404

GetSummaryCommissionMQL4() = -43568.97
MQLInfoInteger(MQL_MEMORY_USED) = 45
TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1424

HistoryDealsTotal() = 130330
HistoryOrdersTotal() = 190241
PositionsTotal() = 0


130 mil negócios + 190 mil ordens, o consumo de memória do terminal aumentou em 20 MB (+10%).

Você mesmo pode medir o desempenho. A documentação está desatualizada há muito tempo.

 
O uso da biblioteca pode aumentar o consumo de memória em até 10%.
 
fxsaber #:
O uso da biblioteca pode aumentar o consumo de memória em até 10%.

Qual é a razão para isso?

 
Vitaly Muzichenko #:

O que isso tem a ver com o assunto?

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

Bibliotecas: MT4Orders

fxsaber, 2023.07.07 13:12

  • O OrderSelect calcula absolutamente todos os dados da ordem selecionada a partir do histórico (o OrderPrint é gratuito). Essa é uma excelente combinação das funções HistoryOrderGet* e HistoryDealGet*, que lida com qualquer complexidade de situações de mercado e um grande número de armadilhas. Dê uma olhada em MT4ORDERS::GetHistoryPositionData(). Essa é uma função única para o Terminal e para o Testador, mas é especialmente acelerada para o Testador, porque muitas armadilhas do Terminal não estão presentes no Testador. Exemplos de configurações: um, dois, três.
 
fxsaber #:
O uso da biblioteca pode aumentar o consumo de memória em até 10%.

Pensei que houvesse uma atualização da biblioteca ontem, mas não me atualizei por um ano :)

Vou aguardar ansiosamente, obrigado pelo apoio!

 

submarino, qual é a vantagem de usar const na transferência de função?

E, ao mesmo tempo, é razoável criar um membro de classe dentro de uma função ou podemos fazer isso com global, 7 caracteres em uma troca de robô?

processamento em cada tick, por meio do indicador spy.

o processamento em cada tick, normalmente vazio, não detecta anomalias, é uma questão de otimizar suas perguntas sobre funções...
 
// Lista de modificações:
// 21.07.2023
// Correção: corrigido o OrderLotsOpen() para ordens pendentes excluídas.
// Adicionar: lida com a situação em que uma negociação MT5 não tem uma ordem MT5.
// Correção: definição correta de OrderClosePriceRequest() quando a ordem SL/TP não tem preço.
// Adicionar: a macro MT4ORDERS_AUTO_VALIDATION permite que você valide automaticamente os produtos de mercado.
// Adicionar: a macro MT4ORDERS_ORDERS_SORT gera o histórico de ordens do MT4 classificadas por hora de fechamento/exclusão.
 

fxsaber #:

/ Adicionar: a macro MT4ORDERS_ORDERS_SORT gera o histórico de ordens MT4 classificadas por hora de fechamento/exclusão.

Baixei a atualização e verifiquei que tudo está funcionando bem agora com ordens limitadas, sem atrasos até o momento.

Obrigado!

 
Vitaly Muzichenko #:

Ainda não há atrasos.

A variante frontal é usada agora.

Aqui está o código que pode mostrar o tempo de execução dessa solução depois, se o histórico de negociação foi atualizado entre as chamadas vizinhas de OrdersHistoryTotal().

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/pt/code/31279

ulong OrdersMQL5()
{
  ulong Res = 0;

  if (HistorySelect(0, INT_MAX))
  {
    const int Total = HistoryOrdersTotal();
    ulong Array[][2];
    
    ArrayResize(Array, Total);
    
    for (int i = 0; i < Total; i++)
    {
      const ulong Ticket = HistoryOrderGetTicket(i);

      Array[i][0] = HistoryOrderGetInteger(Ticket, ORDER_TIME_DONE_MSC);
      Array[i][1] = Ticket;
    }
          
    ArraySort(Array);      
    
    Res = Array[Total - 1][1];
  }
  
  return(Res);
}

void OnStart()
{
  OrdersMQL5(); // Aquecimento.
  
  for (int i = 0; i < 3; i++)
    _B(OrdersMQL5(), 1);
    
  Print(HistoryOrdersTotal());
}


Resultados da execução em algumas contas de negociação. Na abscissa de HistoryOrdersTotal().

X - HistoryOrdersTotal()

Você pode ver claramente que, com 100 mil ordens MT5, o atraso será de 10 ms (o tempo de execução de OrdersHistoryTotal se o histórico de negociação tiver sido atualizado após a execução anterior).

No testador, não há atraso algum. Somente no Terminal. Obviamente, é possível acelerar o processo, mas não a esse ponto.