ニューラルネットワークのアドバイザー、経験を共有する。

Maxim Dmitrievsky  

フォーラムには、既成のソリューションや、市場での取引にニューラルネットワークが有効であるという情報はほとんどない。ここで議論し、経験を共有することをお勧めします。すでに議論されているスレッドがある場合は、そちらにリンクを張ってください。

私はここにある クラス、シンプルなマルチレイヤーPerspectronを使用しています。クラスが正しくカウントされることを願っています。私は著者の経験を頼りにしています。実験開始、面白いです :)

現在、11個のインデックスを入力し、出力は1小節分未来にずらしたジグザグになっています。

これが、8ヶ月間のグリッドの結果です。1000本のバー、10000回のエポック、隠れ層の70ニューロンで学習しています。信号は、追加のフィルターを使用せず、ニューラルネットワークによって反転され、純粋なものとなります。15分tf.

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  
カッコイイ!リアルに載せるときだけ、売買シグナルを入れ替える。
Maxim Dmitrievsky  
Vladimir Tkach:
カッコイイ!本番にかけるときだけ、売買シグナルの位置を変える。
なぜ?)
Vladimir Tkach  
Maxim Dmitrievsky:
なぜ?)
前兆はこうだ。テスト後。
Maxim Dmitrievsky  
Vladimir Tkach:
前兆はこうだ。テスト後。
真面目な話、言いたいことがあるなら話そうよ(笑)ゲームをするためにここにいるわけではないのですが......。)
Sergey Chalyshev  
Maxim Dmitrievsky:
いや、マジで...言いたいことがあるなら話そうぜ)ゲームをするためにここにいるわけではないのですが......。)
チュートリアルはこちらを お試しください。
Sampler
Sampler
  • 投票: 33
  • 2012.06.01
  • Serj
  • www.mql5.com
Индикатор i_Sampler рассчитывает идеальные входы, предназначен для обучения нейросети.
Maxim Dmitrievsky  
Sergey Chalyshev:
この インダクタをトレーニングに使ってみてはいかがでしょうか。

学習用の入力データのベクトルが必要なのですが、ここではシグナルが途切れていて、次に買い、次に売り、そしてスキップ...と、ゼロでなく、どうやって埋めればいいのかわかりません...。ジグザグは、完璧に近い入力を提供すると私は思っていますが、間違っているかもしれません...私はまだニューラルネットワークの経験が浅いので...。

Sergey Chalyshev  
Maxim Dmitrievsky:

学習用の入力データのベクトルが必要なのですが、ここではシグナルが途切れていて、次に買い、次に売り、そしてスキップ...と、ゼロでなく、どうやって埋めればいいのかわかりません...。ジグザグは完璧な入力だと思うのですが、間違っているかもしれません...。

インジケーターは、ディスクリートとアナログの2種類の信号を選択することができます。隙間をゼロで埋めてください。

最初の投稿の写真は、トレーニング用サンプルですか?もし、サンプル外であれば、学習用サンプルで見るのが面白い。これだけ多くのニューロンがあれば、ネットワークは すべての入力データを暗記しているはずだ。

Maxim Dmitrievsky  
Sergey Chalyshev:

インジケーターの信号は、ディスクリートとアナログの2種類から選択することができます。隙間をゼロで埋めてください。

最初の投稿の写真は、トレーニング用のサンプルでしょうか?もしサンプル外であれば、トレーニングサンプルを見てみるのも面白いでしょう。

学習用サンプルは最後の1000本というか、時系列で0番目から見ると最初の1本で、それ以前はすべてサンプル外です。

明日試してみて、どんな表示が出るか見てみます。これまで、2つ目のジグザグをねじ込み、2つの出力でどのように機能するかを見てきました。今のところ目立ったものはなく、ゼロベースで平均的に動作しています :)

Georgiy Merts  
Maxim Dmitrievsky:

は平均してゼロで動作する :)

だから、買いから売りへの切り替えを提案されたのですね。

ニューラルネットワークで安定的に稼いでいる人はまだ聞いたことがありません、非常に不安定です。ミューウィングの 最もシンプルなTS - そして、彼らはより安定した動作。

理由: