Bibliotecas: BestInterval - página 24

 
Enrique Dangeroux:
Pequena correção cosmética, int => bool. Ou se eu puder sugerir retornar AmountDeleteIntervals em vez disso.

Obrigado, vou ter que corrigir isso.

 

Considere o AverageHolding como uma adição à biblioteca

Intervalo.mqh

  datetime AverageHolding;

  void CalculateFinal( void )
  {
    this.ProfitMinus = this.Profit - this.ProfitPlus;

    this.ProfitFactor = this.ProfitMinus ? -this.ProfitPlus / this.ProfitMinus : DBL_MAX;
    this.Mean = this.Total ? this.Profit / this.Total : 0;

    this.TotalMinus = this.Total - this.TotalPlus;
    
    this.AverageHolding = this.Total ? this.AverageHolding / this.Total : 0;

    return;
  }

  void Calculate( const DEAL &Deals[], const int Left, const int Right )
  {
    this.Init();

    for (int i = Left; i < Right; i++)
      if (!Deals[i].IsNull())
      {
        if (Deals[i].Profit > 0)
        {
          this.ProfitPlus += Deals[i].Profit;

          this.TotalPlus++;
        }
        
        this.AverageHolding += Deals[i+1].OpenTime - Deals[i].OpenTime;
        this.Profit += Deals[i].Profit;
        this.Total++;
      }

    this.CalculateFinal();

    this.OpenTime = Deals[Left-1].OpenTime + 1;
    this.CloseTime = Deals[Right].OpenTime - 1;

    
    return;
  }



BestInterval.mqh

#define  MACROS_GET(A, B)         \
  B Get##A( void ) const         \
  {                              \
    return(this.FullInterval.A); \
  }

  MACROS_GET(Profit, double)
  MACROS_GET(ProfitPlus, double)
  MACROS_GET(ProfitMinus, double)

  MACROS_GET(Total, int)
  MACROS_GET(TotalPlus, int)
  MACROS_GET(TotalMinus, int)

  MACROS_GET(ProfitFactor, double)
  MACROS_GET(Mean, double)

  MACROS_GET(MaxDrawDown, double)
  MACROS_GET(RecoveryFactor, double)
  
  MACROS_GET(AverageHolding, datetime)
#undef  MACROS_GET
 
Enrique Dangeroux:

Considere o AverageHolding como um acréscimo à biblioteca

Tempo médio de vida de uma posição fechada - para que serve?

Não é assim que deve ser calculado. Você precisa saber o horário de fechamento.

 
fxsaber:

Vida útil média de uma posição fechada - para que serve?

Estou me referindo ao tempo médio de vida de uma posição (OrderCloseTime - OrderOpentime). Isso pode ser útil como critério personalizado do GA. Por exemplo, levar o GA a aumentar a frequência de transações combinada com um lucro mínimo por limite de transação.


fxsaber:

Não é assim que se calcula. Você precisa saber o horário de fechamento.

Para a conta de compensação DEAL IN/OUT, o horário de abertura é suficiente para o cálculo; para a implementação adequada, você precisa usar o horário de fechamento, que atualmente não é contabilizado na biblioteca.

Há um problema que permanecerá. O testador força o fechamento da última posição. A precisão do relógio atômico pode não ser necessária para todas as estratégias, mas continuará sendo um problema. Além disso, o GA pode ser direcionado para uma frequência de negociação mais alta simplesmente retornando 0 quando BestInterval.GetTotal () <xxx, por exemplo, como você escreveu em algum post.

Dessa forma, ele parece inútil enquanto o problema está sendo resolvido.

 
Enrique Dangeroux:

Estou me referindo ao tempo médio de vida da posição (OrderCloseTime - OrderOpentime). Isso pode ser útil como critério personalizado do GA. Por exemplo, fazer com que o GA aumente a frequência de transações combinada com um lucro mínimo por limite de transação.

Forneça o critério de otimização como um código-fonte esquemático da função OnTester.

 

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

Bibliotecas: BestInterval

fxsaber, 2019.12.05 13:48 PM.

Dizer que estou satisfeito é claramente um eufemismo.... O BestInterval está incrível agora. E as alterações são mínimas. Como sempre, um exemplo.


Aqui está um passe de 24 horas.


Aplicamos o BestInterval clássico.

