MT5神经网络EA

2015-02-22 13:37:56    来源:    作者:
//+------------------------------------------------------------------+
//|                                             macdNeuroExample.mq5 |
//|                                                        wangyu204 |
//|                                           https://www.fxunion.net |
//+------------------------------------------------------------------+
#property copyright "wangyu204"
#property link      "https://www.fxunion.net"
#property version   "1.00"
//本EA通过模拟过去训练最佳权重w数据,操作未来
#include
#include
//神经网络权重  每个因子一个权值
input double w0=0.5;
input double w1=0.5;
input double w2=0.5;
input double w3=0.5;
input double w4=0.5;
input double w5=0.5;
input double w6=0.5;
input double w7=0.5;
input double w8=0.5;
input double w9=0.5;
input double w10=0.5;
input double w11=0.5;
input double w12=0.5;
input double w13=0.5;
input double w14=0.5;
input double w15=0.5;
input double w16=0.5;
input double w17=0.5;
input double w18=0.5;
input double w19=0.5;
//全局变量
int iMACD_handle;//macd indicator handle
double iMACD_mainbuf[];//dynamic array for storing indicator values
double iMACD_signalbuf[];//dynamic array for storing indicator values
double inputs[20];//输入因子
double weight[20];//对应输入权重
string my_symbol;
ENUM_TIMEFRAMES my_timeframe;
double lot_size;
//输出
double out;
CTrade m_Trade; //交易相关
CPositionInfo m_Position;//持仓相关
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   my_symbol=Symbol();
   my_timeframe=PERIOD_CURRENT;
   lot_size=SymbolInfoDouble(my_symbol,SYMBOL_VOLUME_MIN);
   iMACD_handle=iMACD(my_symbol,my_timeframe,12,26,9,PRICE_CLOSE);
   if(iMACD_handle==INVALID_HANDLE)
     {
      Print("Failed to get the indicator handle");
      return(-1);
     }
  
   ChartIndicatorAdd(ChartID(),0,iMACD_handle);
   ArraySetAsSeries(iMACD_mainbuf,true);//设置数组序列
   ArraySetAsSeries(iMACD_signalbuf,true);
  
   //place weights into the array
   weight[0]=w0;
   weight[1]=w1;
   weight[2]=w2;
   weight[3]=w3;
   weight[4]=w4;
   weight[5]=w5;
   weight[6]=w6;
   weight[7]=w7;
   weight[8]=w8;
   weight[9]=w9;
   weight[10]=w10;
   weight[11]=w11;
   weight[12]=w12;
   weight[13]=w13;
   weight[14]=w14;
   weight[15]=w15;
   weight[16]=w16;
   weight[17]=w17;
   weight[18]=w18;
   weight[19]=w19;
  
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   IndicatorRelease(iMACD_handle);//delete the indicator handle and deallocate the memory space
   ArrayFree(iMACD_mainbuf);//free dynamic array
   ArrayFree(iMACD_signalbuf);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int err1=0,err2=0;
   err1=CopyBuffer(iMACD_handle,0,2,ArraySize(inputs)/2,iMACD_mainbuf);
   err2=CopyBuffer(iMACD_handle,0,2,ArraySize(inputs)/2,iMACD_signalbuf);
   if(err1<0 || err2<0)
     {
      Print("Failed to copy data from the indicator buffer");
      return;
     }
   //input标准化
   double d1=-1.0;
   double d2=1.0;
   double x_min=MathMin(iMACD_mainbuf[ArrayMinimum(iMACD_mainbuf)],iMACD_signalbuf[ArrayMinimum(iMACD_signalbuf)]);
   double x_max=MathMax(iMACD_mainbuf[ArrayMaximum(iMACD_mainbuf)],iMACD_signalbuf[ArrayMaximum(iMACD_signalbuf)]);
   for(int i=0;i
     {
      inputs[i*2]=(iMACD_mainbuf[i]-x_min)*(d2-d1)/(x_max-x_min)+d1;
      inputs[i*2+1]=(iMACD_signalbuf[i]-x_min)*(d2-d1)/(x_max-x_min)+d1;
     }
   //out
   out=calculateNeuron(inputs,weight);
  
   if(out<0)
     {
      if(m_Position.Select(my_symbol))
        {
         if(m_Position.PositionType()==POSITION_TYPE_SELL){m_Trade.PositionClose(my_symbol);}
         if(m_Position.PositionType()==POSITION_TYPE_BUY){return;}
        }
      m_Trade.Buy(lot_size,my_symbol);
     }
   if(out>=0)
     {
      if(m_Position.Select(my_symbol))
        {
         if(m_Position.PositionType()==POSITION_TYPE_BUY){m_Trade.PositionClose(my_symbol);}
         if(m_Position.PositionType()==POSITION_TYPE_SELL){return;}
        }
      m_Trade.Sell(lot_size,my_symbol);
     }
  }
//+------------------------------------------------------------------+
double calculateNeuron(double &x[],double &w[])
{
   double NET=0.0;
   for(int i=0;i
     {
      NET+=x[i]*w[i];
     }
   NET*=0.1;//additional coefficient d=0.1
   return(activateNeuron(NET));
}
//激励函数
double activateNeuron(double x)
{
   double out;
   out=(exp(x)-exp(-x))/(exp(x)+exp(-x));
   return(out);
}
本文标签: MT5