Bibliotecas: BestInterval

 

BestInterval:

A biblioteca para calcular o melhor intervalo de negociação.

BestInterval

Autor: fxsaber

 

Pode parecer que a biblioteca tem algo em comum com esse gráfico no relatório padrão do MT5 Tester


Um exemplo de como obter dados para esse gráfico está abaixo

#include <MT4Orders.mqh> // https://www.mql5.com/pt/code/16006
#include <fxsaber\BestInterval\BestInterval.mqh> // https://www.mql5.com/pt/code/22710

void OnStart()
{
  BESTINTERVAL BestInterval; // Criado um objeto para calcular o melhor intervalo de negociação
  
  BestInterval.Set(); // Publicou um histórico de lances  
  BestInterval.DeleteWorseInterval() // Jogou fora um intervalo ruim

  double Profit[24], Loss[24];
  
  ArrayInitialize(Profit, 0);
  ArrayInitialize(Loss, 0);
  
  for (int i = BestInterval.GetAmount() - 1; i >= 0; i--)
  {
    const DEAL Deal = BestInterval[i];     // i-ésima negociação no histórico de negociação recalculado
    const int hour = Deal.OpenTime % 3600; // hora da i-ésima transação
    
    // Distribuir o lucro para as respectivas matrizes
    if (Deal.Profit > 0)
      Profit[hour] += Deal.Profit;
    else
      Loss[hour] -= Deal.Profit;    
  }
}


Mas, na verdade, a biblioteca não se destina a execuções ou visualizações únicas. Ela é 99% necessária para a otimização do TS, pois permite que você descubra os modos legais de qualquer TS, se esses modos estiverem incorporados nele, embora secretamente.


O registro mostrado na biblioteca é o estágio da análise após a otimização: uma única execução. Esse registro simplesmente mostra como uma instância específica do TS (um conjunto de parâmetros de entrada) se comporta nos intervalos calculados. Ou seja, é um controle adicional, mas no estágio final. A base é a otimização.

 

A biblioteca usa o MT4Orders para recuperar o histórico de negociação.

Pode haver vários motivos pelos quais o MT4Orders não deve ser usado. Por exemplo, para analisadores de negociação de terceiros.

Em todo caso, esse cenário é fornecido:

#include <fxsaber\BestInterval\BestInterval.mqh> // Cálculo do melhor intervalo de negociação

void OnDeinit( const int )
{
  BESTINTERVAL BestInterval; // Criado um objeto para calcular o melhor intervalo de negociação
  
  // Matriz de fechamento de negócios
  DEAL Deals[];
  
  // Precisamos escrever dois campos para cada transação de fechamento
  // Deals[i].Profit - lucro do negócio que fecha a posição
  // Deals[i].OpenTime - hora de abertura (não de fechamento) da posição em que o negócio é fechado
      
// BestInterval.Set(); // Histórico de negociação de venda - usa MT4Orders
  BestInterval.Set(Deals); // Publicou uma história de licitação preparada por você mesmo
  
  const int AmountIntervals = 3; // Quantos intervalos de negociação de pior caso devem ser descartados
  
  for (int i = 0; i < AmountIntervals; i++)
    if (BestInterval.DeleteWorseInterval()) // Se algo foi jogado fora
      Print(BestInterval.ToString());       // Vamos imprimir os dados comerciais obtidos
    else
      break;                                // Caso contrário, estamos fora
}

Ou seja, você pode inserir os dados que quiser para calcular o melhor intervalo. A biblioteca é independente de plataforma.


Observe que o algoritmo bibla não envolve nenhuma otimização interna de parâmetros. Não há ultrapassagem, pois a base é de passagem única: O(n) (n é o número de posições de fechamento de negociações). E o link "mais lento" é um QuickSort: O(n*log(n)). É por isso que ele se encaixa perfeitamente na otimização, pois não torna o processo mais lento.


Os desenvolvedores podem adotar o algoritmo (já que ele é de passagem única), colocar seus resultados no relatório de passagem única e criar um indicador padrão.

Identificador

Descrição do indicador estatístico

Tipo de indicador

STAT_PROFIT

Lucro líquido no final do teste, a soma deSTAT_GROSS_PROFIT e STAT_GROSS_LOSS (STAT_GROSS_LOSS é sempre menor ou igual a zero).

duplo

STAT_BESTPROFIT

Lucro no melhor intervalo.

double

 

A ideia da biblioteca é clara e a implementação é incrivelmente fácil de usar. Obrigado pelo trabalho realizado.

No entanto, tenho uma sugestão para o autor: precisamos de um exemplo de uso em um Expert Advisor específico - desde o início da habilitação das bibliotecas até a formação do filtro.

 
Sergey Pavlov:

