記事"MetaTrader 5での自己組織化機能マップ(Kohonenマップ)の使用"についてのディスカッション - ページ 4

 
Graff:

何に使うのかは知らない。端末から直接情報を得ることができる。

おそらく誰かが手動でカウントしているのだろう。

SZY: 誰かスクリプトなしで、Expert Advisorがターミナルから直接情報を取り込めるように改造してくれない?

まあ、怖いのであれば、もちろん無理でしょうけど)。
 
sergeev:
どのような情報が必要ですか?
つまり、SOM.mq5 Expert Advisorが独立して(DJ.mq5とFX.mq5スクリプトの助けを借りずに)ターミナルからデータを受信できるようにします。
 

この記事には、エキスパート・アドバイザーを取得するためのすべてが含まれていますか?

ニューラルネットワークエキスパートアドバイザーの 実装に興味があります。

 

フォーラムの皆さん、こんにちは!

とても興味深い記事ですね!私もこのSOMコードを使おうとしています。

ソムク

ウェイトp1-p4 - 市場からのデータ(今のところZZポイントの差だけ)。

p5 - 仮想買いトレードの結果 - TP=1, SL=-1 (今のところTP=SP=300pp)。順張りの場合、p5のBMU(最も近いベクトル)1つだけでは、結果を予測するには十分ではないように思えます。

どなたか、BMUからの距離を考慮して、BMUの周囲(わかりやすくするために青色)の結果を計算する方法を教えてください。

 
sealdo:

どなたか、BMUからの距離を考慮して、BMUの周囲(わかりやすいように青で囲んだ部分)の面積を計算する 方法を教えていただけませんか?

私が考えていたのもそうだったのですが、座標を使ってプログラム的にこの面積を求める方法ということですか?
 
progma137:
私もそう思っていたのですが、この面積を座標を使ってプログラムで求める方法ということですか?

CSOMクラスにはすでに関数があります:

int BestMatchingNode(double &vector[]); // 与えられたベクトルに基づいてグリッド内の最適なノードを見つける。

グリッドの次元を知れば、BMU(この実装ではBMN)の座標を計算するのは簡単です。
ここでは、BMUからの距離を考慮して、BMU周辺の領域の(1つのパラメータ(重み)による)合計結果を正確に計算したいと思います。例えば、直径 10 のニューロン(セル)の領域を考える。最も近いニューロンは結果に大きな影響を与える。そして遠ければ遠いほど弱くなる......。

ここで、グリッドの端に位置する BMU シェルをどのように扱うべきかという疑問がある。結局のところ、それらは隣人が少ないのだ。

 

地図上で小節を見つける方法を教えてください。

4つのベクトルを入力し、4つの地図を得ます。そのすべてのマップに軌跡を描きたいのですが、例えば、現在の日(日数分)から3つ前の小節までの軌跡を描き、クラスターの状態を分析したいのです。

例えば、void DrawTrajectory(int from, int count) 関数を使えば、すべてのマップに指定された小節番号からの軌跡を描く ことができます。

そして2番目の疑問は、どのようにして出力マップを得るか、そして最も重要なことは、頻度マップを得るか、ということです。

 

返事を待たずに...。入力ベクトルの指定された数から、指定されたステップ数だけ軌跡を入力マップに表示する方法を書いたのですが、何か間違っていたら許してください - 私はプログラマーではありません :)

誰か、このとても賢いライブラリ(作者とアレクセイ・セルゲーエフに感謝)を実用レベルにまで引き上げてくれないだろうか?


//------------------------------------------------------------------ ShowTrajectory
void CSOM::ShowTrajectory(int n_patern, int m_cnt) // 入力ベクトルの軌跡を示す方法
{
        if(m_cnt<=0) return;
        int idx=0,x[],y[], dy=0;
        string name[];
        ArrayResize(x,m_cnt);
        ArrayResize(y,m_cnt);
        ArrayResize(name,m_cnt);
        double data[]; ArrayResize(data, m_dimension);
   for(int ind=0; ind<m_nSet; ind++) // 訓練セットからのベクトル値でデータを設定する
  {
        if(ind<n_patern) continue;  // 必要な入力パターンを待つ
        for(int k=0; k<m_dimension; k++) data[k]=m_set[m_dimension*(ind)+k];
        int winningnode=BestMatchingNode(data); // 最も近いノードのインデックスを見つける
                
         // トレース用に選択された入力パターンの座標を保存する
        int x1,y1,x2,y2;
        m_node[winningnode].GetCoordinates(x1,y1,x2,y2);
        if(m_bHexCell) // もし六角形なら
      {
          int x_size=int(MathAbs(x2-x1));
          int y_size=int(MathAbs(y2-y1));
          dy=y_size;
          y1=y1+y_size/4; 
          y2=y2+y_size/4;
      }
        x[idx]=(x1+x2)/2;
        y[idx]=(y1+y2)/2;               
        name[idx]=(string)ind;
        //x[idx]=(int)m_node[winnode].X();
        //y[idx]=(int)m_node[winnode].Y();
        idx++;
        m_cnt--;        
        if(m_cnt==0) break;      // 必要な入力パタニオンの数を記録する
  }
  // 軌跡、ノード、碑文を描く
   int bcol=clrBlack;
   for(int k=0; k<m_dimension; k++)
  {
      int yp=0, yc;
      int sz=ArraySize(x);
      for(int j=0; j<sz; j++) 
    {
         yc=y[j];
         // ノード
         int sh=2;
         if(j>0) sh=1;
         m_bmp[k].DrawRectangle(x[j]-sh,y[j]-sh,x[j]+sh,y[j]+sh,bcol,true);
         // 軌道
         if(j<sz-1) m_bmp[k].DrawLine(x[j],y[j],x[j+1],y[j+1],bcol);  
         yc=y[j]-dy;
         if(MathAbs(yp-yc)<dy) yc-=dy;
         yp=yc;
         // パテルナ(小節)の数 
         m_bmp[k].TypeText(x[j],yc,name[j], clrIndigo);
    }    
  }
}
 

CSOMクラスでは、CSOM::CSOM()コンストラクタでのみ、ロードされた学習ベクトルのカウンタm_nSetがリセットされます。

その結果、ループ再トレーニング・モードではトレーニング・ベクトルの数が増え続けます。

CSOM::LoadTrainData(...)メソッドに m_nSet=0; という行を追加するのがよいでしょう.

 
GSB:

もしかしたら、誰かがとても便利なライブラリ(著者とアレクセイ・セルゲーエフに感謝)を実用レベルにまで引き上げて くれるかもしれない!


これらの地図は、分析する必要があるデータを確立し、それに基づいて結論を出すための手段に過ぎない。