Кто хорошо разобрался с FANN, подскажите, как с ними работать)

 

Хочу написать советника с использованием этой библиотеки.

В советнике хочу увидеть следующее: если идет оптимизация, то должно происходить обучение нейросетки и ее сохранение,

а если идет тестирование или торговля, то сетка не меняется. Для примера возьмем самый простой набор данных:

for(int a=0;a<nn_input;a++)
{
inputArray[a]=(iHigh(Symbol(),0,a+2)-iHigh(Symbol(),0,a+3))/Point;
}
outputArray[0]=(iHigh(Symbol(),0,1)-iHigh(Symbol(),0,2))/Point;


То есть на входы подаются значения nn_input последних приращений хаев (начиная с второго), а в качестве эталонного выхода - разница

хаев последнего и предпоследнего сформировавшихся баров.

По логике вещей, для обучения надо использовать функцию типа (взята из статьи Использование библиотеки FANN2MQL в MetaTrader ):

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);
}

И потом сравнивать ее результат с допустимым среднеквадратичным отклонением, проводя подбор весов.

Все это предисловие)))
А теперь по существу:
1) Как подготовить данные для teach()?
2) Как запомнить полученные веса?
3) И как эти веса потом достать и заставить сетку выдавать результат/прогноз?

Сразу оговорюсь по поводу первого вопроса: метод, используемый в вышеуказанной статье не подходит, потому что в нем проблематично
 менять количество входов, да и при большом количестве аргументов функция
void prepareData(string action, double a, double b, double c,..., double output)
выглядит не очень хорошо.
Очень надеюсь на ваши советы)

 
Не проще взять советник Юрия Решетова (огромный респект и уважуха :)), как основу и крутить его как влезет, там мне кажеться всё грамотно расписано. Вообще было бы здорово описать в виде советника все возможности этой библиотеки.....
 
В советнике Решетова совсем другой принцип.
 

По пп.2 и 3 чем не устраивают f2M_save и f2M_create_from_file?

По п.1 не понятна проблема, т.к. даже не важно сетка у нас или не сетка - любая обработка данных обычно требует заполнение некоторых массивов - делайте это так, как Вам удобно.

 

Уже разобрался.

Обычное для меня дело - чтобы разобраться самому, мне надо сначала сформулировать, чтобы вопрос поняли все, а где это можно сделать лучше, чем на форуме?)))

Правда советник еще не готов...

 

Может кто-нибудь подсказать, в чем ошибка?

// Include Neural Network package
#include <Fann2MQL.mqh>

// Global defines
#define ANN_PATH "C:\\ANN\\"
// EA Name
#define NAME "NM"


int AnnInputs=30;
void start()
{
string path = ANN_PATH;
ann_load(path+".net");
}
//|--------------------------------------------+
//| |
//|--------------------------------------------+
int ann_load( string path1)
{
int ann = -1;
ann = f2M_create_from_file (path1);
if (ann == -1) {

/* Create ANN */
ann = f2M_create_standard (4, AnnInputs, AnnInputs, AnnInputs / 2 + 1, 1);
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);
}
Print(ann);
return(ann);
}

При тестировании этого куска выдается следующее:

2009.12.15 21:52:12 2009.09.30 23:59 нейропробник EURUSD,H1: -1
То есть, выходит, что сетка не создается. В чем именно я напортачил?

ЗЫ. Папка ANN создана

 
Kharin >>:

Может кто-нибудь подсказать, в чем ошибка?

// Include Neural Network package
#include <Fann2MQL.mqh>

// Global defines
#define ANN_PATH "C:\\ANN\\"
// EA Name
#define NAME "NM"


int AnnInputs=30;
void start()
{
string path = ANN_PATH;
ann_load(path+".net");
}
//|--------------------------------------------+
//| |
//|--------------------------------------------+
int ann_load( string path1)
{
int ann = -1;
ann = f2M_create_from_file (path1);
if (ann == -1) {

/* Create ANN */
ann = f2M_create_standard (4, AnnInputs, AnnInputs, AnnInputs / 2 + 1, 1);
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);
}
Print(ann);
return(ann);
}

При тестировании этого куска выдается следующее:

2009.12.15 21:52:12 2009.09.30 23:59 нейропробник EURUSD,H1: -1
То есть, выходит, что сетка не создается. В чем именно я напортачил?

ЗЫ. Папка ANN создана

ошибка в том, что (внимательно отследите значения переменных) на момент вызова f2M_create_standard параметр path1 равен "C:\\ANN\\.net"

Вы уверены, что храните сетку в папке ANN в файле с именем ".net"?

 

А где в этой строке

ann = f2M_create_standard (4, AnnInputs, AnnInputs, AnnInputs / 2 + 1, 1);

указывается адрес сохранения и указывается, что надо сохранять?

Сохранение же делается функцией f2M_save (ann, path)? Или я не прав?

Причина обращения: