Советники на нейросетях, делимся опытом.

 

Мало информации есть на форуме о уже готовых решениях, и эффективности нейросети для торговли на рынке. Предлагаю обсуждать и делиться опытом здесь. Если уже есть ветка с обсуждением, просьба линкнуть. 

Использую классы отсюда, обычный многослойный персептрон. Надеюсь, классы считают все правильно, рассчитываю на опытность автора. Начал экспереметировать, интересно :)

На данный момент у меня на входе 11 индюков, на выходе зигзаг, смещенный на 1 бар в будущее.

Вот такие результаты сейчас выдает сетка за 8 мес. Обучаю на 1000 барах, 10000 эпох, 70 нейронов в скрытом слое. Сигналы реверсные и чисто по нейросети, без дополнительных фильтров. 15 мин тф.

 

 

Код зигзага

//+------------------------------------------------------------------+
//|                                                       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);
  }
//+------------------------------------------------------------------+

 

Буферы индикатора содержат только значения хай и лоу, промежуточные данные я заполняю в цикле, преобразуя их в 1 - растущий на текущем баре, -1 падающий. Вроде бы правильно, но если есть ошибки - прошу поправить меня

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;
     }
}
 
Клёво! Только когда будешь ставить на реал меняй местами сигналы на бай и селл.
 
Vladimir Tkach:
Клёво! Только когда будешь ставить на реал меняй местами сигналы на бай и селл.
Зачем? )
 
Maxim Dmitrievsky:
Зачем? )
Примета такая. После тестирования.
 
Vladimir Tkach:
Примета такая. После тестирования.
Не, ну если серьезно.. давай по теме, если есть че ) Я тут как бы не в бирюльки играть собрался :)
 
Maxim Dmitrievsky:
Не, ну если серьезно.. давай по теме, если есть че ) Я тут как бы не в бирюльки играть собрался :)
Попробуйте этот индюк для обучения.
Sampler
Sampler
  • голосов: 33
  • 2012.06.01
  • Serj
  • www.mql5.com
Индикатор i_Sampler рассчитывает идеальные входы, предназначен для обучения нейросети.
 
Sergey Chalyshev:
Попробуйте этот индюк для обучения.

Мне нужен вектор входных данных для обучения, а тут сигналы прерываются - то бай то селл, то пропуски.. и чем их заполнять непонятно, не нулями же.. Зигзаг, по моему, не менее идеальные входы дает, но могу ошибаться.. слабо шарю еще в нейросетях..

 
Maxim Dmitrievsky:

Мне нужен вектор входных данных для обучения, а тут сигналы прерываются - то бай то селл, то пропуски.. и чем их заполнять непонятно, не нулями же.. Зигзаг, по моему, не менее идеальные входы дает, но могу ошибаться.. слабо шарю еще в нейросетях..

В индикаторе два вида сигналов, дискретный и аналоговый на выбор. Пропуски заполнять нулями.

Картинка в первом посте на обучающей выборке? Если это вне выборки то интересно посмотреть на обучающей выборке, при таком количестве нейронов сеть наизусть должна запомнить все входные данные.

 
Sergey Chalyshev:

В индикаторе два вида сигналов, дискретный и аналоговый на выбор. Пропуски заполнять нулями.

Картинка в первом посте на обучающей выборке? Если это вне выборки то интересно посмотреть на обучающей выборке, при таком количестве нейронов сеть наизусть должна запомнить все входные данные.

Обучающая выборка - это последние 1000 баров, вернее, первые, если смотреть с 0-го как в тайм серии, все что до этого - аут оф сэмпл. 

 Попробую завтра его прикрутить, посмотрим что выдает.. Пока что прикрутил второй зигзаг, более крупный, смотрю как на 2-х выходах работает. Ничего выдающегося до сих пор не выдала, в среднем в ноль работает :)

 
Maxim Dmitrievsky:
 

в среднем в ноль работает :)

Вот поэтому вам и предложили  поменять местами бай на селл.

Не слыхал пока, чтобы кто-то стабильно на нейросетях зарабатывал, очень нестабильно получается. Простейшие ТС на мувингах - и те работают стабильнее.