Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Используй MQL5 Cloud Network. Тестируй роботов с гиперскоростью!
Maxim Dmitrievsky
13826
Maxim Dmitrievsky 2015.08.27 13:58 

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

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

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

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

 

Maxim Dmitrievsky
13826
Maxim Dmitrievsky 2015.08.27 14:09  

Код зигзага

//+------------------------------------------------------------------+
//|                                                       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
19133
Vladimir Tkach 2015.08.27 17:42  
Клёво! Только когда будешь ставить на реал меняй местами сигналы на бай и селл.
Maxim Dmitrievsky
13826
Maxim Dmitrievsky 2015.08.27 17:59  
Vladimir Tkach:
Клёво! Только когда будешь ставить на реал меняй местами сигналы на бай и селл.
Зачем? )
Vladimir Tkach
19133
Vladimir Tkach 2015.08.27 18:01  
Maxim Dmitrievsky:
Зачем? )
Примета такая. После тестирования.
Maxim Dmitrievsky
13826
Maxim Dmitrievsky 2015.08.27 18:03  
Vladimir Tkach:
Примета такая. После тестирования.
Не, ну если серьезно.. давай по теме, если есть че ) Я тут как бы не в бирюльки играть собрался :)
Sergey Chalyshev
4511
Sergey Chalyshev 2015.08.27 22:39  
Maxim Dmitrievsky:
Не, ну если серьезно.. давай по теме, если есть че ) Я тут как бы не в бирюльки играть собрался :)
Попробуйте этот индюк для обучения.
Sampler
Sampler
  • голосов: 33
  • 2012.06.01
  • Serj
  • www.mql5.com
Индикатор i_Sampler рассчитывает идеальные входы, предназначен для обучения нейросети.
Maxim Dmitrievsky
13826
Maxim Dmitrievsky 2015.08.27 23:27  
Sergey Chalyshev:
Попробуйте этот индюк для обучения.

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

Sergey Chalyshev
4511
Sergey Chalyshev 2015.08.27 23:45  
Maxim Dmitrievsky:

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

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

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

Maxim Dmitrievsky
13826
Maxim Dmitrievsky 2015.08.28 00:13  
Sergey Chalyshev:

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

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

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

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

George Merts
3609
George Merts 2015.08.28 06:46  
Maxim Dmitrievsky:
 

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

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

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

12345678...10
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий