Bibliotecas: BestInterval - página 14

 
gspencer:
Não sei nada sobre codificação ou trabalho com EAs no Meta Editor, mas gosto muito do seu conceito com o BestInterval. Seria muito difícil para você me instruir sobre como adicioná-lo aos EAs que tenho e que gostaria de testar?

Tente entender a discussão deste tópico.

Библиотеки: BestInterval
Библиотеки: BestInterval
  • 2018.10.12
  • www.mql5.com
Статьи и техническая библиотека по автоматическому трейдингу: Библиотеки: BestInterval
 
// Exibir o gráfico de equilíbrio BestInterval no gráfico

#property strict
#property script_show_inputs

input int inAmountIntervals = 3; // Quantos intervalos de negociação de pior caso devem ser descartados

#include <Graphics\Graphic.mqh> // https://www.mql5.com/pt/articles/2866

void ToChart( const double &Y[] )
{
   CGraphic graphic;
   graphic.Create(0, __FUNCTION__, 0, 30, 30, 780, 380);
   graphic.CurveAdd(Y, CURVE_LINES);
   graphic.CurvePlotAll();
   graphic.Update();   
}

#include <MT4Orders.mqh> // Não é necessário se o MT4.
#include <fxsaber\BestInterval\BestInterval.mqh> // Cálculo do melhor intervalo de negociação

void OnStart()
{
  BESTINTERVAL BestInterval; // Criado um objeto para calcular o melhor intervalo de negociação
  
  BestInterval.Set(); // Publicou um histórico de lances
          
  for (int i = 0; i < inAmountIntervals; 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
      
  double Profits[];
  double Balance[];
  
  const int Size = ArrayResize(Balance, BestInterval.GetProfits(Profits) + 1); // Obteve os lucros da transação BestInterval
  Balance[0] = 0;  
  
  // Calcular a curva de equilíbrio
  for (int i = 1; i < Size; i++)
    Balance[i] = Balance[i - 1] + Profits[i - 1];
    
  ToChart(Balance); // Visualizado.
}
 
Se você inserir isso no final de qualquer EA da entrega padrão
// Transmitir cotações de cada passagem do Optimiser para o Terminal. Aplique o BestInterval a elas e visualize-as.

#include <MT4Orders.mqh>                         // https://www.mql5.com/pt/code/16006
#include <fxsaber\BestInterval\BestInterval.mqh> // https://www.mql5.com/pt/code/22710
#include <TypeToBytes.mqh>                       // https://www.mql5.com/pt/code/16280
#include <Graphics\Graphic.mqh>                  // https://www.mql5.com/pt/articles/2866

input int inAmountIntervals = 1; // Quantos intervalos de negociação de pior caso devem ser descartados

// Gera o gráfico
void ToChart( const double &Y[] )
{
   CGraphic graphic;
   graphic.Create(0, __FUNCTION__, 0, 30, 30, 780, 380);
   graphic.CurveAdd(Y, CURVE_LINES);
   graphic.CurvePlotAll();
   graphic.Update();   
}

// Coleta o histórico comercial
int GetDeals( DEAL_BASE &Deals[] )
{  
  const int Total = ArrayResize(Deals, OrdersHistoryTotal());
  int Amount = 0; 
  
  for (int i = 0; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      Deals[Amount].OpenTime = OrderOpenTime();
      Deals[Amount++].Profit = OrderProfit() + OrderCommission() + OrderSwap();
    }
      
  return(ArrayResize(Deals, Amount));    
}

// A partir daqui (Agente), enviaremos dados para o Terminal
double OnTester()
{
  DEAL_BASE Deals[];
  
  if (MQLInfoInteger(MQL_OPTIMIZATION) && GetDeals(Deals)) // Se for otimização, histórico comercial coletado
  {    
    CONTAINER<uchar> Container; // https://www.mql5.com/ru/forum/95447/page4#comment_5464205
    
    Container[0] = Deals; // Coloque o histórico de lances em um contêiner
  
    FrameAdd(NULL, 0, 0, Container.Data); // Envio de dados do agente para o terminal
  }
  
  return(0);
}

// Aqui (Terminal) recebe dados dos agentes
void OnTesterPass()
{    
  ulong Pass;
  string Name;
  long ID;
  double Value;

  CONTAINER<uchar> Container; // https://www.mql5.com/ru/forum/95447/page4#comment_5464205

  while (FrameNext(Pass, Name, ID, Value, Container.Data))
  {
    Print("Pass = " + (string)Pass); // Número de aprovação
    
    DEAL_BASE Deals[];
   
    // Dados recebidos do agente
    Container[0].Get(Deals);
          
    BESTINTERVAL BestInterval; // Criado um objeto para calcular o melhor intervalo de negociação
    
    BestInterval.Set(Deals);   // Publicou o histórico de lances transmitidos

    Print(BestInterval.ToString() + "\n");           // Vamos imprimir os dados comerciais obtidos
            
    for (int i = 0; i < inAmountIntervals; i++)
      if (BestInterval.DeleteWorseInterval())        // Se algo foi jogado fora
        Print(BestInterval.ToString() + "\n");       // Vamos imprimir os dados comerciais obtidos
      else
        break;                                       // Caso contrário, estamos fora
        
    double Profits[];
    double Balance[];
    
    const int Size = ArrayResize(Balance, BestInterval.GetProfits(Profits) + 1); // Obteve os lucros da transação BestInterval
    Balance[0] = 0;  
    
    // Calcular a curva de equilíbrio
    for (int i = 1; i < Size; i++)
      Balance[i] = Balance[i - 1] + Profits[i - 1];
      
    ToChart(Balance); // Visualizado.    
  }
}


verá algo parecido com isto no registro do Terminal (pelo exemplo das Médias Móveis padrão)

Pass = 0
Amount of Delete Intervals = 0 (2018.10.01 - 2019.02.05)
00:00:00 - 23:59:59 : Profit = -8498.94 (100.00%), Total = 6394 (26.07%), PF = 0.52, Mean = -1.33, DD = 8660.23, RF = -0.98
SUMMARY: 00:00:00 - 23:59:59 : Profit = -8498.94 (100.00%), Total = 6394 (26.07%), PF = 0.52, Mean = -1.33, DD = 8660.23, RF = -0.98

Amount of Delete Intervals = 1 (2018.10.01 - 2019.02.05), 18:00 - 18:00, CountHours = -1
17:40:01 - 17:42:59 : Profit = 364.25 (100.00%), Total = 9 (100.00%), PF = Max, Mean = 40.47, DD = 4.63, RF = 78.67
SUMMARY: 00:00:00 - 23:59:59 : Profit = 364.25 (100.00%), Total = 9 (100.00%), PF = Max, Mean = 40.47, DD = 4.63, RF = 78.67

Pass = 1
Amount of Delete Intervals = 0 (2018.10.01 - 2019.02.05)
00:00:00 - 23:59:59 : Profit = -9757.53 (100.00%), Total = 6394 (24.70%), PF = 0.55, Mean = -1.53, DD = 10076.19, RF = -0.97
SUMMARY: 00:00:00 - 23:59:59 : Profit = -9757.53 (100.00%), Total = 6394 (24.70%), PF = 0.55, Mean = -1.53, DD = 10076.19, RF = -0.97

Amount of Delete Intervals = 1 (2018.10.01 - 2019.02.05), 09:00 - 10:00, CountHours = 0
08:27:01 - 10:14:59 : Profit = 628.59 (100.00%), Total = 472 (39.41%), PF = 1.39, Mean = 1.33, DD = 550.93, RF = 1.14
SUMMARY: 00:00:00 - 23:59:59 : Profit = 628.59 (100.00%), Total = 472 (39.41%), PF = 1.39, Mean = 1.33, DD = 550.93, RF = 1.14


E o gráfico mostra o gráfico BestInterval-profit da passagem correspondente


 

Eu estava passando por lá. Eu li.

A descrição diz: "

  • A ideia é do autor. Pode haver análogos.

"

Eu descrevi algo mais generalizado em um blog em inglês(parte 1, parte 2). Fazer seções cruzadas somente em intervalos de tempo é uma abordagem altamente especializada. Na ideia, as seções cruzadas em outros parâmetros poderiam ser igualmente interessantes.

 
Stanislav Korotky:

Eu estava passando por lá. Eu li.

A descrição diz: "

  • A ideia é do autor. Pode haver análogos.

"

Eu descrevi algo mais generalizado no blog em inglêsabertura da posição. Dessa forma, todas as posições no histórico de negociação podem ser comparadas a esses valores de MA.

Em seguida, aplicamos o BestInterval a essas MAs. E, na saída, obtemos os intervalos de МАшки nos quais as posições devem ser abertas e em quais - não.


Obviamente, você pode usar qualquer função numérica em vez de uma MA. Como resultado, você pode encontrar filtros legais que superam o tempo.

 
fxsaber:

Infelizmente, a barreira do idioma me impede de entrar em seu trabalho. Sobre o interesse em outros filtros, é claro, eu concordo

Desde quando existe essa barreira? ;-) Já estava claro antes. Ou eu estraguei meu inglês?

 
Stanislav Korotky:

Desde quando surgiu essa barreira? ;-) Costumava ser claro. Ou eu baguncei meu inglês?

Sempre havia uma barreira. Às vezes eu ia direto ao ponto, lendo o código-fonte.

 
fxsaber:

Infelizmente, a barreira do idioma me impede de entrar em seu trabalho. Sobre o interesse em outros filtros, é claro, eu concordo

Deus é seu juiz.

 
Memorando
#include <fxsaber\BestInterval\BestInterval.mqh>

void OnStart()
{
  BESTINTERVAL BestInterval;

  // Valores correspondentes para todo o BestInterval
  Print(BestInterval.GetTotal());          // Número de posições fechadas.
  Print(BestInterval.GetTotalPlus());      // Número de posições fechadas lucrativas.
  Print(BestInterval.GetTotalMinus());     // Número de posições fechadas não lucrativas.
  Print(BestInterval.GetMean());           // Expectativa matemática
  Print(BestInterval.GetProfit());         // Lucro
  Print(BestInterval.GetProfitFactor());   // Fator de lucro
  Print(BestInterval.GetProfitPlus());     // Lucro de transações positivas
  Print(BestInterval.GetProfitMinus());    // Perda de transações negativas
  Print(BestInterval.GetRecoveryFactor()); // Fator de recuperação
  Print(BestInterval.GetMaxDrawDown());    // Redução máxima do saldo absoluto

  Print(BestInterval.GetAmountDeleteIntervals()); // Número de intervalos ruins removidos

  INTERVAL Intervals[];

  const int Size = BestInterval.GetIntervals(Intervals); // Obter os intervalos que compõem o BestInterval

  // Para cada intervalo, imprimimos seus índices
  for (int i = 0; i < Size; i++)
  {
    Print(Intervals[i].Total);          // Número de posições fechadas.
    Print(Intervals[i].TotalPlus);      // Número de posições fechadas lucrativas.
    Print(Intervals[i].TotalMinus);     // Número de posições fechadas não lucrativas.
    Print(Intervals[i].Mean);           // Expectativa matemática
    Print(Intervals[i].Profit);         // Lucro
    Print(Intervals[i].ProfitFactor);   // Fator de lucro
    Print(Intervals[i].ProfitPlus);     // Lucro de transações positivas
    Print(Intervals[i].ProfitMinus);    // Perda de transações negativas
    Print(Intervals[i].RecoveryFactor); // Fator de recuperação
    Print(Intervals[i].MaxDrawDown);    // Redução máxima do saldo absoluto

    Print(Intervals[i].OpenTime);       // Intervalo de tempo aberto.
    Print(Intervals[i].CloseTime);      // Hora de fechamento do intervalo.
  }
}
 
Stanislav Korotky:

Fazer seções cruzadas somente por intervalos de tempo é uma abordagem altamente especializada. Na verdade, as seções cruzadas por outros parâmetros podem ser não menos interessantes.

Tenho pensado e pensado, mas não encontrei algo que possa ser filtrado de forma tão eficaz quanto o tempo.

Esse algo não deve fazer parte da estratégia e deve influenciar diretamente o comportamento do mercado.

Pilha? Outros feeds de dados?

E outra pergunta: há algum sentido em criar hipercubos? em teoria, individualmente, eles também devem ser bem filtrados.