Profit = 8018.00 = 8018.00 + 0.00 (0.00%) - Amount of Delete Intervals = 0 (2019.09.14 - 2019.12.04)
00:00:00 - 23:59:59 : Profit = 8018.00 (100.00%), Total = 739 (73.34%), PF = 1.44, Mean = 10.85, DD = 1317.00, RF = 6.09
SUMMARY: 00:00:00 - 23:59:59 : Profit = 8018.00 (100.00%), Total = 739 (73.34%), PF = 1.44, Mean = 10.85, DD = 1317.00, RF = 6.09

Profit = 10721.00 = 8018.00 + 2703.00 (33.71%) - Amount of Delete Intervals = 1 (2019.09.14 - 2019.12.04), 13:00 - 08:00, CountHours = 18
00:00:00 - 08:03:48 : Profit = 3278.00 (30.58%), Total = 161 (79.50%), PF = 2.21, Mean = 20.36, DD = 518.00, RF = 6.33
13:07:59 - 23:59:59 : Profit = 7443.00 (69.42%), Total = 389 (74.55%), PF = 2.14, Mean = 19.13, DD = 417.00, RF = 17.85
SUMMARY: 00:00:00 - 23:59:59 : Profit = 10721.00 (100.00%), Total = 550 (76.00%), PF = 2.16, Mean = 19.49, DD = 536.00, RF = 20.00

Podemos ver que o lucro aumentou em um terço, e outros indicadores ficaram melhores.


Mas queríamos flexibilidade. E aqui está.

Profit = 8018.00 = 8018.00 + 0.00 (0.00%) - Amount of Delete Intervals = 0 (2019.09.14 - 2019.12.04)
00:00:00 - 23:59:59 : Profit = 8018.00 (100.00%), Total = 739 (73.34%), PF = 1.44, Mean = 10.85, DD = 1317.00, RF = 6.09
SUMMARY: 00:00:00 - 23:59:59 : Profit = 8018.00 (100.00%), Total = 739 (73.34%), PF = 1.44, Mean = 10.85, DD = 1317.00, RF = 6.09

Profit = 4868.00 = 8018.00 + -3150.00 (-39.29%) - Amount of Delete Intervals = 1 (2019.09.14 - 2019.12.04), 20:00 - 01:00, CountHours = 4
00:00:00 - 01:31:54 : Profit = 1067.00 (21.92%), Total = 32 (87.50%), PF = 4.63, Mean = 33.34, DD = 177.00, RF = 6.03
19:29:54 - 23:59:59 : Profit = 3801.00 (78.08%), Total = 118 (83.90%), PF = 5.53, Mean = 32.21, DD = 249.00, RF = 15.27
SUMMARY: 00:00:00 - 23:59:59 : Profit = 4868.00 (100.00%), Total = 150 (84.67%), PF = 5.29, Mean = 32.45, DD = 310.00, RF = 15.70


O lucro não aumentou, ele diminuiu! Mas veja os outros indicadores. Em vez de encontrar o intervalo com o maior lucro e a maior probabilidade de ajuste, foi encontrado um intervalo muito mais estreito, mas muito mais saboroso do que o clássico.


A inovação é adicionada da seguinte forma

#define  BESTINTERVAL_SLIPPAGE // Criando um filtro artificial para calcular o BestInterval.


A qualidade da pesquisa de padrão de mercado agora está muito melhor. Implicações significativas para o trabalho com vários testadores.


É interessante que, se o intervalo tão saboroso encontrado for colocado no TS e começar a otimizá-lo para obter o máximo de lucro, há uma grande probabilidade de que seja encontrada uma besteira.


E outra observação. O BestInterval, por exemplo, ignora as negociações abertas da meia-noite à uma hora. Isso não significa que, se um sinal de abertura chegar às duas horas, o BestInterval permitirá que você o abra. O Bibla só abrirá se a posição ignorada da meia-noite estiver "fechada". Portanto, você pode ver com frequência que a otimização de um TS com um intervalo rigidamente definido fornece resultados piores do que o BestInterval mostra.


O exemplo mais óbvio é uma TS de contra-tendência em uma tendência. Vamos supor que o TS emita um sinal de VENDA e que a tendência esteja subindo. O BestInterval ignorará esses sinais.

 

Observei essa peculiaridade, que se baseia em minha experiência.


Se o critério de otimização não tiver nada a ver com a suavidade da curva do perfil. E o melhor resultado ainda assim apresentar uma curva suave, então não se trata de um ajuste.

Por exemplo, o critério é o lucro máximo. E a melhor passagem resulta em uma curva reta ascendente. Isso não é um ajuste.

Mas se o critério for o R^2 mínimo. E a melhor passagem resultar em uma curva reta para cima. Isso provavelmente é uma opção.


Tenho um dilema: o BestInterval é um critério de otimização independente ou não? Especialmente com seu truque de atribuição de Slippage.

 
Um exemplo específico do que foi dito acima. Peguei um TS de 24 horas e o otimizei no EURUSD, usando BestInterval e SlipPage ~ -12 pips. Esta é a imagem.
Profit = 490.00 = 490.00 + 0.00 (0.00%) - Amount of Delete Intervals = 0 (2020.07.01 - 2020.08.14)
00:00:00 - 23:59:59 : Profit = 490.00 (100.00%), Total = 183 (69.95%), PF = 1.03, Mean = 2.68, DD = 2441.00, RF = 0.20
SUMMARY: 00:00:00 - 23:59:59 : Profit = 490.00 (100.00%), Total = 183 (69.95%), PF = 1.03, Mean = 2.68, DD = 2441.00, RF = 0.20

Profit = 4858.00 = 490.00 + 4368.00 (891.43%) - Amount of Delete Intervals = 1 (2020.07.01 - 2020.08.14), 18:00 - 12:00, CountHours = 17
00:00:00 - 11:42:21 : Profit = 2925.00 (60.21%), Total = 68 (75.00%), PF = 1.89, Mean = 43.01, DD = 847.00, RF = 3.45
17:53:40 - 23:59:59 : Profit = 1933.00 (39.79%), Total = 36 (77.78%), PF = 2.06, Mean = 53.69, DD = 859.00, RF = 2.25
SUMMARY: 00:00:00 - 23:59:59 : Profit = 4858.00 (100.00%), Total = 104 (75.96%), PF = 1.95, Mean = 46.71, DD = 916.00, RF = 5.30

Ou seja, ele diz que, se você ignorar todas as negociações que não se enquadram no intervalo das 18:00 às 12:00, tudo ficará bem no histórico.


Eu costuro esse intervalo no TS, fazendo com que o TS não fique mais 24 horas por dia, e o otimizo para obter o máximo de lucro.

Profit = 1924.00 = 1924.00 + 0.00 (0.00%) - Amount of Delete Intervals = 0 (2020.07.01 - 2020.08.14)
00:00:00 - 23:59:59 : Profit = 1924.00 (100.00%), Total = 163 (69.94%), PF = 1.20, Mean = 11.80, DD = 2075.00, RF = 0.93
SUMMARY: 00:00:00 - 23:59:59 : Profit = 1924.00 (100.00%), Total = 163 (69.94%), PF = 1.20, Mean = 11.80, DD = 2075.00, RF = 0.93

O melhor passe da genética é, para dizer o mínimo, um lixo.


ZY Esse ainda é um exemplo fraco. Ele ocorre quando o BestInterval tem PF > 3 e o Optimiser fornece PF < 1.

 
fxsaber:

Tenho um dilema: o BestInterval é um critério de otimização independente ou não? Especialmente com seu chip de tarefa Slippage.

De fato, o Slippage é uma comissão. Quanto maior a comissão, mais bonito é o resultado que o BestInterval mostra no histórico.

Parece que a comissão não tem nada a ver com os padrões do mercado.

 

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

Expert Advisors: Validar

fxsaber, 2020.08.23 07:44 AM

Provavelmente não contei com as negociações CloseBy quando escrevi isso. Não me lembro mais de nada. É bem provável que o BestInterval tenha a mesma doença. Ainda não estou pronto para editá-lo. Obrigado pela informação.


Parece que você está certo. O BestInterval fornece resultados diferentes em termos de lucro potencial e intervalos de tempo para compensação e hedge. Ainda não analisei os detalhes, mas a lista de negociações parece incorreta à primeira vista; o horário de abertura dos fechamentos do CloseBy coincide principalmente com o horário de abertura da ordem de fechamento.