Aprendizaje automático en el trading: teoría, práctica, operaciones y más - página 2065

 
Evgeniy Chumakov:

Suponiendo que no hay huecos en el historial y que hay 1440 minutos en todos los días (menos el viernes), el código debería ser así

Hay huecos incluso en el eurusd. Trabajar con el tiempo de la barra
 
elibrarius:
Las brechas se producen incluso en el eurusd. Trabajar con el tiempo de la barra


Es comprensible, si lo hiciera, es lo que haría. Esto es sólo para que sea más fácil de explicar.

 

De alguna manera, parece que funciona) Para guardar, se recoge una nueva fila en rates[i].high

#property script_show_inputs
//+------------------------------------------------------------------+
input datetime tstart = D'2020.5.1 00:00';  // начало промежутка исследуемого времени
input datetime tstop = D'2020.10.1 00:00';   // конец промежутка исследуемого времени
string zztn = "dvol\\" + _Symbol + ".txt"; // text file name
//+------------------------------------------------------------------+
#define  NM 1440
ulong NSM = 60;
ulong NSD = 60 * 1440;
//+------------------------------------------------------------------+
void OnStart()
{
  MqlRates rates[];
  double vol[NM] = {0.0}, d;
  int n[NM] = {0}, t;
  int nprice = CopyRates(Symbol(), PERIOD_M1, tstart, tstop, rates);
  for(int i = 0; i < nprice; ++i)
  {
    t = (int)((((ulong)rates[i].time) % NSD) / NSM);
    d = rates[i].close - rates[i].open;
    ++n[t];
    vol[t] += d * d;
  }
  for(int i = 0; i < NM; ++i)
  {
    if(n[i] > 1) vol[i] /= n[i];
    vol[i] = sqrt(vol[i]);
  }
  for(int i = 0; i < nprice; ++i)
  {
    t = (int)((((ulong)rates[i].time) % NSD) / NSM);
    if(vol[t] > 0) rates[i].high = (rates[i].close - rates[i].open) / vol[t];
    if(i > 0) rates[i].high += rates[i - 1].high;
  }
  int ft = FileOpen(zztn, FILE_WRITE | FILE_COMMON | FILE_ANSI | FILE_TXT);
  FileWriteString(ft, "t p");
  for(int i = 0; i < nprice; ++i)
    FileWriteString(ft, "\n" + (string)((ulong)rates[i].time) + " "  + (string)rates[i].high);
  FileClose(ft);
}
 
Aleksey Nikolayev:

De alguna manera, parece que funciona) Para guardar, la nueva fila se recoge en rates[i].high

Se normalizan los compases pasados, por ejemplo, de 2020.5.1 00:00 a los compases del futuro, c 2020.10.1 00:00 y los intermedios.
No se puede hacer en el mercado real.
Hay que hacer el mismo cálculo para cada barra, pero sólo para las barras pasadas.

 
Aleksey Nikolayev:

De alguna manera, parece que funciona) Para guardar, la nueva fila se recoge en rates[i].high

Incluso si lo haces bien, puedes reproducir con mucha precisión esas alturas de velas normalizadas con net/forest.
Como fetches alimentamos 60 alturas de velas con desplazamiento de día, y enseñamos las alturas normalizadas obtenidas en su código.
La formación debe ser casi 100% precisa.

Es decir, las alturas de las velas normalizadas no contienen ninguna información nueva.
La única ventaja es que no es necesario pasar 60 características adicionales a la formación del modelo.
Es poco probable que alguien presente como fichas barras de 2 meses de antigüedad, es decir, información nueva para los que no las han presentado, todavía hay).

Por supuesto, habría que comprobar si estas alturas de las velas normalizadas mejoran la eficiencia del modelo, y por supuesto habría que utilizarla (o una de sus fichas, que es más preferible, o la 60 que la compone).

 
Comprobemos ya algo, de lo contrario se han escrito tres páginas, se ha desperdiciado energía, y el incremento en el error Dios quiera que sea de medio punto.
 
elibrarius:

Eso es extraño. Me pregunto cómo podría explicarse.
Tengo otra versión comentada, pero no me ha gustado por razones lógicas:

¿Qué RandomInteger() utilizas? Yo soy XOR.

No sé cómo explicarlo :)

Tomé esta función

int RandomInteger(int max_vl)
{
   return (int)MathFloor((MathRand()+MathRand()*32767.0)/1073741824.0*max_vl);  //случайное Int от 0 до  1073741824
}
 

Maxim, tengo la sospecha de que el modelo para C++ no se descarga correctamente de CatBoost - ¿puedes compararlo con el modelo para python?

Tengo una discrepancia entre los valores de interpretación del modelo en MQL5 donde los valores se toman del modelo CPP y los valores del modelo binario. El delta es de alrededor de 0,15, que es mucho.

 
elibrarius:

Se normalizan los compases pasados, por ejemplo, desde 2020.5.1 00:00 hasta los compases futuros, desde 2020.10.1 00:00 y los intermedios.
Esto no se hace en el mundo real.
Hay que hacer más o menos el mismo cálculo a partir de cada barra, pero sólo a partir de las barras pasadas por ella.

Sí, mirar hacia el futuro está ahí, así como otros problemas que no son inmediatamente obvios. No es del todo aplicable para el comercio directo, pero es insustituible para el análisis preliminar. Por ejemplo, la correlación entre incrementos irrelevantes no tiene sentido.

 
Aleksey Nikolayev:

Sí, se vislumbra el futuro, así como otros problemas que no son inmediatamente evidentes. Directamente, para el comercio directo no es del todo aplicable, pero para el análisis preliminar es indispensable. Por ejemplo, no tiene sentido calcular la correlación entre incrementos no relativos.

Lo tendré en cuenta y quizás algún día lo vuelva a hacer para los bares anteriores y comprobar si mejora la entrenabilidad.
Si alguien lo ha comprobado antes, por favor, hágamelo saber.

¿Cuál es el análisis preliminar? Se introduce el modelo en la entrada y se compara con o sin esta característica.

Creo que es mejor normalizarlo por los últimos 30 minutos.
Como alternativa, los últimos 30 minutos de este día y los últimos 5 días de 30 minutos.

Por la forma en que ha cambiado la volatilidad en marzo, su variante tardará mucho tiempo en adaptarse, un mes o mes y medio los valores actuales serán mucho más altos que hace uno o dos meses. Como resultado, el modelo trabajará en una zona desconocida. Sencillamente, no dispondrá de ejemplos de este tipo de trabajos en los que basarse para hacer previsiones.

Con la normalización de la última semana, aprenderá más rápido las nuevas reglas del juego.
Razón de la queja: