Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Maxim Dmitrievsky
17562
Maxim Dmitrievsky  

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

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

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

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

 

Maxim Dmitrievsky
17562
Maxim Dmitrievsky  

Код зигзага

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

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

Sergey Chalyshev
4902
Sergey Chalyshev  
Maxim Dmitrievsky:

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

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

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

Maxim Dmitrievsky
17562
Maxim Dmitrievsky  
Sergey Chalyshev:

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

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

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

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

George Merts
4099
George Merts  
Maxim Dmitrievsky:
 

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

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

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

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