Librerías: BestInterval - página 24

 
Enrique Dangeroux:
Arreglo cosmético menor, int => bool. O si se me permite sugerir devolver AmountDeleteIntervals en su lugar.

Gracias, tendré que arreglarlo.

 

Por favor, considere AverageHolding como una adición a la 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;
  }



MejorIntervalo.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:

Por favor, considere AverageHolding como una adición a la biblioteca

Tiempo medio de vida de una posición cerrada - ¿para qué sirve?

No es así como debe calcularse. Es necesario conocer el tiempo de cierre.

 
fxsaber:

Duración media de una posición cerrada: ¿para qué sirve?

Me refiero al tiempo medio de vida de una posición (OrderCloseTime - OrderOpentime). Esto puede ser útil como criterio personalizado de GA. Por ejemplo, llevar a GA a aumentar la frecuencia de transacciones combinado con un umbral mínimo de beneficio por transacción.


fxsaber:

No es así como se calcula. Necesitas saber la hora de cierre.

Para la cuenta de compensación DEAL IN / OUT la hora de apertura es suficiente para el cálculo, para su correcta aplicación es necesario utilizar la hora de cierre, que actualmente no se tiene en cuenta en la biblioteca.

Hay un problema que persistirá. El probador fuerza el cierre de la última posición. La precisión del reloj atómico puede no ser necesaria para todas las estrategias, seguirá siendo un problema. También GA puede ser conducido a una mayor frecuencia de negociación simplemente devolviendo 0 cuando BestInterval.GetTotal () <xxx, por ejemplo como escribiste en algún post.

De esa manera parece inútil mientras que el problema es perseguir.

 
Enrique Dangeroux:

Me refiero al tiempo medio de vida de la posición (OrderCloseTime - OrderOpentime). Esto puede ser útil como criterio personalizado de GA. Por ejemplo, llevar a GA a aumentar la frecuencia de transacciones combinado con un umbral mínimo de beneficio por transacción.

Dar el criterio de optimización como un código fuente esquemático de la función OnTester.

 

Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading

Bibliotecas: BestInterval

fxsaber, 2019.12.05 13:48 PM.

Decir que estoy contento es claramente quedarse corto.... BestInterval es impresionante ahora. Y los cambios son mínimos. Como siempre, un ejemplo.


Aquí tenemos un pase de 24 horas.


Aplicamos el clásico BestInterval.

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 el beneficio ha aumentado en un tercio, y otros indicadores han mejorado.


Pero queríamos flexibilidad. Y aquí 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


El beneficio no aumentó, ¡disminuyó! Pero mire los otros indicadores. En lugar de encontrar el intervalo con mayor beneficio y probabilidad de ajuste, se encontró un intervalo mucho más estrecho, pero mucho más sabroso que el clásico.


La innovación se añade así

#define  BESTINTERVAL_SLIPPAGE // Crear un filtro artificial para calcular BestInterval.


La calidad de la investigación de patrones de mercado ha mejorado mucho. Implicaciones significativas para el trabajo con varios probadores.


Es interesante que si el intervalo encontrado tan sabroso se mete en el TS y se empieza a optimizarlo para obtener el máximo beneficio en él, hay una alta probabilidad de que se encuentre una gilipollez.


Y otra observación. BestInterval, por ejemplo, ignora las operaciones abiertas desde medianoche hasta una hora. Esto no quiere decir que si llega una señal de apertura a las dos, BestInterval le dejará abrirla. Bibla sólo la abrirá si la posición ignorada desde medianoche está "cerrada". Por lo tanto, a menudo se puede ver que optimizar una TS con un intervalo rígidamente establecido da peores resultados que los que muestra BestInterval.


El ejemplo más obvio es una TS contra tendencia sobre una tendencia. Supongamos que la TS da una señal de VENTA y la tendencia es alcista. BestInterval ignorará estas señales.

 

He observado una peculiaridad de este tipo, que se basa en mi experiencia.


Si el criterio de optimización no tiene nada que ver con la suavidad de la curva del perfil. Y el mejor resultado sigue dando una curva suave, entonces no es un ajuste.

Por ejemplo, el criterio es el máximo beneficio. Y la mejor pasada da como resultado una curva recta ascendente. Eso no es un ajuste.

Pero si el criterio es mínimo R^2. Y el mejor pase resulta en una recta hacia arriba. Eso es probablemente un ajuste.


Tengo un dilema, ¿es BestInterval un criterio de Optimización independiente o no? Especialmente con su truco de asignación de Deslizamiento.

 
Un ejemplo concreto de lo anterior. Tomé un TS de 24 horas y lo optimicé en EURUSD, usando BestInterval y SlipPage ~ -12 pips. Esta es la imagen.
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

Es decir, dice que si ignoras todas las operaciones que no caen dentro del intervalo 18:00-12:00, todo será hermoso en la historia.


Yo coso este intervalo en el TS, haciendo que el TS ya no sea redondo, y lo optimizo para obtener el máximo beneficio.

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

El mejor pase de la genética es, por decirlo suavemente, basura.


ZY Éste sigue siendo un ejemplo débil. Se produce cuando BestInterval tiene PF > 3 y Optimiser da PF < 1.

 
fxsaber:

Tengo un dilema, ¿es BestInterval un criterio de Optimización independiente o no? Especialmente con su chip de tarea Slippage.

De hecho, Slippage es una comisión. Cuanto más alta es la comisión, más bonito es el resultado que BestInterval muestra en el historial.

Parece que la comisión no tiene nada que ver con los patrones del mercado.

 

Foro sobre trading, sistemas automatizados de trading y prueba de estrategias de trading

Asesores Expertos: Validar

fxsaber, 2020.08.23 07:44 AM

Probablemente no contaba con operaciones CloseBy cuando lo escribí. Ya no me acuerdo de nada. Es muy probable que BestInterval tenga la misma dolencia. No estoy dispuesto a editarlo. Gracias por la información.


Parece que tienes razón. BestInterval da resultados diferentes tanto en términos de beneficio potencial como de intervalos de tiempo para la compensación y la cobertura. Todavía no he mirado los detalles, pero la lista de Operaciones parece incorrecta a primera vista, la hora de apertura para los cierres CloseBy cae mayoritariamente en la hora de apertura de la orden de cierre.