Librerías: BestInterval - página 14

 
gspencer:
No sé nada acerca de la codificación o el trabajo con EA en Meta Editor, pero me gusta mucho su concepto con el BestInterval. ¿Sería demasiado problema para que usted me instruya sobre cómo agregarlo a la EA que tengo que me gustaría probar?

Trate de entender esta discusión hilo.

Библиотеки: BestInterval
Библиотеки: BestInterval
  • 2018.10.12
  • www.mql5.com
Статьи и техническая библиотека по автоматическому трейдингу: Библиотеки: BestInterval
 
// Mostrar el gráfico de equilibrio BestInterval en el gráfico

#property strict
#property script_show_inputs

input int inAmountIntervals = 3; // Cuántos intervalos comerciales en el peor de los casos hay que tirar

#include <Graphics\Graphic.mqh> // https://www.mql5.com/es/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> // No es necesario si MT4.
#include <fxsaber\BestInterval\BestInterval.mqh> // Cálculo del mejor intervalo de negociación

void OnStart()
{
  BESTINTERVAL BestInterval; // Creado un objeto para calcular el mejor intervalo de negociación
  
  BestInterval.Set(); // Publicado un historial de pujas
          
  for (int i = 0; i < inAmountIntervals; i++)
    if (BestInterval.DeleteWorseInterval()) // Si se ha tirado algo
      Print(BestInterval.ToString());       // Imprimamos los datos comerciales obtenidos
    else
      break;                                // De lo contrario, estamos fuera
      
  double Profits[];
  double Balance[];
  
  const int Size = ArrayResize(Balance, BestInterval.GetProfits(Profits) + 1); // Obtuvo los beneficios de BestInterval-transaction
  Balance[0] = 0;  
  
  // Calcular la curva de equilibrio
  for (int i = 1; i < Size; i++)
    Balance[i] = Balance[i - 1] + Profits[i - 1];
    
  ToChart(Balance); // Visualizado.
}
 
Si inserta esto al final de cualquier EA de la entrega estándar
// Transmitir las cotizaciones de cada pasada del Optimizador al Terminal. Aplicarles BestInterval y visualizarlas.

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

input int inAmountIntervals = 1; // Cuántos intervalos comerciales en el peor de los casos hay que tirar

// Salida del 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();   
}

// Recoge la historia del comercio
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));    
}

// Desde aquí (Agente) enviaremos datos al Terminal
double OnTester()
{
  DEAL_BASE Deals[];
  
  if (MQLInfoInteger(MQL_OPTIMIZATION) && GetDeals(Deals)) // Si Optimización, historial comercial recopilado
  {    
    CONTAINER<uchar> Container; // https://www.mql5.com/ru/forum/95447/page4#comment_5464205
    
    Container[0] = Deals; // Poner el historial de pujas en un contenedor
  
    FrameAdd(NULL, 0, 0, Container.Data); // Envío de datos del Agente al Terminal
  }
  
  return(0);
}

// Aquí (Terminal) recibir datos de los 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 pase
    
    DEAL_BASE Deals[];
   
    // Datos recibidos del Agente
    Container[0].Get(Deals);
          
    BESTINTERVAL BestInterval; // Creado un objeto para calcular el mejor intervalo de negociación
    
    BestInterval.Set(Deals);   // Publicado el historial de pujas transmitido

    Print(BestInterval.ToString() + "\n");           // Imprimamos los datos comerciales obtenidos
            
    for (int i = 0; i < inAmountIntervals; i++)
      if (BestInterval.DeleteWorseInterval())        // Si se ha tirado algo
        Print(BestInterval.ToString() + "\n");       // Imprimamos los datos comerciales obtenidos
      else
        break;                                       // De lo contrario, estamos fuera
        
    double Profits[];
    double Balance[];
    
    const int Size = ArrayResize(Balance, BestInterval.GetProfits(Profits) + 1); // Obtenemos los beneficios de BestInterval-transaction
    Balance[0] = 0;  
    
    // Calcular la curva de equilibrio
    for (int i = 1; i < Size; i++)
      Balance[i] = Balance[i - 1] + Profits[i - 1];
      
    ToChart(Balance); // Visualizado.    
  }
}


verá algo como esto en el registro de la Terminal (por el ejemplo de las Medias Móviles estándar)

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


Y el gráfico muestra el gráfico BestInterval-profit del pase correspondiente


 

Pasaba por aquí. Lo leí.

La descripción dice: "

  • La idea es del autor. Puede haber análogos.

"

Algo más generalizado describí en un blog en inglés(parte 1, parte 2). Hacer secciones transversales sólo sobre intervalos de tiempo es un enfoque muy especializado. En idea, las secciones transversales sobre otros parámetros podrían ser igualmente interesantes.

 
Stanislav Korotky:

Pasaba por aquí. Lo leí.

La descripción dice: "

  • La idea es del autor. Puede haber análogos.

"

Algo más generalizado describí en el blog inglésapertura de la posición. En consecuencia, todas las posiciones del historial de operaciones pueden compararse con estos valores de MA.

Y luego aplicamos BestInterval a estos MAs. Y en la salida obtenemos los rangos de МАшки en los que se deben abrir posiciones, y en cuáles - no.


Por supuesto, puede utilizar cualquier función numérica en lugar de una MA. Como resultado, usted puede encontrar filtros fresco que superan el tiempo.

 
fxsaber:

Por desgracia, la barrera del idioma me impide adentrarme en su trabajo. Sobre el interés en otros filtros, por supuesto, estoy de acuerdo

¿Desde cuándo existe tal barrera? ;-) Antes estaba claro. ¿O he metido la pata con el inglés?

 
Stanislav Korotky:

¿Desde cuándo existe tal barrera? ;-) Antes estaba claro. ¿O es que me he equivocado con el inglés?

Siempre había una barrera. A veces iba directamente - leyendo el código fuente.

 
fxsaber:

Por desgracia, la barrera del idioma me impide adentrarme en su trabajo. Sobre el interés en otros filtros, por supuesto, estoy de acuerdo

Dios es tu juez.

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

void OnStart()
{
  BESTINTERVAL BestInterval;

  // Valores correspondientes para todo el BestInterval
  Print(BestInterval.GetTotal());          // Número de posiciones cerradas.
  Print(BestInterval.GetTotalPlus());      // Número de posiciones cerradas rentables.
  Print(BestInterval.GetTotalMinus());     // Número de posiciones cerradas no rentables.
  Print(BestInterval.GetMean());           // Expectativa matemática
  Print(BestInterval.GetProfit());         // Beneficio
  Print(BestInterval.GetProfitFactor());   // Factor de beneficio
  Print(BestInterval.GetProfitPlus());     // Beneficio de las transacciones positivas
  Print(BestInterval.GetProfitMinus());    // Pérdida de transacciones negativas
  Print(BestInterval.GetRecoveryFactor()); // Factor de recuperación
  Print(BestInterval.GetMaxDrawDown());    // Disminución máxima absoluta del saldo

  Print(BestInterval.GetAmountDeleteIntervals()); // Número de intervalos malos eliminados

  INTERVAL Intervals[];

  const int Size = BestInterval.GetIntervals(Intervals); // Obtener los intervalos que componen el BestInterval

  // Para cada intervalo imprimimos sus índices
  for (int i = 0; i < Size; i++)
  {
    Print(Intervals[i].Total);          // Número de posiciones cerradas.
    Print(Intervals[i].TotalPlus);      // Número de posiciones cerradas rentables.
    Print(Intervals[i].TotalMinus);     // Número de posiciones cerradas no rentables.
    Print(Intervals[i].Mean);           // Expectativa matemática
    Print(Intervals[i].Profit);         // Beneficio
    Print(Intervals[i].ProfitFactor);   // Factor de beneficio
    Print(Intervals[i].ProfitPlus);     // Beneficio de las transacciones positivas
    Print(Intervals[i].ProfitMinus);    // Pérdida de transacciones negativas
    Print(Intervals[i].RecoveryFactor); // Factor de recuperación
    Print(Intervals[i].MaxDrawDown);    // Disminución máxima absoluta del saldo

    Print(Intervals[i].OpenTime);       // Intervalo tiempo abierto.
    Print(Intervals[i].CloseTime);      // Hora de cierre del intervalo.
  }
}
 
Stanislav Korotky:

Realizar secciones transversales sólo por intervalos de tiempo es un enfoque muy especializado. De hecho, las secciones transversales por otros parámetros no pueden ser menos interesantes.

He estado pensando y pensando, pero no se me ha ocurrido algo que pueda filtrarse tan eficazmente como el tiempo.

Este algo no debe ser parte de la estrategia y debe influir directamente en el comportamiento del mercado.

¿pila? ¿otros datafeeds?

y otra pregunta - ¿tiene sentido hacer hipercubos? en teoría, individualmente también debería filtrarse bien.