Librerías: BestInterval - página 23

 
fxsaber:

Esto es lo único que he hecho hasta ahora

El resto no es necesario corregirlo por lotes. Pero hay errores relacionados con el otro (viejo). Es necesario corregir.

Actualizado. En el modo BestInterval activado recomiendo utilizar esta opción.

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

Bibliotecas: Virtual

fxsaber, 2019.12.11 12:15 pm.

Es difícil decir cuándo los desarrolladores arreglarán la situación con la normalización de los precios iniciales de los símbolos y si lo harán en absoluto. Por eso se ha introducido este modo.
// https://www.mql5.com/ru/forum/321656/page34#comment_14192799
#define  TICKS_FORCE_NORMALIZE // Normalización forzada de los precios de entrada
 

Un comportamiento bastante inesperado.

Parece que si lo ejecuta una vez con Action=false, guardará el resultado de la pasada en un archivo y podrá aplicarlo más tarde. Pero lo inesperado es que también guardará todos los parámetros como Total, RF, DD, etc. En otras palabras, si lo ejecuta con Action=true en otro intervalo del mismo símbolo, otro símbolo, etc., no sólo aplicará el mejor momento para operar, sino que también mentirá en el registro, dando los valores antiguos.

 
traveller00:

Si luego lo ejecuta con Action=true en otro intervalo del mismo símbolo, otro símbolo, etc., no sólo aplicará el mejor momento para operar, sino que también mentirá en el registro, dando los valores antiguos.

No muestra los valores de la ejecución verdadera, muestra los datos de la ejecución falsa que se aplicó. Puede cambiar el símbolo, el intervalo, etc., los valores que muestra no cambiarán. Sólo son relevantes para el momento en que se realizó la entrada. Esto se hace a propósito.

 
Por si acaso, me gustaría señalar que desde el punto de vista de la arquitectura no funciona correctamente con StopLoss. Teóricamente, el StopLoss disparado en action=false puede caer dentro del rango que BestInterval decida lanzar. En consecuencia, cuando action=true se desplazará, y las cifras resultantes pueden ser a veces muy diferentes de las previstas cuando action=false.
 
traveller00:
Por si acaso, me gustaría señalar que desde el punto de vista de la arquitectura no funciona correctamente con StopLoss. Teóricamente, el StopLoss disparado en action=false puede caer en el rango que BestInterval decide lanzar. Como resultado, se desplazará en action=true, y las cifras resultantes pueden ser a veces muy diferentes de las previstas en action=false.

Parece que hay algo que no entiende. Incluso teóricamente no debería haber problemas.

 
Sí, el problema parece ser que Sync, que se incluye en Virtual y que utiliza BestInterval, ignora StopLoss y TakeProfit. El problema no es arquitectónico, soy yo que no acabo de entenderlo.
 
traveller00:
Sí, el problema parece ser que Sync, que se incluye en Virtual y que utiliza BestInterval, ignora StopLoss y TakeProfit. El problema no es arquitectónico, soy yo que no acabo de entenderlo.

Estoy escribiendo TC a través de limitadores y tomadores, por lo que sería bueno mostrar un ejemplo primitivo de reproducir el problema.

 
Cuando active=true en BestInterval.mqh hay voidOnTick( void ), dentro de él SYNC::Positions<BEST_TIME>();, que llevará en Sync.mqh a staticvoid Positions( constint Handle = 0, constbool Reverse = false ). Dentro, se recalculan los lotes y si caen dentro del intervalo requerido, se transfieren del entorno virtual al real mediante SYNC::NewOrderSend(_Symbol, Type, ::MathAbs(AddLots), Price, 100, 0, 0, 0);;. Es un poco extraño que el precio no se tome de las posiciones, sino que se lea en su sitio, pero no pasa nada. Como puedes ver, se pasan cero StopLoss y TakeProfit. Tal vez usted está utilizando la opción BESTINTERVAL_LIMITSYNC_NETTING, donde TakeProfit se tiene en cuenta.
 
traveller00:
Cuando active=true en BestInterval.mqh hay voidOnTick( void ), dentro de él SYNC::Positions<BEST_TIME>();, que llevará en Sync.mqh a staticvoid Positions( constint Handle = 0, constbool Reverse = false ). Dentro, se recalculan los lotes y si caen dentro del intervalo requerido, se transfieren del entorno virtual al real mediante SYNC::NewOrderSend(_Symbol, Type, ::MathAbs(AddLots), Price, 100, 0, 0, 0);;. Es un poco extraño que el precio no se tome de las posiciones, sino que se lea en su sitio, pero no pasa nada. Como puedes ver, se pasan cero StopLoss y TakeProfit. Tal vez usted está utilizando la opción BESTINTERVAL_LIMITSYNC_NETTING, donde TakeProfit se tiene en cuenta.

Sí, yo uso este modo. true-mode se hizo más para la demostración. Ni siquiera pensé en perder el tiempo en una solución universal, porque todo sería en vano.

Si usted hace un poco de retoques, puede utilizar BestInterval-true para pases individuales de EAs con código fuente cerrado (Mercado, etc.).

Pero aún así, la principal característica de BestInterval es trabajar en el modo de optimización. True es una característica buena, pero no obligatoria.

 
  int FromFile( const string FileName = __FILE__, const int CommonFlag = 0 )
  {
    const bool Res = (::FileLoad(FileName, this.Intervals, CommonFlag) > 0) && (this.IsCalculated = true);

    if (Res)
    {
      this.AmountDeleteIntervals = ::ArraySize(this.Intervals) - (this.Intervals[0].OpenTime ? 0 : 1);

      this.FullInterval.Calculate(this.Intervals);
    }
    else
      ::Print("ERROR: Can not load the File " + FileName + "!");

    return(Res);
  }
Arreglo cosmético menor, int => bool. O si se me permite sugerir devolver AmountDeleteIntervals en su lugar.