Для начала пожалуйста установите библиотеку Fann2MQL. Она нам понадобится в дальнейшем. Ее можно загрузить здесь.
Введение
До настоящего времени был опубликован только один пример использования библиотеки Fann2MQL (Используем нейронные сети в MetaTrader), которая позволяет трейдерам использовать библиотеку "FANN" (также доступную в виде исходных кодов) в программах на MQL. Но этот пример, предложенный создателем библиотеки Fann2MQL, не так просто понять новичкам.
Поэтому я написал другой пример, более легкий для понимания и полностью документированный. Он не связан напрямую с торговлей, и не использует никакие финансовые данные, изменяющиеся во времени.
В этом примере мы собираемся обучить простую нейронную сеть распознавать простейший паттерн.
Мы обучим сеть распознавать паттерн такого типа: он содержит 3 числа: a, b и с, значения выходного параметра output следующие:
если (a < b) и (b < c), то output = 1
если (a < b) и (b > c), то output = 0
если (a > b) и (b > c), то output = 0
если (a > b) и (b < c), то output = 1
Можно представить эти числа как координаты вектора, с которым можно ассоциировать направление движения рынка.
В данном случае, паттерн может быть интерпретирован как:
ВВЕРХ ВВЕРХ = ВВЕРХ
ВВЕРХ ВНИЗ = ВНИЗ
ВНИЗ ВНИЗ = ВНИЗ
ВНИЗ ВВЕРХ = ВВЕРХ
Для начала мы создадим нейронную сеть.
Затем мы покажем нейросети несколько примеров паттернов, чтобы она смогла обучиться и вывести правила.
Наконец, мы покажем нейросети новые паттерны, которые нейросеть никогда не видела и получим результаты. Если сеть поняла правила, то она будет способна распознать указанные паттерны.
Код с комментариями:
#include <Fann2MQL.mqh>
#property copyright "Copyright © 2009, Julien Loutre"
#property link "http://www.forexcomm.com"
#property indicator_separate_window
#property indicator_buffers 0
int nn_layer = 4;
int nn_input = 3;
int nn_hidden1 = 8;
int nn_hidden2 = 5;
int nn_output = 1;
double trainingData[][4];
int maxTraining = 500;
double targetMSE = 0.002;
int ann;
int deinit() {
f2M_destroy_all_anns();
return(0);
}
int init() {
int i;
double MSE;
Print("=================================== НАЧАЛО ВЫПОЛНЕНИЯ ================================");
IndicatorBuffers(0);
IndicatorDigits(6);
ArrayResize(trainingData,1);
Print("##### ИНИЦИАЛИЗАЦИЯ #####");
ann = f2M_create_standard(nn_layer, nn_input, nn_hidden1, nn_hidden2, nn_output);
debug("f2M_create_standard()",ann);
f2M_set_act_function_hidden (ann, FANN_SIGMOID_SYMMETRIC_STEPWISE);
f2M_set_act_function_output (ann, FANN_SIGMOID_SYMMETRIC_STEPWISE);
f2M_randomize_weights (ann, -0.77, 0.77);
debug("f2M_get_num_input(ann)",f2M_get_num_input(ann));
debug("f2M_get_num_output(ann)",f2M_get_num_output(ann));
Print("##### ПОДГОТОВКА ДАННЫХ #####");
,
prepareData("train",1,2,3,1);
prepareData("train",8,12,20,1);
prepareData("train",4,6,8,1);
prepareData("train",0,5,11,1);
prepareData("train",1,2,1,0);
prepareData("train",8,10,7,0);
prepareData("train",7,10,7,0);
prepareData("train",2,3,1,0);
prepareData("train",8,7,6,0);
prepareData("train",20,10,1,0);
prepareData("train",3,2,1,0);
prepareData("train",9,4,3,0);
prepareData("train",7,6,5,0);
prepareData("train",5,4,5,1);
prepareData("train",2,1,6,1);
prepareData("train",20,12,18,1);
prepareData("train",8,2,10,1);
printDataArray();
Print("##### ОБУЧЕНИЕ #####");
for (i=0;i<maxTraining;i++) {
MSE = teach();
if (MSE < targetMSE) {
debug("training finished. Trainings ",i+1); i = maxTraining;
}
}
debug("MSE",f2M_get_MSE(ann));
Print("##### ЗАПУСК #####");
debug("1,3,1 = ВВЕРХ DOWN = DOWN. Правильный output 0.","");
prepareData("compute",1,3,1,0);
debug("1,2,3 = ВВЕРХ ВВЕРХ = ВВЕРХ. Правильный output 1.","");
prepareData("compute",1,2,3,0);
debug("3,2,1 = ВНИЗ ВНИЗ = ВНИЗ. Правильный output 0.","");
prepareData("compute",3,2,1,0);
debug("45,2,89 = ВНИЗ ВВЕРХ = ВВЕРХ. Правильный output 1.","");
prepareData("compute",45,2,89,0);
debug("1,3,23 = ВВЕРХ ВВЕРХ = ВВЕРХ. Правильный output 1.","");
prepareData("compute",1,3,23,0);
debug("7,5,6 = ВНИЗ ВВЕРХ = ВВЕРХ. Правильный output 1.","");
prepareData("compute",7,5,6,0);
debug("2,8,9 = ВВЕРХ ВВЕРХ = ВВЕРХ. Правильный output 1.","");
prepareData("compute",2,8,9,0);
Print("=================================== КОНЕЦ РАБОТЫ ================================");
return(0);
}
int start() {
return(0);
}
void printDataArray() {
int i,j;
int bufferSize = ArraySize(trainingData)/(f2M_get_num_input(ann)+f2M_get_num_output(ann))-1;
string lineBuffer = "";
for (i=0;i<bufferSize;i++) {
for (j=0;j<(f2M_get_num_input(ann)+f2M_get_num_output(ann));j++) {
lineBuffer = StringConcatenate(lineBuffer, trainingData[i][j], ",");
}
debug("DataArray["+i+"]", lineBuffer);
lineBuffer = "";
}
}
void prepareData(string action, double a, double b, double c, double output) {
double inputVector[];
double outputVector[];
ArrayResize(inputVector,f2M_get_num_input(ann));
ArrayResize(outputVector,f2M_get_num_output(ann));
inputVector[0] = a;
inputVector[1] = b;
inputVector[2] = c;
outputVector[0] = output;
if (action == "train") {
addTrainingData(inputVector,outputVector);
}
if (action == "compute") {
compute(inputVector);
}
}
void addTrainingData(double inputArray[], double outputArray[]) {
int j;
int bufferSize = ArraySize(trainingData)/(f2M_get_num_input(ann)+f2M_get_num_output(ann))-1;
for (j=0;j<f2M_get_num_input(ann);j++) {
trainingData[bufferSize][j] = inputArray[j];
}
for (j=0;j<f2M_get_num_output(ann);j++) {
trainingData[bufferSize][f2M_get_num_input(ann)+j] = outputArray[j];
}
ArrayResize(trainingData,bufferSize+2);
}
double teach() {
int i,j;
double MSE;
double inputVector[];
double outputVector[];
ArrayResize(inputVector,f2M_get_num_input(ann));
ArrayResize(outputVector,f2M_get_num_output(ann));
int call;
int bufferSize = ArraySize(trainingData)/(f2M_get_num_input(ann)+f2M_get_num_output(ann))-1;
for (i=0;i<bufferSize;i++) {
for (j=0;j<f2M_get_num_input(ann);j++) {
inputVector[j] = trainingData[i][j];
}
outputVector[0] = trainingData[i][3];
call = f2M_train(ann, inputVector, outputVector);
}
MSE = f2M_get_MSE(ann);
return(MSE);
}
double compute(double inputVector[]) {
int j;
int out;
double output;
ArrayResize(inputVector,f2M_get_num_input(ann));
out = f2M_run(ann, inputVector);
output = f2M_get_output(ann, 0);
debug("Computing()",MathRound(output));
return(output);
}
void debug(string a, string b) {
Print(a+" ==> "+b);
}
Результат

Рис 1. Результат работы программы.
Выводы
Также можно почитать статью "Используем нейронные сети в MetaTrader", написанную Mariusz Woloszyn, автором библиотеки Fann2MQL.
Мне понадобилось 4 дня на то, чтобы разобраться, как использовать библиотеку Fann в MetaTrader, при этом я использовал информацию отсюда и результаты поиска Google.
Надеюсь что этот пример будет полезным для вас, и позволит сэкономить много времени.
Если у вас есть вопросы, пожалуйста задавайте и я отвечу.
Перевод с английского языка выполнен MetaQuotes Software Corp.
Текст оригинала: http://articles.mql4.com/868