A ideia da biblioteca é clara e a implementação é incrivelmente fácil de usar. Obrigado pelo trabalho realizado.

No entanto, tenho uma sugestão para o autor: precisamos de um exemplo de uso em um Expert Advisor específico - desde o início da habilitação das bibliotecas até a formação de filtros.

Eu apoio 101% :)

 
Sergey Pavlov:

Você precisa de um exemplo de uso em um Expert Advisor específico - desde o início da habilitação das bibliotecas até a formação de um filtro.

Dê uma olhada em BestInterval_Example.mq5.

 

Чтобы применить найденный интервал после его расчета, нужно во входных параметрах указать BestInteval Action = true.



Recursos.

  • O cálculo do melhor intervalo e sua aplicação no Tester são feitos sem alterar o código-fonte original do Expert Advisor.

  • S

    Por favor, compartilhe nos comentários os resultados da aplicação (como acima) da biblioteca ANTES e DEPOIS na forma de imagens e partes correspondentes dos registros de passagem única do MT4/5.


    Ficou muito mais fácil aplicar o resultado do cálculo ao Expert Advisor. Para isso, você só precisa clicar algumas vezes.

    Como um pequeno resumo.

    1. Pegue qualquer Expert Advisor e escreva estas linhas em seu início

    #include <MT4Orders.mqh> // https://www.mql5.com/pt/code/16006
    
    #define  BESTINTERVAL_ONTESTER // O critério de otimização é o lucro do melhor intervalo.
    #include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/pt/code/22577
    #include <fxsaber\BestInterval\BestInterval.mqh> // https://www.mql5.com/pt/code/22710

    2. Defina o número de intervalos a serem lançados e a opção de não aplicá-los.


    3. Defina Otimização ou execução única imediata. Se estiver interessado, haverá dados de cálculo no registro do testador.

    Amount of Delete Intervals = 0
    00:00:00 - 23:59:59 : Profit = 18385.00, Total = 1070, PF = 1.61, Mean = 17.18, DD = 1769.00, RF = 10.39
    SUMMARY: 00:00:00 - 23:59:59 : Profit = 18385.00, Total = 1070, PF = 1.61, Mean = 17.18, DD = 1769.00, RF = 10.39
    
    Amount of Delete Intervals = 1
    00:00:00 - 10:07:47 : Profit = 4279.00, Total = 181, PF = 2.02, Mean = 23.64, DD = 834.00, RF = 5.13
    11:06:12 - 23:59:59 : Profit = 17349.00, Total = 768, PF = 1.95, Mean = 22.59, DD = 933.00, RF = 18.59
    SUMMARY: 00:00:00 - 23:59:59 : Profit = 21628.00, Total = 949, PF = 1.97, Mean = 22.79, DD = 862.00, RF = 25.09


    4. Após a execução única, ative a opção para ativar o melhor intervalo e inicie a execução única novamente.


    5. Você obterá o relatório do testador


    E dados sobre os intervalos aplicados no registro.

    Amount of Delete Intervals = 1
    00:00:00 - 10:07:47 : Profit = 4279.00, Total = 181, PF = 2.02, Mean = 23.64, DD = 834.00, RF = 5.13
    11:06:12 - 23:59:59 : Profit = 17349.00, Total = 768, PF = 1.95, Mean = 22.59, DD = 933.00, RF = 18.59
    SUMMARY: 00:00:00 - 23:59:59 : Profit = 0.00, Total = 0, PF = Max, Mean = 0.00
    


    Em resumo, todos os resultados ANTES e DEPOIS + dados detalhados (drawdown máximo adicionado e fator de recuperação - por balanço) para cada subintervalo do melhor intervalo.

     

    Você pode consultar a biblioteca deste consultor.

     

    O que você quer dizer com isso?

    'OnTester' - function already defined and has body      BestInterval.mqh        504     8
    

    não compila

     
    Sergey Chalyshev:

    O que você quer dizer com isso?

    não compila.

    O que você fez?

     
    fxsaber:

    O que você fez?

    Ainda não fiz nada, só estou tentando compilar esse código:

    #include <MT4Orders.mqh> // https://www.mql5.com/pt/code/16006
    
    #define  VIRTUAL_TESTER // Executar em um ambiente de negociação virtual
    #define  BESTINTERVAL_ONTESTER // O critério de otimização é o lucro do melhor intervalo.
    #include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/pt/code/22577
    #include <fxsaber\BestInterval\BestInterval.mqh> // https://www.mql5.com/pt/code/22710
    
    #include <..\Experts\fxsaber\TesterEA\TesterEA.mq4>

    sem o Virtual , ele compila,

    sem o BestInterval, ele compila também,

    mas não compila junto.