文章 "在 MetaTrader 5 中使用自组织特征映射(Kohonen 映射)" - 页 4

 
Graff:

我不知道它们有什么用。你可以直接从终端获取信息。

我甚至不敢想象它们的用途,可能是有人手动计算的。

SZY:有人能发布一个修改程序,让智能交易系统可以直接从终端获取信息,而不需要脚本吗?

好吧,如果你害怕,那当然不行)。
 
sergeev:
您需要哪些信息?
即 SOM.mq5 Expert Advisor 可以独立(无需 DJ.mq5 和 FX.mq5 脚本的帮助)从终端接收数据。
 

这篇文章是否包含了获得专家顾问的所有内容?

我对实施神经网络 专家顾问很感兴趣。

 

你好,亲爱的论坛成员!

这篇文章非常有趣!我也在尝试使用 SOM 代码。

索姆克

权重 p1-p4 - 来自市场的数据(目前只有 ZZ 点之间的差值)。

p5 - 虚拟买入交易的结果 - TP=1,SL=-1(到目前为止,TP=SP=300pp)。在我看来,仅仅一个 p5 BMU(最接近的向量)不足以预测结果。

有谁能建议如何计算 BMU(为清晰起见,用蓝色)周围区域的结果,同时考虑到与 BMU 的距离?

 
sealdo:

有谁能告诉我,在考虑到与 BMU 的距离的情况下,计算 BMU 周围区域(为清楚起见用蓝色圈出)的结果 有多简单?

我想知道,这是否也是我在想的?
 
progma137:
我想知道,我也是这么想的吗? 你是说如何通过编程找到这个区域的坐标?

在 CSOM 类中已经有一个函数了:

int BestMatchingNode(double &vector[]); // 根据给定向量找到网格中的最佳节点

了解了网格的维数后,我们就可以很容易地计算出 BMU(或本实现中的 BMN)的坐标了。
这里我们要计算的正是 BMU 周围区域的总结果(通过一个参数(权重)),同时考虑到与 BMU 的距离。例如,我们取一个直径为 10 个神经元(细胞)的区域。距离最近的神经元对结果的影响较大。而距离越远,....。

这里有一个问题,我们应该如何处理位于网格边缘的 BMU-shell。毕竟,它们的邻居较少。

 

请问如何在地图上找到条形图?

我们输入四个矢量,得到四张地图。我想在所有这些地图上绘制一条轨迹,例如,从当前日期(天数)到后面 3 个条形图,并分析集群的状态。

可以通过编程来实现,例如使用 void DrawTrajectory(int from, int count) 函数,它会在所有地图上绘制从给定条数开始的轨迹。

第二个问题,如何获得输出地图,最重要的是频率地图?

 

我没等到回复...我写的方法是在输入地图上显示输入矢量给定步数后的轨迹,如果有什么不对,请不要见怪--我不是程序员:)

谁能把这个非常聪明的库(感谢作者和阿列克谢-谢尔盖耶夫)推广到实际应用层面?!!!!


//------------------------------------------------------------------ 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 类中,加载训练向量的计数器 m_nSet 仅在 CSOM::CSOM() 构造函数中重置。

因此,在循环再训练模式下,训练向量的数量会不断增加。

最好在 CSOM::LoadTrainData(...) 方法中添加 m_nSet=0; 一行。

 
GSB:

也许有人会把一个非常有用的库(感谢作者和阿列克谢-谢尔盖耶夫)提升到实际使用的水平?!!!!


这些地图只不过是建立数据的一种手段,需要对这些数据进行分析并在此基础上得出结论。