MQL5算法交易的神经网络-002定义神经网络

MQL5算法交易的神经网络-002定义神经网络
Photo by Alina Grubnyak / Unsplash

定义神经层描述

  1. 考虑我们的网络有多少层神经元:至少包含输入层,输出层和隐藏层。
  2. 考虑不同类型神经网络,并确定每层神经元数量。
  3. 选择不同类型激活函数,同一层神经元使用相同的激活函数。
  4. 选择不同类型优化器。
  5. 确定Normalization样本大小和Dropout神经元的概率。

最终一个神经层描述定义如下

class CLayerDescription    :  public CObject
  {
public:
                     CLayerDescription(void);
                    ~CLayerDescription(void) {};
   //---
   int               type;         // Type of neural layer
   int               count;        // Number of neurons in a layer
   int               window;       // Source data window size
   int               window_out;   // Results window size
   int               step;         // Input data window step
   int               layers;       // Number of neural layers
   int               batch;        // Weight Matrix Update Packet Size
   ENUM_ACTIVATION_FUNCTION   activation;  // Activation function type
   VECTOR            activation_params[2]; // Array of activation function parameters
   ENUM_OPTIMIZATION optimization; // Weight matrix optimization type
   TYPE              probability;  // masking probability, Dropout only
  };

CLayerDescription::CLayerDescription(void)   :  type(defNeuronBase),
                                                count(100),
                                                window(100),
                                                step(100),
                                                layers(1),
                                                activation(AF_TANH),
                                                optimization(Adam),
                                                probability(0.1),
                                                batch(100)
  {
   activation_params = VECTOR::Ones(2);
   activation_params[1] = 0;
  }

定义神经网络

  1. 创建Create方法创建神经网络。
  2. 创建Save 和Load方法保存和加载神经网络。
  3. 创建m_cLayers属性存储神经层。
  4. 创建FeedForward,Backpropagation,UpdateWeights分别负责前向传播,反向传播和更新权重。
  5. 创建SetLearningRates方法设置学习率,定义m_dLearningRate 和 m_adBeta属性保存学习率和衰减系数。
  6. 创建GetResults方法获取最后一次直接传递的结果。
  7. 创建GetRecentAverageLoss 方法获取损失函数结果,定义m_dNNLoss 属性保存损失函数的值。
  8. 创建LossFunction方法获取损失函数类型,定义m_eLossFunction属性保存损失函数类型。
  9. 创建CMyOpenCL对象m_cOpenCL,使用OpenCL技术利用GPU并行计算。
  10. 定义m_bOpenCL属性决定是否启用OpenCL。
  11. 创建InitOpenCL和 UseOpenCL方法初始化和管理OpenCL。
  12. 创建CPositionEncoder对象m_cPositionEncoder分析时间序列的偏移项。

最终神经网络定义如下

class CNet  : public CObject
  {
protected:
   bool               m_bTrainMode;
   CArrayLayers*      m_cLayers;
   CMyOpenCL*         m_cOpenCL;
   bool               m_bOpenCL;
   TYPE               m_dNNLoss;
   int                m_iLossSmoothFactor;
   CPositionEncoder*  m_cPositionEncoder;
   bool               m_bPositionEncoder;
   ENUM_LOSS_FUNCTION m_eLossFunction;
   VECTOR             m_adLambda;
   TYPE               m_dLearningRate;
   VECTOR             m_adBeta;

public:
                      CNet(void);
                     ~CNet(void);
   //--- Methods for creating an object
   bool               Create(CArrayObj *descriptions);
   bool               Create(CArrayObj *descriptions, TYPE learning_rate,
                                                      TYPE beta1, TYPE beta2);
   bool               Create(CArrayObj *descriptions, 
                 ENUM_LOSS_FUNCTION loss_function, TYPE lambda1, TYPE lambda2);
   bool               Create(CArrayObj *descriptions, TYPE learning_rate, 
                             TYPE beta1, TYPE beta2,
                 ENUM_LOSS_FUNCTION loss_function, TYPE lambda1, TYPE lambda2);

   //--- Implement work with OpenCL
   void               UseOpenCL(bool value);
   bool               UseOpenCL(void)          const { return(m_bOpenCL);         }
   bool               InitOpenCL(void);
   //--- Methods for working with positional coding
   void               UsePositionEncoder(bool value);
   bool               UsePositionEncoder(void) const { return(m_bPositionEncoder);}
   //--- Implement the main algorithms of the model
   bool               FeedForward(const CBufferType *inputs);
   bool               Backpropagation(CBufferType *target);
   bool               UpdateWeights(uint batch_size = 1);
   bool               GetResults(CBufferType *&result);
   void               SetLearningRates(TYPE learning_rate, TYPE beta1 = defBeta1,
                                                           TYPE beta2 = defBeta2);
   //--- Loss Function Methods
   bool               LossFunction(ENUM_LOSS_FUNCTION loss_function,
                          TYPE lambda1 = defLambdaL1, TYPE lambda2 = defLambdaL2);
   ENUM_LOSS_FUNCTION LossFunction(void)       const { return(m_eLossFunction);    }
   ENUM_LOSS_FUNCTION LossFunction(TYPE &lambda1, TYPE &lambda2);

   TYPE               GetRecentAverageLoss(void) const { return(m_dNNLoss);        }
   void               LossSmoothFactor(int value)    { m_iLossSmoothFactor = value;}
   int                LossSmoothFactor(void)   const { return(m_iLossSmoothFactor);}
   //--- Model operation mode control
   bool               TrainMode(void)          const { return m_bTrainMode;        }
   void               TrainMode(bool mode);
   //--- Methods for working with files
   virtual bool       Save(string file_name = NULL);
   virtual bool       Save(const int file_handle);
   virtual bool       Load(string file_name = NULL, bool common = false);
   virtual bool       Load(const int file_handle);
   //--- object identification method
   virtual int        Type(void)               const { return(defNeuronNet);      }
   //--- Retrieve pointers to internal objects
   virtual CBufferType* GetGradient(uint layer)     const;
   virtual CBufferType* GetWeights(uint layer)      const;
   virtual CBufferType* GetDeltaWeights(uint layer) const;
  };

Read more

MQL5算法交易的神经网络-007长短期记忆网络

MQL5算法交易的神经网络-007长短期记忆网络

定义属性 构建LSTM的四个门控单元:m_cForgetGate、m_cInputGate、m_cNewContent、m_cOutputGate,分别负责遗忘门、输入门、新内容和输出门的计算。 m_cMemorys和m_cHiddenStates,存储LSTM单元的记忆状态和隐藏状态。 m_cInputs,输入数据的缓冲区。 m_cForgetGateOuts、m_cInputGateOuts、m_cNewContentOuts、m_cOutputGateOuts,保存各个门控单元的输出结果。 m_cInputGradient,存储输入梯度,用于反向传播。 m_iDepth,网络的深度,表示层数。 初始化 创建CLayerDescription 指针temp 利用temp初始化 ForgetGate 利用temp初始化 InputGate 利用temp初始化 OutputGate 利用temp初始化 NewContent 初始化 InputGradient

By dumengru
20241122 所有盈利都是市场的馈赠

20241122 所有盈利都是市场的馈赠

说来也奇怪,我不断做空BTC和XAU,二者又不断创出新高,然而我的账户资金却不减反增。 经过总结,我认为盈利的原因有以下几个: 1. 能够感受到市场的最小阻力线方向。我能够明显感受到价格的最小阻力线方向是向上的,这样促使我在做空时非常谨慎,也能够很好的踩住回调的节奏。 2. 能够感受到压力和支撑位。趋势的特征之一就是压力和支撑位都比较明显,有了明显的点位,进出场时也能够得心应手。 3. 交易方向明确。这可能是最重要的一点,因为方向明确,所以我有更多的时间和精力去观察市场最小阻力线方向。 4. 仓位控制的较稳。这是慢慢培养的一种交易习惯。 5. 市场给机会。交易员的所有盈利都是市场的馈赠。

By dumengru
20241121 如果犯错不可避免

20241121 如果犯错不可避免

一个有趣的现象,交易员有时会在明知是错的情况下去犯错。 原因很简单,当你数次陷入假突破陷阱之后,你还会相信真的突破来临嘛?如果恰好你通过抄底摸顶获得了大幅盈利,当真的突破来临时,你就会不假思索地再次抄底摸顶,从而使自己身处险境。 有人会说,如果不确定是否真突破,那我不去做不就可以了么?你或许可以抵挡住一次两次诱惑,但是当你多次“准确”预测行情,而又没有参与的时候,你就会后悔,懊恼,甚至是痛恨自己“胆小如鼠”。 这就是交易中的诱惑与陷阱,也就是人们常说的贪婪与恐惧。 成功的主观交易员与其说是战胜了市场,不如说是战胜了自己。人性的弱点无法克服,如果犯错不可避免,那该怎么办呢? BTC交易 今天BTC终于突破了,在持续横盘震荡了数个交易日之后,在价格跌跌宕宕突破93000和94000之后,今天一举突破95000点并直接突破到97000点。 今天的交易就是非常典型的明知故犯错。 之前提到过BTC一直横盘,经常出现价格突破后立刻回调,也就是非常典型的假突破。我注意到BTC价格的低点和高点一次比一次高,因此理性观点是偏向多头的。但是自特朗普当选以来,BTC价格在不到15个交易日内

By dumengru
20241120 价格波动会影响交易者情绪

20241120 价格波动会影响交易者情绪

挣钱并不会让交易者感到更舒心,因为不管是盈利还是亏损,他都会犯错,而只要犯错,就不会感到舒心。——《股票作手回忆录》 我发现自己每隔一段时间就会出现一段低潮期,低潮期的感觉就是:内心十分抗拒交易,又忍不住查看行情,一旦看到行情波动又忍不住交易。 主要原因我认为是自己看不清楚市场方向。XAU从底部已经大幅反弹超过80美金,BTC不断冲击新高,USTEC也从底部有所反弹。没有明确的大方向导致在交易时总是惴惴不安。 与此同时,我的账户资金却大幅增长,为什么呢? 在账户本金只有500美元的情况下,我给自己定的目标是每天盈利20美元。由于我看不清楚大方向,因此当我达到这个目标之后总跟自己强调不要继续交易。尽管我内心十分抗拒,但是行情总是会走出一些极端价格,一些让我无法抗拒入场的价格。 由于黄金短期大幅反弹,所以我比较看空。 BTC低点不断抬升,不断创出新高后回落。我看多但从来不做多,并且总是在前高附近做空。 USTEC的趋势性比较强,V型反转也很多。 所以最近几笔交易比较有意思:当我看到XAU和BTC同时出现在前高附近时,我就会同时做空二者;当我看到XAU在前高附近而USTEC大

By dumengru