Помощь - Поиск - Пользователи - Календарь
Полная версия: Neuroshell2
Форум трейдеров рынка ФОРЕКС (FOREX). Анализ Форекс > Программы для Forex > Программы для Форекс
NoName
NeuroShell2
http://www.tradersforum.net.ru/modules/fil...file.php?lid=31
(возможно, понадобиться зарегистрироваться)
там же есть русский help к ней.
В этой программе заложено множество архитектур нейронных сетей. Принцип работы совершенно другой, нежели в NS DT4. Для этой программы нужно подготовить файл с данными для тренировки сети и выходами, затем выделяются тестовый и экзаменационный наборы, выбирается архитектура и параметры сети, и осуществляется тренировка. Дальше можно получить исходник сети на С++ или в виде *.def файла (это будут самодостаточные нейронные сети).
Лично я делал *.def файл, а за тем использовал его в советнике. Таким образом решается проблема интрадея.
Не уверен, но вроде бы есть возможность совмесного использования NS2 и NS DT4.
helena
пример прогноза индикатора на основе предикшена
Mick Jagger
Цитата(NoName @ 26.4.2007, 0:02) *

NeuroShell2
http://www.tradersforum.net.ru/modules/fil...file.php?lid=31
(возможно, понадобиться зарегистрироваться)
там же есть русский help к ней.
В этой программе заложено множество архитектур нейронных сетей. Принцип работы совершенно другой, нежели в NS DT4. Для этой программы нужно подготовить файл с данными для тренировки сети и выходами, затем выделяются тестовый и экзаменационный наборы, выбирается архитектура и параметры сети, и осуществляется тренировка. Дальше можно получить исходник сети на С++ или в виде *.def файла (это будут самодостаточные нейронные сети).
Лично я делал *.def файл, а за тем использовал его в советнике. Таким образом решается проблема интрадея.
Не уверен, но вроде бы есть возможность совмесного использования NS2 и NS DT4.

Спасибо за ссылку. русскую справку я скачал, а вот сам нейропакет...."Ошибка 404 - файл не найден".
Может где то ещё можно скачать эту программу. судя по твоему описанию, это то, что как раз мне необходимо.
NoName
Значит умерла ссылка, жаль.
Знаю что точно есть на пауке, вроде бы сам оттуда и качал.

P.S. Вот, нашлась ссылка: http://forex.kbpauk.ru/showflat.php/Cat/0/...age/0#Post95126
Только там нужно зарегистрироваться, а то ссылок на скачивание не увидишь.
Mick Jagger
Вот нашёл ссылку NeuroShell2 : http://a.myneuro.net.ru/archive/NeuroShell2.zip

Без всяких регистраций на сайте.
Кстати, на пауке регистрация просто сумашедшая! И кто же там такое придумал....
Mick Jagger
Цитата(NoName @ 26.4.2007, 0:02) *

NeuroShell2
http://www.tradersforum.net.ru/modules/fil...file.php?lid=31
(возможно, понадобиться зарегистрироваться)
там же есть русский help к ней.
В этой программе заложено множество архитектур нейронных сетей. Принцип работы совершенно другой, нежели в NS DT4. Для этой программы нужно подготовить файл с данными для тренировки сети и выходами, затем выделяются тестовый и экзаменационный наборы, выбирается архитектура и параметры сети, и осуществляется тренировка. Дальше можно получить исходник сети на С++ или в виде *.def файла (это будут самодостаточные нейронные сети).
Лично я делал *.def файл, а за тем использовал его в советнике. Таким образом решается проблема интрадея.
Не уверен, но вроде бы есть возможность совмесного использования NS2 и NS DT4.


Привет Андрей!
Скачал, установил, разобрался с программой NeoruShell2. Хорошая программа!!! Дошёл до создания .def файлов. А вот как импортировать функции в МТ4 понять не могу.
Ну вот на пример из описания функций из NSHELL2.DLL:

OpenNet - Эта функция читает .DEF-файл и создает сеть. Она возвращает номер сети для дальнейших ссылок на эту сеть. Она также возвращает
количество входов, ожидаемых сетью, и количество выходов, на которых будут появляться ответы сети. Правда, в штатном случае Вы уже будете
знать количество входов и выходов заранее.

FireNet - После того, как сеть подготовлена функцией OpenNet, функция FireNet используется для передачи значений входов сети и для
получения от нее значений выходов. И те, и другие должны представлять собой массивы двойной точности с плавающей запятой, объявленные в
Вашей программе. При использовании FireNet пропущенные данные не заменяются автоматически, как это делается, когда Вы указываете условия
в модуле Параметры тренировки и критерии остановки в NeuroShell 2. Это происходит потому, что нет никакого способа отличить пропущенные
данные от данных, равных нулю.


CloseNet - Вызовите эту функцию, когда Вам больше не надо будет использовать сеть. Она освободит всю память, занятую сетью. В следующий
раз, когда Вашей программе понадобится использовать эту сеть, ей потребуется снова вызвать OpenNet.

Прототипы и полные описания функций DLL для языка Си

OpenNet


int far PASCAL _export OpenNet(char far *defpath, int far *netnumber, int far *inputs, int far *outputs);



*defpath - это указатель на строку символов, содержащую путь к .DEF-файлу. Если путь содержит только имя файла, то этот файл должен быть
в текущем каталоге.

*netnumber - это указатель на целое число в Вашей программе, куда OpenNet поместит номер сети, который Вы будете использовать для
указания на сеть в функциях FireNet и CloseNet.

*inputs - это указатель на целое число в Вашей программе, куда OpenNet поместит ожидаемое сетью количество входов.

*outputs - это указатель на целое число в Вашей программе, куда OpenNet поместит ожидаемое количество выходов сети.


Если код возврата OpenNet отличен от нуля, это обычно происходит потому, что OpenNet не смогла найти действительного .DEF-файла в месте,
указанном переменной defpath.

В функцию OpenNet передаются 4 параметра. Первый параметр имеет тип char, в MQL4 типа char нет. Потом все параметры в эту функцию передаются через указатели. Видишь * в прототипе. А указателей в MQL4 нет. Ссылки (&) вот есть, а указателей нет. Но ссылки и указатели совсем разные вещи. Как ты решил эту проблему. ты же как то решил это, раз пишешь что использовал .def файлы в советнике?
NoName
Привет!
Да, в MQL нет адресной арифметики, но тут можно обыграть таким образм - передавать в функцию массив размером в один элемент, тогда всё проходит отлично. Вместо типа char используй string, этим параметром там задаётся путь к *.def файлу.

Извини, сейчас нет времени, но ближе к ночи я выложу заготовку эксперта. Там всё ясно и понятно.
NoName
Вот нашёл у себя советник klot'а! Тут достаточно вставить свою начинку в нужные места. К сожалению самой сети я не нашёл.

Код

#import "NS2-32.dll"
int OpenNet(string defpath, int& netnumber[1], int& n_input[1], int& n_out[1]);
int FireNet(int& netnumber[1], double& inarray[], double& outarray[]);
int CloseNet(int& netnumber[1]);
#import

// StopLoss level
extern double sl = 85;
extern double tp = 252;
extern double Lots = 1;
extern int MAGICEXP = 888;
//---
static int prevtime = 0;
//----
int ret_O,ret_F;
int M=64;
string defpath="E:\Program Files\NeuroShell2\NewFolder\MACD\macd1.def";
int netnumber[1], N_in[1], N_out[1];
double inarray[],outarray[],aa[64];

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   ret_O=OpenNet(defpath, netnumber, N_in, N_out);
  
     Print("netnumber[1]= ",netnumber[0], " N_in[1]= ",N_in[0], " N_out[1]= ",N_out[0]);
     ArrayResize(inarray,N_in[0]);
     ArrayResize(outarray,N_out[0]);

//----
   return(0);
  }

//-------------------------------------------------------------------+
void innet()
{
        int shift=0;
        
        inarray[0]=High[shift+4]-High[shift+3];
        inarray[1]=Low[shift+4]-Low[shift+3];
        inarray[2]=Close[shift+4]-Close[shift+3];
        inarray[3]=High[shift+3]-High[shift+2];
        inarray[4]=Low[shift+3]-Low[shift+2];
        inarray[5]=Close[shift+3]-Close[shift+2];
        inarray[6]=High[shift+2]-High[shift+1];
        inarray[7]=Low[shift+2]-Low[shift+1];
        inarray[8]=Close[shift+2]-Close[shift+1];
        inarray[9]=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,shift+1);
        inarray[10]=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,shift+2);
        inarray[11]=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,shift+1);
        inarray[12]=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,shift+2);
        inarray[13]=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,shift+1);
        inarray[14]=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,shift+2);

}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {

   if(Time[0] == prevtime) return(0);
   prevtime = Time[0];
  
   //---
   int poz=Check_for_open_pos();
  
   innet();
  
   ret_F=FireNet(netnumber, inarray, outarray);

   double sum=outarray[0]+outarray[1]+outarray[2];
   Comment (outarray[0], " ", outarray[1], " ", outarray[2]);
  
   outarray[0]=outarray[0]/sum;
   outarray[1]=outarray[1]/sum;
   outarray[2]=outarray[2]/sum;
  
   Comment("ret_F= ",ret_F, " outarray[0]= ",DoubleToStr(outarray[0],8),
   " outarray[1]= ",DoubleToStr(outarray[1],8)," outarray[2]= ", DoubleToStr(outarray[2],8));
  
   if( outarray[0]>outarray[2] && outarray[0]>outarray[1] && poz!=1) { buy_open( Bid-sl*Point,Bid+tp*Point); close_order(-1); }
   if( outarray[2]>outarray[0] && outarray[2]>outarray[1] && poz!=-1) { sell_open( Ask+sl*Point,Ask-tp*Point); close_order(1); }

   if( outarray[1]>outarray[2] && outarray[1]>outarray[0] && poz==1 ) close_order(1);
   if( outarray[1]>outarray[2] && outarray[1]>outarray[0] && poz==-1 ) close_order(-1);

//--- exit
   return(0);
  }
//===================================================================+
// Торговые функции                                                  |
//===================================================================+
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void buy_open(double SL, double TP)
  {
   int ticket, lasterror;
   RefreshRates();
   ticket = OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(MarketInfo(Symbol(),MODE_ASK),Digits),5,
                        SL,TP,0,MAGICEXP,0,Aqua);
   if(ticket > 0)
     {
       if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
           Print("BUY order opened : ", OrderOpenPrice());
//---  
     }
   else
       Print("Error opening BUY order : ", ErrorDescription(GetLastError()));
   return;
  }
//===================================================================+
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void sell_open(double SL, double TP)
  {
   int ticket, lasterror;
   RefreshRates();
  
   ticket = OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(MarketInfo(Symbol(),MODE_BID),Digits),5,
         SL,TP,0,MAGICEXP,0,Red);
   if(ticket > 0)
     {
       if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
           Print("Sell order opened : ", OrderOpenPrice());
//---
     }
   else
       Print("Error opening Sell order : ", ErrorDescription(GetLastError()));
   return;
  }
//===================================================================+
//+------------------------------------------------------------------+
//|   Закрытие ордеров n=1 - закрыть Buy, n=-1 - закрыть Sell        |
//+------------------------------------------------------------------+
void close_order(int n = 0)
{
   int nGetLastError;
   int nOrdersTotal =OrdersTotal();
   int i;
//----
  if(nOrdersTotal>0)
  {
   for( i=nOrdersTotal-1; i>=0; i--)
     {
       OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
       //nGetLastError = GetLastError();
       //----
       if(nGetLastError != 0)
         {
           Print("1_Error selecting order : ", ErrorDescription(nGetLastError)," i= ", i," OrdersTotal()= ",OrdersTotal());
           continue;
         }
       //----
       if(OrderMagicNumber() != MAGICEXP || OrderSymbol() != Symbol())  continue;
       //---- check order type
       if(OrderType() == OP_BUY && n == 1)
         {
           //----
               RefreshRates();
               OrderClose(OrderTicket(), OrderLots(),NormalizeDouble(MarketInfo(Symbol(),MODE_BID),Digits), 3, Aqua);
               nGetLastError = GetLastError();
               if(nGetLastError != 0)
                  Print("2_Error closing BUY order : ", ErrorDescription(nGetLastError));
         }
       //----
       if(OrderType() == OP_SELL && n==-1 )
         {
           //----
               RefreshRates();  
               OrderClose(OrderTicket(), OrderLots(),NormalizeDouble(MarketInfo(Symbol(),MODE_ASK),Digits), 3, Yellow);
               nGetLastError = GetLastError();
               if(nGetLastError != 0)
                   Print("3_Error closing SELL order : ", ErrorDescription(nGetLastError));        
         }
     }
   }
return;
}
//===================================================================+
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Check_for_open_pos()
{
   int ticket,cnt,pos;
   int nGetLastError;
   //---
   pos=0;
   if (OrdersTotal()>0)
   {
      for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
         {
            OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
            //nGetLastError = GetLastError();
            //----
            if(nGetLastError != 0)
               {
               Print("5_Check_for_open_pos : ", ErrorDescription(nGetLastError)," i= ", cnt," OrdersTotal()= ",OrdersTotal());
               continue;
               }
            //---
            if(OrderMagicNumber()!=MAGICEXP || OrderSymbol()!=Symbol()
                                            || OrderCloseTime()!=0 ) continue;
            //---
            if(OrderType()==OP_SELL ) pos=-1;
            //---
            if(OrderType()==OP_BUY )  pos=1;
         }
   }
return(pos);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
  //---
  CloseNet(netnumber);  // close the network
  //----
  return(0);
}



P.S. Если ты планируешь и дальше копать по этой теме, то предлагаю открыть отдельную ветку по Нейрошелу2. Мне эта программа тоже интересна.
Mick Jagger
Цитата(NoName @ 29.4.2007, 23:09) *

Вот нашёл у себя советник klot'а! Тут достаточно вставить свою начинку в нужные места. К сожалению самой сети я не нашёл.

P.S. Если ты планируешь и дальше копать по этой теме, то предлагаю открыть отдельную ветку по Нейрошелу2. Мне эта программа тоже интересна.


Спасибо большое за код! Я разобрался, теперь у меня всё работает. Жаль только, что разработчики MQL подстраиваются по синтаксис С, а возможность использования указателей не сделали. Поэтому и приходится так выкручиваться. Возможно и не надо такие объектно-ориентированные вещи как классы из С++, но указатели всё таки могли бы ввести, тем более это незаменимая штука при работе с динамическими библиотеками.
Да я планирую "копать" smile.gif по этой теме. Поэтому полностью поддерживаю тебя по отдельной ветки форума. Хотя NS2 и NST4 родственные программы, всё-таки NS2 выполняет задачи несколько по другому. Да и потом, подкупает русский интерфейс и классная справка с учебником, тоже кстати на русском языке. Написано просто и доступно, даже для новичков в нейросетях. Так что остаётся решить, кто же создаст отдельную ветку?smile.gif
NoName
Что-то не понял, где это русский интерфейс ??? У меня она на вражем языке, русская только справка smile.gif
Ветку создам завтра, и наверное попрошу КОТа что бы перенёс сообщения туда.

P.S. У меня просьба, подотри, пожалуйста, код из цитаты, а то пара сообщений целую страницу занимаютsmile.gif
Mick Jagger
Цитата(NoName @ 30.4.2007, 4:36) *

Что-то не понял, где это русский интерфейс ??? У меня она на вражем языке, русская только справка smile.gif
Ветку создам завтра, и наверное попрошу КОТа что бы перенёс сообщения туда.

P.S. У меня просьба, подотри, пожалуйста, код из цитаты, а то пара сообщений целую страницу занимаютsmile.gif


У меня программа полностью с русским интерфейсом, с русскми менюшками, с русской справкой, с русским учебником... просто красота! Бери по моей ссылке программу с русским интерфесом.
Выкладываю картинку.
Нажмите для просмотра прикрепленного файла
NoName
В этой теме предлагаю обсуждать работу с программой NeuroShell2.
Скачать русскую версию можно из нашего файлового архива:
http://www.tradersforum.net.ru/modules/fil...file.php?lid=31 (ссылка обновлена)
Mick Jagger
Андрей, у тебя были какие-либо удачные решения с использованием NS2?
NoName
Увы, нет.
На выборке, которая не участвовала в обучении результаты были весьма плачевные. Но у меня пока небыло достаточно времени в плотную занятся этим вопросом. Тогда я подавал на вход всё что попало, выход, естественно был таким же wink.gif
Столкнулся ещё с другой проблемой, самой нейросети, как оказалось, мало. Нужно ещё подобрать удачный алгоритм принятия торговых решений, а сама нейросеть - это только часть стратегии. Пусть и весомая часть, но всё же часть.
Вот, например, сеть может нам возвращать сигнал либо больше ноля, либо меньше. Казалось бы чего проще ... когда больше - покупай, когда меньше - продавай. Но подобное решение даёт очень много сделок, большинство из которых не самые удачные. Тут, думаю есть два пути: первый - увеличить точность прогноза сети, что не так просто; второй - использовать подтверждающие факторы. Это может быть как другая неросеть, так и какая-то другая стратегия.
В общих чертах я так это всё себе представляю smile.gif

Вот в этой ветке в своё время перетирали эту тему, но сейчас обсуждение прекратилось. Прочитать очень рекомендую:
http://www.fxexpert.ru/forum/index.php?showtopic=656
Mick Jagger
У тебя когда наступит время разобрать с NS2?smile.gif
Предлагаю, пока ещё никто не присоединился к обсуждению этой ветки, сделать какой нибудь совместный эксперимент в NS2. Раз у тебя нет результатов и у меня пока особо тоже нет, может придумаем совместно что-нибудь?

Не согласен с тобой, что нейросеть нельзя использрвать отдельно. Я считаю это самодостаточным инструментом. Самодостаточной стратегии. Только проблема заключается в том, что выбрать за входы.
Я всегда считал и считаю, что это должно быть что то простое. Потом все классические индикаторы, в качестве входов, нужно отвергнуть. На самом деле все они совершенно не однозначные. Например если ты мне покажешь 100 примеров на стохастике, где был сигнал на разворот и разворот действительно был, я тебе покажу 100 примеров где был сигнал на разворот и разворот не было. Все эти классические индикаторы похожи на кидание монетки с вероятностью 0.5. Совместно их тоже нельзя использовать, ибо два индикатора (например стохастик и рси) с вероятностью 0,5 дают в сумме ту же вероятность 0.5. Это так вкратце моё вступлениеsmile.gif.
NoName
Цитата
У тебя когда наступит время разобрать с NS2?smile.gif


В скором времени я пропаду и появлюсь аж в конце июня sad.gif

Цитата
Я всегда считал и считаю, что это должно быть что то простое. Потом все классические индикаторы, в качестве входов, нужно отвергнуть. На самом деле все они совершенно не однозначные. Например если ты мне покажешь 100 примеров на стохастике, где был сигнал на разворот и разворот действительно был, я тебе покажу 100 примеров где был сигнал на разворот и разворот не было.


Тут я с тобою согласен! К тому же убедился в этом на собственном опыте. Считаю что если эти индикаторы и использовать, то не в чистом виде. Например, брать значение разницы на двух соседних барах или нескольких соседних.
Так же я считаю что нужно предсказывать направление движения, а не конкретное значение цены или индикатора.

Сейчас я сильно засматриваюсь в сторону самоорганизующихся сетей Кохонена. Тут самим собой отпадает вопрос что показывать сети в качестве выхода, т.к. обучение проходит без учителя. Но вот что подавать на вход, пока, увы, незнаю. На это прийдётся потратить время и определить наилучший результат эксперементальным путём.

А какая архитектура сети больше по душе тебе? Наверняка же есть прикидки в каком направлении двигаться?
Mick Jagger
Цитата
В скором времени я пропаду и появлюсь аж в конце июня sad.gif


Ну как будешь готов пропась сообщи пожалуйста.

Цитата
Тут я с тобою согласен! К тому же убедился в этом на собственном опыте. Считаю что если эти индикаторы и использовать, то не в чистом виде. Например, брать значение разницы на двух соседних барах или нескольких соседних.


Разницу придётся брать в любом случае. Так как сети нужно подавать нормированные данные, что бы сеть могла работать на любом ценовом диапазоне.

Цитата
Так же я считаю что нужно предсказывать направление движения, а не конкретное значение цены или индикатора.


Согласен с тобой в этом вопросе. Хотя тут возможны применить методы, которые на выходе сети будут давать не только два значения (0-вниз,1-вверх).

Цитата
Сейчас я сильно засматриваюсь в сторону самоорганизующихся сетей Кохонена. Тут самим собой отпадает вопрос что показывать сети в качестве выхода, т.к. обучение проходит без учителя.


Не занимался этой категорией сетей. В ближайшее время планирую почитать материал, что бы поближе познакомиться с этой темой. хотя слово "самоорганизующий" несколько настораживаетsmile.gif. Ничего в мире само по себе не организуется и не происходит. Мне "грустно и смешно", когда я читаю сводки типа, "доллар сегодня упал". Как это упал??? Его уронили, кто-то сделал так, что-бы курс доллара стал ниже. Вот шкаф например сам же не падает, для этого надо, что бы его кто-то толкнул.

Цитата
А какая архитектура сети больше по душе тебе? Наверняка же есть прикидки в каком направлении двигаться?


Из тех архитектур, которые есть в NS2, самая подходящая - это сети Ворда, с различным передаточными функциями. Они быстро учатся и дают приличные результаты...ну по крайней мере на те задачи, которые я предявляю.



NoName
Ну я не совсем точно выразился, пропадать совсем я не буду, а в силу занятости перемещусь в группу "читателей". Это произойдёт, скорее всего, с начала следующей недели.

Цитата
Из тех архитектур, которые есть в NS2, самая подходящая - это сети Ворда, с различным передаточными функциями. Они быстро учатся и дают приличные результаты...ну по крайней мере на те задачи, которые я предявляю.


А теперь самые интересные вопросыsmile.gif
Что подавалось на вход, и какой был результат вне репрезентативной выборки?
Mick Jagger
Ну про приличные рузультаты я может это сильно сказал. Ничего определённого связанного с курсом валют я на вход сети Ворда не подавал. Я же только пока эксперементирую. В общем те данные которые я подавал, у меня получились следующие диапазоны ошибок: доля ошибок от 0%-30% составляет около 70 % ответов, а доля ошибок выше 30% составляет около 30 % ответов. Во в принципе и все пока достижения.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.