Asesores en redes neuronales, compartiendo experiencias.

 

Hay poca información en el foro sobre las soluciones preparadas y la eficacia de las redes neuronales para operar en el mercado. Sugiero debatir y compartir la experiencia aquí. Si ya existe un hilo de discusión, por favor, enlaza con él.

Estoy usando clases de aquí, simple Perspectron multicapa. Espero que las clases cuenten correctamente, cuento con la experiencia del autor. Empezó a experimentar, interesante :)

En este momento tengo 11 induks en la entrada, la salida es un zigzag desplazado en 1 barra hacia el futuro.

Estos son los resultados de mi cuadrícula de 8 meses. Estoy entrenando en 1000 barras, 10000 épocas, 70 neuronas en una capa oculta. Las señales se invierten y son puramente por red neuronal, sin filtros adicionales. 15 min tf.

 

Código Zigzag

//+------------------------------------------------------------------+
//|                                                       FastZZ.mq5 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, Yurich"
#property link      "https://login.mql5.com/ru/users/Yurich"
#property version   "1.00"
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 1
#property  indicator_label1  "ZZ"
#property  indicator_type1   DRAW_ZIGZAG
#property  indicator_color1  clrRed
#property  indicator_style1  STYLE_SOLID
#property  indicator_width1  1
//+------------------------------------------------------------------+
input int Depth=2000; // Minimum points in a ray
//+------------------------------------------------------------------+
double zzH[],zzL[];
double depth;//, deviation;
int last,direction;
//+------------------------------------------------------------------+
void OnInit()
  {
   SetIndexBuffer(0,zzH,INDICATOR_DATA);
   SetIndexBuffer(1,zzL,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,Digits());
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
   depth=Depth*_Point;
//deviation=10*_Point;
   direction=1;
   last=0;
  }
//+------------------------------------------------------------------+
int OnCalculate(const int total,
                const int calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick[],
                const long &real[],
                const int &spread[])
  {
   if(calculated==0) last=0;
   for(int i=calculated>0?calculated-1:0; i<total-1; i++)
     {
      bool set=false;
      zzL[i]=0;
      zzH[i]=0;
      //---
      if(direction>0)
        {
         if(high[i]>zzH[last])//-deviation)
           {
            zzH[last]=0;
            zzH[i]=high[i];
            if(low[i]<high[last]-depth)
              {
               if(open[i]<close[i]) zzH[last]=high[last]; else direction=-1;
               zzL[i]=low[i];
              }
            last=i;
            set=true;
           }
         if(low[i]<zzH[last]-depth && (!set || open[i]>close[i]))
           {
            zzL[i]=low[i];
            if(high[i]>zzL[i]+depth && open[i]<close[i]) zzH[i]=high[i]; else direction=-1;
            last=i;
           }
        }
      else
        {
         if(low[i]<zzL[last])//+deviation)
           {
            zzL[last]=0;
            zzL[i]=low[i];
            if(high[i]>low[last]+depth)
              {
               if(open[i]>close[i]) zzL[last]=low[last]; else direction=1;
               zzH[i]=high[i];
              }
            last=i;
            set=true;
           }
         if(high[i]>zzL[last]+depth && (!set || open[i]<close[i]))
           {
            zzH[i]=high[i];
            if(low[i]<zzH[i]-depth && open[i]>close[i]) zzL[i]=low[i]; else direction=1;
            last=i;
           }
        }
     }
//----
   zzH[total-1]=0;
   zzL[total-1]=0;
   return(total);
  }
//+------------------------------------------------------------------+

Los búferes de los indicadores contienen sólo los valores altos y bajos, relleno los datos intermedios en el bucle, convirtiéndolos en 1 - al alza en la barra actual, -1 a la baja. Parece que es correcto, pero si hay errores, por favor corríjanme

void FillZZarray()
{
  ArrayResize(zz,vector);   
   int lastcountbar = 0;
   for(int i=0;i<vector;i++) // Заполняем массив выходов
     {
      if(zzH[i]>0)  
       {
        zz[i]=1; lastcountbar = 1;
        if(i!=0)
          for(int q=i-1;q>=0;q--)
           {
            if(zz[q]==0)zz[q]=lastcountbar;
           } 
       }    
      if(zzL[i]>0) 
       {
        zz[i]=-1; lastcountbar = -1; 
        if(i!=0)
          for(int q=i-1;q>=0;q--)
           {
            if(zz[q]==0)zz[q]=lastcountbar;
           } 
       } 
      if(zzH[i]==0 && zzL[i]==0) zz[i] = lastcountbar;
     }
}
 
¡Genial! Sólo al ponerlo en el real, intercambia las señales de compra y venta.
 
Vladimir Tkach:
¡Genial! Sólo cuando se pone en el real, cambiar las posiciones de las señales de compra y venta.
¿Por qué? )
 
Maxim Dmitrievsky:
¿Por qué? )
El presagio es este. Después de las pruebas.
 
Vladimir Tkach:
El presagio es este. Después de las pruebas.
Pero, en serio, hablemos de ello, si tienes algo que decir). No es que esté aquí para jugar :)
 
Maxim Dmitrievsky:
No, en serio... hablemos de ello, si tienes algo). No es que esté aquí para jugar :)
Pruebe este tutorial.
Sampler
Sampler
  • votos: 33
  • 2012.06.01
  • Serj
  • www.mql5.com
Индикатор i_Sampler рассчитывает идеальные входы, предназначен для обучения нейросети.
 
Sergey Chalyshev:
Prueba este inductor para el entrenamiento.

Necesito un vector de datos de entrada para el entrenamiento, y aquí las señales se interrumpen - luego compran, luego venden, luego se saltan... y no sé cómo rellenarlas, no con ceros... No sé cómo llenarlos de ceros... El zigzag, en mi opinión, proporciona entradas no menos perfectas, pero puedo estar equivocado... No tengo mucha experiencia en redes neuronales todavía...

 
Maxim Dmitrievsky:

Necesito un vector de datos de entrada para el entrenamiento, y aquí las señales se interrumpen - luego compran, luego venden, luego se saltan... y no sé cómo rellenarlas, no con ceros... No sé cómo llenarlos de ceros, no está claro... El zigzag, en mi opinión, proporciona entradas no menos perfectas, pero puedo estar equivocado... No tengo mucha experiencia en redes neuronales todavía...

El indicador dispone de dos tipos de señales, discretas y analógicas a elegir. Rellena los huecos con ceros.

¿La foto del primer post es la muestra de entrenamiento? Si está fuera de muestra es interesante ver en la muestra de entrenamiento, con tantas neuronas la red debería memorizar todos los datos de entrada de memoria.

 
Sergey Chalyshev:

Hay dos tipos de señal en el indicador, discreta y analógica a elegir. Rellena los huecos con ceros.

¿La foto del primer post es una muestra de entrenamiento? Si está fuera de muestra es interesante mirar la muestra de entrenamiento, con tantas neuronas la red debería memorizar todos los datos de entrada de memoria.

La muestra de entrenamiento son los últimos 1000 compases, o más bien los primeros si se mira desde el 0 como en las series temporales, todo lo anterior está fuera de muestra.

Lo probaré mañana a ver qué muestra. Hasta ahora atornillado el segundo zigzag, más grande, mirando cómo funciona en 2 salidas. Nada destacable hasta el momento, funciona de media a cero :)

 
Maxim Dmitrievsky:

en promedio funciona a cero :)

Por eso te han sugerido que cambies de compra a venta.

Todavía no he oído que nadie gane dinero estable con las redes neuronales, es muy inestable. Los TS más sencillos en los muwings - y funcionan más estables.

Razón de la queja: