Mira cómo descargar robots gratis
¡Búscanos en Twitter!
Pon "Me gusta" y sigue las noticias
¿Es interesante este script?
Deje un enlace a él, ¡qué los demás también lo valoren!
¿Le ha gustado el script?
Evalúe su trabajo en el terminal MetaTrader 5
Librerías

Red estocástica - librería para MetaTrader 4

Visualizaciones:
806
Ranking:
(8)
Publicado:
2016.05.27 09:23
Actualizado:
2016.11.22 07:33
dpnn.dll (68 KB)
¿Necesita un robot o indicador basado en este código? Solicítelo en la bolsa freelance Pasar a la bolsa

Esta red de neuronal de probabilidad ha sido creada en forma de biblioteca dll especialemente para los asesores escritos en MQL4. La

biblioteca es capaz de contener varias redes simultáneamente. He tratado de hacer la red tan independiente como sea posible, pero en seguida me he dado cuenta de que es mejor introducir una serie de funciones en la gestión externa para un mayor control desde el primer momento. Me la imagino precisamente de esta forma. La peculiaridad de esta red es que su tamaño cambia de forma dinámica dependiendo de la situación. La red puede pasar tanto el aprendizaje inicial como el aprendizaje sobre la marcha. Al mismo tiempo, las nuevas neuronas nacerán de forma autónoma, y de la misma forma se adaptarán y morirán. En cada clase es necesario crear su propia red. Por ejemplo, para generar señales de sobrecompra y sobreventa es necesario crear una red para el primer caso y una aparte para el segundo.

Aprendizaje

En la entrada de red se suministra un vector normalizado hasta la unidad. La salida de la red será la cifra [0..1] que designa la pertenencia del vector de entrada a la clase de la red. Al mismo tiempo, si la red durante el proceso de aprendizaje no ha encontrado una imagen con la probabilidad indicada, la añadirá automáticamente a su memoria mediante una nueva neurona. En el caso del aprendizaje primario, recomiendo hacer 2-3 repeticiones. En cualquier caso, llegará el momento en que la red asimile correctamente los datos primarios. Esto suele darse normalmente después de no más de 5 pasadas.

Predicción, o para ser más exactos, clasificación

La tarea de la red es clasificar la imagen de entrada presentada para ver su correspondencia con la clase de la red. Si la red ha aprendido a clasificar las señales de viraje de tendencia de bajista a alcista, entonces estas situaciones deberán estar acompañadas por un valor de entrada alto, cercano a 1. Las acciones posteriores con las respuestas obtenidas de la red y su integración en los asesores las dejo a la discreción de los escritores expertos.

Funciones principales necesarias para trabajar con la red

Para crear una red se usa la función CreateNet

double CreateNet(string NN, // Crea una red con el nombre <NN>
int InputVectorSize, // con una cantidad de neuronas en el vector de entrada <InputVectorSize>
double MinTV, // umbral de conflictos de las neuronas
double MaxTV, // umbral de individualidad
double MW, // criterio de debilidad de las neuronas
int NL); // vida útil de las neuronas (en barras) si 0, entonces viven por siempre

Para que sea más cómodo, he decidido dirigirme a las redes por su nombre. Recordemos que es posible trabajar simultáneamente con un conjunto completo de redes. Los ajustes de cada red se indican durante su creación y permanecen inalterados hasta su eliminación.

El umbral de individualidad es necesario para tomar decisiones sobre el nacimiento de nuevas neuronas en el proceso de aprendizaje. Normalmente es 0.95. Con valores más bajos (menor nivel de individualidad) la red intentará modernizarse de tal forma que la mayor cantidad posible de neuronas convenga al mayor número de variantes. En este caso, la capacidad de predicción disminuye. Con valores altos de MaxTV, la red tratará de crear una nueva neurona casi con cada nuevo vector, y la red puede alcanzar un tamaño muy grande. La red se moderniza por sí misma de tal forma que las neuronas no entre en conflicto mutuo(los ejemplares no deberán paracerse entre sí). Para este objetivo se ha diseñado MinTV, que yo dispongo normalmente en 0,2. Los parámetros MaxTV,MinTV y MW será suficiente con definirlos una vez. En lo sucesivo, la aplicación de la optimización para encontrar los mejores parámetros no será necesaria.

¡Sobrevivirán los más fuertes! Este principio se utiliza también aquí. Las neuronas débeiles son aquellas cuyo peso es menor al valor mínimo MW. Estas neuronas llevan la información más perjudicial y deben morir con el fin de no generar accidentalmente otra señal.

En caso de necesidad, se pueden eliminar las neuronas más viejas, y de esta forma, se liberan de "viejos estereotipos". Para ello, seleccione la duración de la vida de las neuronas en las barras NL. Al crear cada neurona, se recordará la hora de su creación, y en consecuencia, esta marca permitirá eliminarla. Por eso, a la hora de introducir cualquier dato en la red es obligatorio indicar el factor temporal.

Para eliminar la red, usamos DestroyNet. Es muy sencillo. No se olvide de eliminar todas las redes innecesarias, en caso contrario permanecerán vivas en la memoria del ordenador hasta que se cierre MetaTrader.

int DestroyNet(string NN); // Destruye la red <NetName>, retorna la cantidad de redes restantes

No he puesto función de comprobación de la exclusividad de los nombres, por lo que usted podrá producir una gran cantidad de redes bajo un mismo nombre. Eso sí, se diferenciarán por su número ordinal.

string NetName(int i); // Retorna el nombre de la red según el ordinal indicado
int GetNetsNumber(); // Retorna el número total de redes en la biblioteca
int NetNumber(string NetName); // Retorna el número ordinal de la red <NetName> en la biblioteca

Para entrenar la red, se usa la función TrainNet. La respuesta correcta se necesita más bien para introducir el orden. Por ejemplo, para las señales BUY, adoptamos 1, a para SELL, -1. Puesto que para BUY existe su propia red, y para SELL, la suya, entonces dentro de la red no se tiene en cuenta. Como hora, tomaremos la actual, o la hora de creación de la barra.

double TrainNet(string NetName,
double& iX[], // vector de entrada normalizado del tamaño InputVectorSize
int T, // respuesta correcta
datetime sT); // hora de creación del vector

Durante el entrenamiento, se puede determinar si la red reconoce la imagen y si se ha modernizado o añadido como nueva. Para ello, usamos SizeOfNet

int SizeOfNet(string NetName); // Retorna el número de neuronas de Gauss

Se calculará la respuesta con la ayuda de la función GetPredict. Sus parámetros son los mismos que con TrainNet. Si proporcionamos en la entrada exactamente el mismo vector que se le enseñó a la red, entonces la respuesta será 1.

double GetPredict(string NetName, // Muestra la probabilidad [0..1] de pertenencia del vector de entrada a la clase
double& iX[],
datetime sT);

Estas funciones son necesarias para el funcionamiento interno de la red. Sólo tiene que utilizarlas como se muestra en el ejemplo.

void Shrink(string NetName);
void WReset(string NetName);
void AEqual(string NetName);
void CW(string NetName);
void KillWeaks(string NetName);
void KillOlds(string NetName,datetime sT);

Ejemplos de uso

Ejemplo de código de la función init ()

Print("Net Created with number: ",CreateNet("OverBought",24,0.2,0.95,0.001,Period()*60*1000)); // Creamos una red para las señales Sell
Print("Net Created with number: ",CreateNet("OverSold",24,0.2,0.95,0.001,Period()*60*1000)); // Creamos una red para las señales Buy

//~~
Print("Initial training started ...");
for (int R = 1; R <= Repetitions; R++) // Proceso de aprendizaje primario
{ // con datos históricos
WReset("OverBought"); // Ponemos a cero el valor de todos los pesos
InitialTraining("OverBought",HistoryBars,-1); // Ponemos en marcha la puesta a cero
Shrink("OverBought"); // Modernizamos la red
AEqual("OverBought"); // Ponemos todos los pesos con un valor =1
CW("OverBought"); // Calculamos los pesos
KillWeaks("OverBought"); // Eliminamos las neuronas débiles
CW("OverBought"); // Calculamos los pesos

WReset("OverSold"); // Ponemos a cero los valores de los pesos
InitialTraining("OverSold",HistoryBars,1); // Ponemos en marcha la puesta a cero
AEqual("OverSold"); // Ponemos todos los pesos con un valor =1
Shrink("OverSold"); // Modernizamos la red
CW("OverSold"); // Calculamos los pesos
KillWeaks("OverSold"); // Eliminamos las neuronas débiles
CW("OverSold"); // Calculamos los pesos
FlushReport("OverSold",R); // Mostramos el informe en un archivo

}

Ejemplo de código de la función start()

KillOlds("OverBought",iTime(Symbol(),0,1)); // Eliminamos las neuronas débiles
PostTraining("OverBought",-1); // Acabamos de enseñar sobre la marcha
Shrink("OverBought"); // Modernizamos la red
AEqual("OverBought"); // Ponemos todos los pesos con un valor =1
CW("OverBought"); // Calculamos los pesos
KillWeaks("OverBought"); // Eliminamos las neuronas débiles
CW("OverBought"); // Calculamos los pesos

KillOlds("OverSold",iTime(Symbol(),0,1));
PostTraining("OverSold",1); // Acabamos de enseñar sobre la marcha
AEqual("OverSold"); // Ponemos todos los pesos con un valor =1
Shrink("OverSold"); // Modernizamos la red
CW("OverSold"); // Calculamos los pesos
KillWeaks("OverSold"); // Eliminamos las neuronas débiles
CW("OverSold"); // Calculamos los pesos

//--------------------------------------------------------------------
double OverBought = Predict("OverBought");
double OverSold = Predict("OverSold");
Out = (OverBought - OverSold)/(OverBought+OverSold);

Ejemplo de código de la función deinit()

Print("Destroying net=>",Destroy ("OverBought")); // Eliminamos lo que hemos creado
Print("Destroying net=>",Destroy ("OverSold")); // Eliminamos lo que hemos creado

El rendimiento de la red ha sido comprobado con éxito. Los buenos resultados dependen del método con el que se ha creado el vector de entrada. Es importante entender que durante el entrenamiento de la red, los vectores deberán suministrarse sabiendo que cumplen los criterios de la clase. En palabras más simples: si la red ha sido creada para las señales SELL, entonces en la barra de la que se extrae el vector de aprendizaje deberá estar presente realmente la señal SELL. De lo contrario, la red recogerá datos contradictorios y no se obtendrá el resultado deseado.

Os invito a debatir las siguientes cuestiones:

1. La formación del vector de entrada: - En la actualidad uso 24 parámetros (la diferencia entre medias móviles), normalizada hasta 1 para un intervalo 24 barras. Es decir, calculo la matriz de 24x24. Después la normalizo y tomo los últimos valores.

2. Determinar la "respuesta correcta": es decir, cuándo el vector de entrada es una señal. En la actualidad, utilizo AMA. Resulta que solo sé si ha habido una señal 2 barras después.

Traducción del ruso realizada por MetaQuotes Ltd
Artículo original: https://www.mql5.com/ru/code/8514

RSI_Test RSI_Test

Basado en el indicador RSI

Search patterns Search patterns

El indicador busca patrones, muestra en la pantalla el final del punto D, y también el final del punto C.

Starter Starter

Asesor Starter.

ZerolagStochs ZerolagStochs

Un análogo del cruce de dos estocásticas