El tema es muy amplio, pero con buen entrenamiento, da buenos resultados, jejeje en cuanto a la parte practica del tema y a modo de ejemplo, os dejo el codigo basico de una red neuronal basada en 3 perceptrones multicapa y 3 entradas por perceptron, para metatrader.
El entrenamiento es simple, en las variables de entrada de cada perceptron, poner: iniciar 0, paso 1, detener 100. Asimismo activar para optimizar únicamente los perceptrones de la primera capa. Y realizar la primera optimizacion.
Esperamos, seleccionamos el mejor resultado, desactivamos los perceptrones de la primera capa (con los valores obtenidos), y activamos la segunda, Realizamos la segunda optimizacion.
Esperamos, seleccionamos el mejor resultado, desactivamos los perceptrones de la segunda capa (con los valores obtenidos), y activamos la tercera, Realizamos la ultima optimizacion.
Usar el Ea con los parametros obtenidos.
El numero de capas es de 3 porque cualquier puerta logica basica (AND, OR, NOR, XOR...) puede ser implementada con un maximo de 3 capas de perceptrones.
PD. Tanto los parametros de entrada como las operaciones a realizar por cada capa son unicamente un ejemplo, asi que no espereis grandes resultados, sin embargo podeis ver el funcionamiento en mt4 y añadiendo vuestras entradas y operaciones sacar cosas bastante decentes.
PD2. si a alguien se le ocurre como meterle un ajuste por back-propagation a los pesos de cada entrada, para que se auto-entrene una vez a comenzado a rodar que hable ahora o calle para siempre jejeje...
Código: Seleccionar todo
//+------------------------------------------------------------------+
//| YsNeuroV5.mq4 |
//| Copyright © 2007, Yseku |
//| http://Yseku.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Yseku"
#property link "http://Yseku.com"
//---- input parameters
extern double lotesmin = 0.01;
extern double lotesmax = 0.02;
extern int lotesdinamicos = 0;
extern int doblarlotes = 0;
extern int mn = 888;
extern int pase = 1;
//Entradas perceptron capa1
extern int x11 = 99;
extern int x21 = 99;
extern int x31 = 99;
extern int x41 = 99;
extern int y11 = 99;
extern int y21 = 99;
extern int y31 = 99;
extern int y41 = 99;
//Entradas perceptron capa2
extern int x12 = 99;
extern int x22 = 99;
extern int x32 = 99;
extern int y12 = 99;
extern int y22 = 99;
extern int y32 = 99;
extern int z12 = 99;
extern int z22 = 99;
extern int z32 = 99;
//Entradas perceptron capa3
extern int x13 = 99;
extern int x23 = 99;
extern int x33 = 99;
extern int y13 = 99;
extern int y23 = 99;
extern int y33 = 99;
extern int z13 = 99;
extern int z23 = 99;
extern int z33 = 99;
static int prevtime=0,tic=-1,tiv=-1,doblotes=0,d,s,m;
static double p1x,p1y,p2x,p2y,p2z,p3x,p3y,p3z,lotes=0;
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if (Time[0] == prevtime) return(0);
prevtime = Time[0];
if (! IsTradeAllowed())
{
again();
return(0);
}
//-- Proceso Principal
Info();
RefreshRates();
if(pase>=3){pase3();}
if(pase>=2){pase2();}
if(pase>=1){pase1();}
//-- Exit --
return(0);
}
// COMENTARIO: en cada pase, especificar la accion a realizar por cada perceptron.
void pase1()
{
if (p1x>0) {CerrarVentas();AbrirCompras();}
if (p1y>0) {CerrarCompras();AbrirVentas();}
}
void pase2()
{
if (p2x>0) {CerrarVentas();}
if (p2y>0) {CerrarCompras();}
if (p2z>0) {AbrirVentas();AbrirCompras();}
}
void pase3()
{
if (p3x>0) {AbrirCompras();}
if (p3y>0) {AbrirVentas();}
if (p3z>0) {CerrarVentas();CerrarCompras();}
}
void again() {
prevtime = Time[1];
Sleep(30000);
}
//---- Calculo TipoBarra OHCL
int TipoBarra(int p)
{
int res=0;
double Ape=Open[p], Cie=Close[p];
double dis=(High[p]-Low[p])/3;
NormalizeDouble(dis,Digits);
double p1=High[p];
double p2=p1-dis;
double p3=p2-dis;
double p4=Low[p];
if (Ape<p1>p2)res=res+30;
if (Ape<p2>=p3)res=res+20;
if (Ape<p3>=p4)res=res+10;
if (Cie<p1>p2)res=res+3;
if (Cie<p2>=p3)res=res+2;
if (Cie<p3>=p4)res=res+1;
switch(res)
{
case 11: res=5;
case 22: res=1;
case 33: res=-5;
case 12: res=10;
case 13: res=20;
case 23: res=15;
case 32: res=-10;
case 31: res=-20;
case 23: res=-15;
}
return(res);
}
// COMENTARIO: en cada perceptron, introducir cualquier valor analogico en a[0], a[1], a[2]. Estos seran los datos con los que trabajara nuestra red neuronal.
//-- Proceso Perceptron Capa1 X -- Entrada TipoBarra
double Perceptron1X()
{
double w[4],a[4];
w[0] = x11 - 50;
w[1] = x21 - 50;
w[2] = x31 - 50;
w[3] = x41 - 50;
for(int i=0;i<=3;i++) a[i]=TipoBarra(i+1);
return(w[0]*a[0] + w[1]*a[1] + w[2]*a[2] + w[3]*a[3]);
}
//-- Proceso Perceptron Capa1 Y -- entrada max-min
double Perceptron1Y()
{
double w[4],a[4];
w[0] = y11 - 50;
w[1] = y21 - 50;
w[2] = y31 - 50;
w[3] = y41 - 50;
for(int i=1;i<=3;i++) a[i-1]=High[i]-Low[i];
return(w[0]*a[0] + w[1]*a[1] + w[2]*a[2] + w[3]*a[3]);
}
//-- Proceso Perceptron Capa2 X -- entrada tipobarra
double Perceptron2X()
{
double w[3],a[3];
w[0] = x12 - 50;
w[1] = x22 - 50;
w[2] = x32 - 50;
for(int i=0;i<=2;i++) a[i]=TipoBarra(i+1);
return(w[0]*a[0] + w[1]*a[1] + w[2]*a[2]);
}
//-- Proceso Perceptron Capa2 Y -- entrada max -min * volumen
double Perceptron2Y()
{
double w[3],a[3];
w[0] = y12 - 50;
w[1] = y22 - 50;
w[2] = y32 - 50;
for(int i=1;i<=3;i++) a[i-1]=(High[i]-Low[i])*Volume[i];
return(w[0]*a[0] + w[1]*a[1] + w[2]*a[2]);
}
//-- Proceso Perceptron Capa2 Z -- entrada fecha
double Perceptron2Z()
{
d=Day();
s=DayOfWeek();
m=Month();
double w[3],a[3];
w[0] = z12 - 50;
w[1] = z22 - 50;
w[2] = z32 - 50;
a[0]=d;
a[1]=s;
a[2]=m;
return(w[0]*a[0] + w[1]*a[1] + w[2]*a[2]);
}
//-- Proceso Perceptron Capa3 X -- entrada capa 2
double Perceptron3X()
{
double w[3],a[3];
w[0] = x13 - 50;
w[1] = x23 - 50;
w[2] = x33 - 50;
a[0]=p2x;
a[1]=p2y;
a[2]=p2z;
return(w[0]*a[0] + w[1]*a[1] + w[2]*a[2]);
}
//-- Proceso Perceptron Capa3 Y -- entrada capa 2
double Perceptron3Y()
{
double w[3],a[3];
w[0] = y13 - 50;
w[1] = y23 - 50;
w[2] = y33 - 50;
a[0]=p2x;
a[1]=p2y;
a[2]=p2z;
return(w[0]*a[0] + w[1]*a[1] + w[2]*a[2]);
}
//-- Proceso Perceptron Capa3 Z -- entrada capa 2
double Perceptron3Z()
{
double w[3],a[3];
w[0] = z13 - 50;
w[1] = z23 - 50;
w[2] = z33 - 50;
a[0]=p2x;
a[1]=p2y;
a[2]=p2z;
return(w[0]*a[0] + w[1]*a[1] + w[2]*a[2]);
}
void AbrirCompras()
{
if (tic<1)
{
OrderSend(Symbol(),OP_BUY,lotes,Ask,0,0,0,0,mn,0,Green);
ContarOrdenes();
}
}
void AbrirVentas()
{
if (tiv<1>0)
{
OrderSelect(tic,SELECT_BY_TICKET,MODE_TRADES);
if(OrderProfit()<0>0)
{
OrderSelect(tiv,SELECT_BY_TICKET,MODE_TRADES);
if(OrderProfit()<0>=(lotes*2))lotes=lotes*2;
}
else lotes=lotesmin;
}
void Info()
{
ContarOrdenes();
CalcularLotes();
p1x=Perceptron1X();p1y=Perceptron1Y();
p2x=Perceptron2X();p2y=Perceptron2Y();p2z=Perceptron2Z();
p3x=Perceptron3X();p3y=Perceptron3Y();p3z=Perceptron3Z();
Print("Capa3. X:",p3x," Y:",p3y," Z:",p3z);
Print("Capa2. X:",p2x," Y:",p2y," Z:",p2z);
Print("Capa1. X:",p1x," Y:",p1y);
Print("TotalOrdenes: ",OrdersTotal()," *----------------------------------------------------------------*");
return(0);
}
void ContarOrdenes()
{
int total = OrdersTotal();
for (int i = 0; i <total>0) {CerrarVentas();AbrirCompras();}
PD. No se por que, al pegar el codigo me sustituye "==" por "<0>". subo el .mql. De cualquier modo, esta red neuronal no es estandart, ya he dicho que solo es un ejemplo, lo suyo es que solo haya entradas externas en la primera capa, y que las entradas de las demas capas, sean la salida de la anterior. Asimismo se puede poner un umbral en la accion a realizar por cada perceptron de modo que en vez de:
if (p1x>0) {CerrarVentas();AbrirCompras();}
podeis hacer:
Umbral=1;
if (p1x>umbral) {AbrirCompras();}
if (p1x<-umbral) {AbrirVentas();}
De este modo sacais 2 acciones por perceptron. Y podeis optimizar tb el valor del umbral...
Espero que quede algo mas claro y vuestros comentarios.
Un Saludo Hermanos.
podeis hacer: