Использование Neuroshell сетей в MQL4 - страница 2

 
Я несколько лет назад занимался сетями, исключительно средствами MQL. Какие выводы я сделал. При обучении сети мы имеем два крайних варианта, все остальные промежуточные. Крайние варианты: размер обучающей выборки сопоставим с числом нейронов (отличается не более, чем на порядок); второй - размер обучающей выборки на много порядков превосходит число нейронов. В первом случае на графике мы видим хаотичный набор весов нейронов, типичный упаковщик, который запоминает предъявленную последовательность.  Даем на вход другую последовательность, чаще всего, ничего общего. Второй вариант показывает на графике кривую, соответствующую какой-то скользящей средней. То есть, пытается поймать тенденцию. Результаты далекие, но, лучшие, чем в первом варианте. В результате я пришел к выводу, что сети второго типа более правильны и веса нейронов должны быть нестационарными. То есть, сеть непрерывно должна подстраиваться под ситуацию.
 
evillive:

Равно, вы даже могли оставить в виде  5.894932Е-02, компилятор понимает такой вид написания. И даже не было необходимости exp() менять на MathExp(), да и tan() вполне работает. 

Не в этом ошибка. Скорее всего данные для тренировки сети не совсем соответствуют котировкам в терминале. 

А какой практический смысл в сети, которая всего лишь повторяет входные данные? Стоит ли оно того?


 Что  то у меня ругается



На счет смысла сети .

Она не повторяет входные данные , а учится предсказывать  Open[] - Close[]  на бар вперед 

 
mqluser4:


 Что  то у меня ругается



На счет смысла сети .

Она не повторяет входные данные , а учится предсказывать  Open[] - Close[]  на бар вперед 


tan() а не tanh()

Нейросеть предсказывать врядли способна, даже на 1 бар.  По крайней мере не на основе десятка-двух предыдущих баров.

 

 Если исходник сети нейрошела скомпилировать внешним компилятором и вставить в терминал через DLL механизм ,

то картина получается не радостная .

Первое впечатление ,  что нейрошел  генерирует неправильный исходник сети .....



/* libfire.h */
#ifdef LIBFILE_EXPORT
#define LIBFILE_API __declspec(dllexport)
#else
#define LIBFILE_API __declspec(dllimport)
#endif
 
extern "C" {
 
    LIBFILE_API void __stdcall Fire(double *inarray , double *outarray );
 
}



 
 
/* libfire.cpp */
#define LIBFILE_EXPORT
#include "libfire.h"
 
#include <math.h>


 
void  __stdcall Fire(double *inarray  , double *outarray  )
{


 double netsum;
 double feature2[7];
 double feature3[7];
 double feature4[7];
 
/* inarray[1] - это C1 */
/* inarray[2] - это C2 */
/* inarray[3] - это C3 */
/* inarray[4] - это C4 */
/* outarray[1] - это C5 */
 
if (inarray[0]<-0.0485) inarray[0] = -0.0485;
if (inarray[0]>0.0594) inarray[0] = 0.0594;
inarray[0] =  2 * (inarray[0] + 0.0485) / 0.1079 -1;
 
if (inarray[1]<-0.0374) inarray[1] = -0.0374;
if (inarray[1]>0.0498) inarray[1] = 0.0498;
inarray[1] =  2 * (inarray[1] + 0.0374) / 0.0872 -1;
 
if (inarray[2]<-0.0361) inarray[2] = -0.0361;
if (inarray[2]>0.0379) inarray[2] = 0.0379;
inarray[2] =  2 * (inarray[2] + 0.0361) / 0.074 -1;
 
if (inarray[3]<-0.0284) inarray[3] = -0.0284;
if (inarray[3]>0.0323) inarray[3] = 0.0323;
inarray[3] =  2 * (inarray[3] + 0.0284) / 0.0607 -1;
 
netsum = -0.282524;
netsum += inarray[0] * 0.2365421;
netsum += inarray[1] * -0.1231646;
netsum += inarray[2] * -2.195096E-02;
netsum += inarray[3] * 5.894932E-02;
feature2[0] = exp(-netsum * netsum);
 
netsum = 3.431995E-02;
netsum += inarray[0] * 0.1828696;
netsum += inarray[1] * -0.3006894;
netsum += inarray[2] * -0.246816;
netsum += inarray[3] * 5.375264E-02;
feature2[1] = exp(-netsum * netsum);
 
netsum = -0.1642227;
netsum += inarray[0] * 0.1589484;
netsum += inarray[1] * -0.2292033;
netsum += inarray[2] * -0.2810424;
netsum += inarray[3] * -0.1825833;
feature2[2] = exp(-netsum * netsum);
 
netsum = 0.1567227;
netsum += inarray[0] * -0.166558;
netsum += inarray[1] * -5.058616E-02;
netsum += inarray[2] * -0.2415255;
netsum += inarray[3] * 0.1213906;
feature2[3] = exp(-netsum * netsum);
 
netsum = 4.119821E-02;
netsum += inarray[0] * 0.2071717;
netsum += inarray[1] * -0.2146507;
netsum += inarray[2] * -8.789687E-02;
netsum += inarray[3] * -3.491069E-02;
feature2[4] = exp(-netsum * netsum);
 
netsum = -1.382797E-02;
netsum += inarray[0] * 0.1246694;
netsum += inarray[1] * -0.2011396;
netsum += inarray[2] * 1.725667E-02;
netsum += inarray[3] * -8.986322E-02;
feature2[5] = exp(-netsum * netsum);
 
netsum = -7.906423E-02;
netsum += inarray[0] * 1.242629E-02;
netsum += inarray[1] * 0.29257;
netsum += inarray[2] * 5.532621E-02;
netsum += inarray[3] * -0.2749403;
feature2[6] = exp(-netsum * netsum);
 
netsum = 0.2879203;
netsum += inarray[0] * 0.189353;
netsum += inarray[1] * -4.599527E-02;
netsum += inarray[2] * -0.3233119;
netsum += inarray[3] * 0.1965496;
feature3[0] = tanh(netsum);
 
netsum = 2.006373E-02;
netsum += inarray[0] * 0.2072955;
netsum += inarray[1] * 0.1955415;
netsum += inarray[2] * 0.2627103;
netsum += inarray[3] * -1.833003E-02;
feature3[1] = tanh(netsum);
 
netsum = -0.2168624;
netsum += inarray[0] * 0.2976118;
netsum += inarray[1] * -0.2851484;
netsum += inarray[2] * -0.1389391;
netsum += inarray[3] * -0.1753528;
feature3[2] = tanh(netsum);
 
netsum = -4.251536E-02;
netsum += inarray[0] * 0.292901;
netsum += inarray[1] * -0.1031563;
netsum += inarray[2] * -0.1195951;
netsum += inarray[3] * 0.1207087;
feature3[3] = tanh(netsum);
 
netsum = -0.1719727;
netsum += inarray[0] * 6.019998E-02;
netsum += inarray[1] * -0.2743589;
netsum += inarray[2] * 6.857034E-02;
netsum += inarray[3] * -4.178341E-02;
feature3[4] = tanh(netsum);
 
netsum = 0.2233482;
netsum += inarray[0] * -0.0652561;
netsum += inarray[1] * 0.1022277;
netsum += inarray[2] * 0.1196216;
netsum += inarray[3] * -2.823213E-02;
feature3[5] = tanh(netsum);
 
netsum = -0.1742411;
netsum += inarray[0] * -0.1370615;
netsum += inarray[1] * -0.2542539;
netsum += inarray[2] * 0.1967436;
netsum += inarray[3] * 0.2812807;
feature3[6] = tanh(netsum);
 
netsum = -0.204869;
netsum += inarray[0] * -0.133566;
netsum += inarray[1] * -0.2862521;
netsum += inarray[2] * -0.318849;
netsum += inarray[3] * -0.2710454;
feature4[0] = 1 - exp(-netsum * netsum);
 
netsum = -0.1635372;
netsum += inarray[0] * -0.2003987;
netsum += inarray[1] * 0.2688678;
netsum += inarray[2] * 0.2757982;
netsum += inarray[3] * -0.1931585;
feature4[1] = 1 - exp(-netsum * netsum);
 
netsum = -3.867657E-02;
netsum += inarray[0] * 8.968055E-02;
netsum += inarray[1] * -0.2223219;
netsum += inarray[2] * 9.906644E-02;
netsum += inarray[3] * 0.1770547;
feature4[2] = 1 - exp(-netsum * netsum);
 
netsum = 0.1528167;
netsum += inarray[0] * -1.067778E-02;
netsum += inarray[1] * 0.2354377;
netsum += inarray[2] * -0.2014543;
netsum += inarray[3] * -1.884078E-02;
feature4[3] = 1 - exp(-netsum * netsum);
 
netsum = 2.655918E-02;
netsum += inarray[0] * -0.2591889;
netsum += inarray[1] * 0.1168908;
netsum += inarray[2] * 0.2284805;
netsum += inarray[3] * -0.1992159;
feature4[4] = 1 - exp(-netsum * netsum);
 
netsum = 0.2966768;
netsum += inarray[0] * 0.121243;
netsum += inarray[1] * -0.114669;
netsum += inarray[2] * 0.193731;
netsum += inarray[3] * 5.757192E-03;
feature4[5] = 1 - exp(-netsum * netsum);
 
netsum = 0.1632974;
netsum += inarray[0] * 2.642303E-02;
netsum += inarray[1] * -2.55042E-03;
netsum += inarray[2] * 6.799737E-02;
netsum += inarray[3] * 0.1879126;
feature4[6] = 1 - exp(-netsum * netsum);
 
netsum = -6.048463E-02;
netsum += feature2[0] * 5.469751E-02;
netsum += feature2[1] * 8.835526E-02;
netsum += feature2[2] * 1.60323E-03;
netsum += feature2[3] * -0.1855921;
netsum += feature2[4] * 0.1008915;
netsum += feature2[5] * 1.587034E-02;
netsum += feature2[6] * 0.1592594;
netsum += 2.156724E-02;
netsum += feature3[0] * -0.3081859;
netsum += feature3[1] * 3.557891E-02;
netsum += feature3[2] * 2.385841E-02;
netsum += feature3[3] * 0.0917619;
netsum += feature3[4] * 0.1527044;
netsum += feature3[5] * 1.573258E-02;
netsum += feature3[6] * -1.742252E-02;
netsum += -0.1817411;
netsum += feature4[0] * -0.311413;
netsum += feature4[1] * 1.100017E-02;
netsum += feature4[2] * 9.607796E-02;
netsum += feature4[3] * 0.1235664;
netsum += feature4[4] * 0.1278843;
netsum += feature4[5] * -4.006739E-03;
netsum += feature4[6] * -0.2482496;
outarray[0] = 1 / (1 + exp(-netsum));
 
 
outarray[0] = 0.0607 *  (outarray[0] - .1) / .8  + -0.0284;
if (outarray[0]<-0.0284) outarray[0] = -0.0284;
if (outarray[0]>0.0323) outarray[0] = 0.0323;


}



//--------------------------------------------------------------------
#property indicator_separate_window            // Индик. рисуется в основном окне
#property indicator_buffers 2                  // Количество буферов
#property indicator_color1 clrForestGreen      // Цвет первой линии
#property indicator_color2 Blue                // Цвет первой линии
  
#import "13-07-2016.dll"                       // подключаем нашу DLL
    void   Fire( double & inarray[19] ,  double & outarray[19]); //функция из  нашей  DLL
#import
  

double   inarray[19] , outarray[19] ;
double Buf_0[] , Buf_1[] ;               // Объявление массивов (под буферы индикатора)
//--------------------------------------------------------------------
int init()                          // Специальная функция init()
  {
   SetIndexBuffer(0,Buf_0);           // Назначение массива буферу
   SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);  // Стиль линии
   SetIndexBuffer(1,Buf_1);           // Назначение массива буферу
   SetIndexStyle (1,DRAW_LINE,STYLE_SOLID,2);  // Стиль линии
  }
//--------------------------------------------------------------------
int start()                         
  {
   int i ;                
   
   for (i=150 ; i>=0 ; i-- )                      // Цикл по непосчитанным барам
     {

  inarray[1] = Close[i]-Open[i];
  inarray[2] = Close[i]-Open[i+1];
  inarray[3] = Close[i]-Open[i+2];
  inarray[4] = Close[i]-Open[i+3];
  inarray[5] = Close[i]-Open[i+4];
  inarray[6] = Close[i]-Open[i+5];
  inarray[7] = Close[i]-Open[i+6];
  inarray[8] = Close[i]-Open[i+7];
  inarray[9] = Close[i]-Open[i+8];
  inarray[10] = Close[i]-Open[i+9];
  inarray[11] = Close[i]-Open[i+10];
  inarray[12] = Close[i]-Open[i+11];
  inarray[13] = Close[i]-Open[i+12];  
     
   // Сеть нейрошела 
   Fire( inarray ,     outarray) ; 
        
   // выход сети      
   Buf_0[i]=  outarray[0] ;    

   // Учитель 
   Buf_1[i]=  Open[i-1] - Close[i-1] ;    

     }
  }
 
 

Кто еще думает ?

 

Зато в  программной среде нейрошела все  на ура :



покрупнее



 

      

 
/* Для использования сети H:\ns2\13-07-2016\DataNS2-DAY-13-07-2016 вставьте этот код в вашу программу на языке C. */
/* Этот код приспособлен для простого и быстрого переноса на любой компьютер. */
/* Поэтому вся логика работы описана без использования циклов и динамических массивов, */
/* что могло бы затруднить перенос кодов на разные компиляторы. */
 
#include <math.h>
 
void Fire_DataNS2-DAY-13-07-2016(double *inarray, double *outarray)
{
 double netsum;
 double feature2[7];
 double feature3[7];
 double feature4[7];
 
/* inarray[1] - это C1 */
/* inarray[2] - это C2 */
/* inarray[3] - это C3 */
/* inarray[4] - это C4 */
/* outarray[1] - это C5 */
 
if (inarray[0]<-0.0485) inarray[0] = -0.0485;
if (inarray[0]>0.0594) inarray[0] = 0.0594;
inarray[0] =  2 * (inarray[0] + 0.0485) / 0.1079 -1;
 
if (inarray[1]<-0.0374) inarray[1] = -0.0374;
if (inarray[1]>0.0498) inarray[1] = 0.0498;
inarray[1] =  2 * (inarray[1] + 0.0374) / 0.0872 -1;
 
if (inarray[2]<-0.0361) inarray[2] = -0.0361;
if (inarray[2]>0.0379) inarray[2] = 0.0379;
inarray[2] =  2 * (inarray[2] + 0.0361) / 0.074 -1;
 
if (inarray[3]<-0.0284) inarray[3] = -0.0284;
if (inarray[3]>0.0323) inarray[3] = 0.0323;
inarray[3] =  2 * (inarray[3] + 0.0284) / 0.0607 -1;
 
netsum = -0.282524;
netsum += inarray[0] * 0.2365421;
netsum += inarray[1] * -0.1231646;
netsum += inarray[2] * -2.195096E-02;
netsum += inarray[3] * 5.894932E-02;
feature2[0] = exp(-netsum * netsum);
 
netsum = 3.431995E-02;
netsum += inarray[0] * 0.1828696;
netsum += inarray[1] * -0.3006894;
netsum += inarray[2] * -0.246816;
netsum += inarray[3] * 5.375264E-02;
feature2[1] = exp(-netsum * netsum);
 
netsum = -0.1642227;
netsum += inarray[0] * 0.1589484;
netsum += inarray[1] * -0.2292033;
netsum += inarray[2] * -0.2810424;
netsum += inarray[3] * -0.1825833;
feature2[2] = exp(-netsum * netsum);
 
netsum = 0.1567227;
netsum += inarray[0] * -0.166558;
netsum += inarray[1] * -5.058616E-02;
netsum += inarray[2] * -0.2415255;
netsum += inarray[3] * 0.1213906;
feature2[3] = exp(-netsum * netsum);
 
netsum = 4.119821E-02;
netsum += inarray[0] * 0.2071717;
netsum += inarray[1] * -0.2146507;
netsum += inarray[2] * -8.789687E-02;
netsum += inarray[3] * -3.491069E-02;
feature2[4] = exp(-netsum * netsum);
 
netsum = -1.382797E-02;
netsum += inarray[0] * 0.1246694;
netsum += inarray[1] * -0.2011396;
netsum += inarray[2] * 1.725667E-02;
netsum += inarray[3] * -8.986322E-02;
feature2[5] = exp(-netsum * netsum);
 
netsum = -7.906423E-02;
netsum += inarray[0] * 1.242629E-02;
netsum += inarray[1] * 0.29257;
netsum += inarray[2] * 5.532621E-02;
netsum += inarray[3] * -0.2749403;
feature2[6] = exp(-netsum * netsum);
 
netsum = 0.2879203;
netsum += inarray[0] * 0.189353;
netsum += inarray[1] * -4.599527E-02;
netsum += inarray[2] * -0.3233119;
netsum += inarray[3] * 0.1965496;
feature3[0] = tanh(netsum);
 
netsum = 2.006373E-02;
netsum += inarray[0] * 0.2072955;
netsum += inarray[1] * 0.1955415;
netsum += inarray[2] * 0.2627103;
netsum += inarray[3] * -1.833003E-02;
feature3[1] = tanh(netsum);
 
netsum = -0.2168624;
netsum += inarray[0] * 0.2976118;
netsum += inarray[1] * -0.2851484;
netsum += inarray[2] * -0.1389391;
netsum += inarray[3] * -0.1753528;
feature3[2] = tanh(netsum);
 
netsum = -4.251536E-02;
netsum += inarray[0] * 0.292901;
netsum += inarray[1] * -0.1031563;
netsum += inarray[2] * -0.1195951;
netsum += inarray[3] * 0.1207087;
feature3[3] = tanh(netsum);
 
netsum = -0.1719727;
netsum += inarray[0] * 6.019998E-02;
netsum += inarray[1] * -0.2743589;
netsum += inarray[2] * 6.857034E-02;
netsum += inarray[3] * -4.178341E-02;
feature3[4] = tanh(netsum);
 
netsum = 0.2233482;
netsum += inarray[0] * -0.0652561;
netsum += inarray[1] * 0.1022277;
netsum += inarray[2] * 0.1196216;
netsum += inarray[3] * -2.823213E-02;
feature3[5] = tanh(netsum);
 
netsum = -0.1742411;
netsum += inarray[0] * -0.1370615;
netsum += inarray[1] * -0.2542539;
netsum += inarray[2] * 0.1967436;
netsum += inarray[3] * 0.2812807;
feature3[6] = tanh(netsum);
 
netsum = -0.204869;
netsum += inarray[0] * -0.133566;
netsum += inarray[1] * -0.2862521;
netsum += inarray[2] * -0.318849;
netsum += inarray[3] * -0.2710454;
feature4[0] = 1 - exp(-netsum * netsum);
 
netsum = -0.1635372;
netsum += inarray[0] * -0.2003987;
netsum += inarray[1] * 0.2688678;
netsum += inarray[2] * 0.2757982;
netsum += inarray[3] * -0.1931585;
feature4[1] = 1 - exp(-netsum * netsum);
 
netsum = -3.867657E-02;
netsum += inarray[0] * 8.968055E-02;
netsum += inarray[1] * -0.2223219;
netsum += inarray[2] * 9.906644E-02;
netsum += inarray[3] * 0.1770547;
feature4[2] = 1 - exp(-netsum * netsum);
 
netsum = 0.1528167;
netsum += inarray[0] * -1.067778E-02;
netsum += inarray[1] * 0.2354377;
netsum += inarray[2] * -0.2014543;
netsum += inarray[3] * -1.884078E-02;
feature4[3] = 1 - exp(-netsum * netsum);
 
netsum = 2.655918E-02;
netsum += inarray[0] * -0.2591889;
netsum += inarray[1] * 0.1168908;
netsum += inarray[2] * 0.2284805;
netsum += inarray[3] * -0.1992159;
feature4[4] = 1 - exp(-netsum * netsum);
 
netsum = 0.2966768;
netsum += inarray[0] * 0.121243;
netsum += inarray[1] * -0.114669;
netsum += inarray[2] * 0.193731;
netsum += inarray[3] * 5.757192E-03;
feature4[5] = 1 - exp(-netsum * netsum);
 
netsum = 0.1632974;
netsum += inarray[0] * 2.642303E-02;
netsum += inarray[1] * -2.55042E-03;
netsum += inarray[2] * 6.799737E-02;
netsum += inarray[3] * 0.1879126;
feature4[6] = 1 - exp(-netsum * netsum);
 
netsum = -6.048463E-02;
netsum += feature2[0] * 5.469751E-02;
netsum += feature2[1] * 8.835526E-02;
netsum += feature2[2] * 1.60323E-03;
netsum += feature2[3] * -0.1855921;
netsum += feature2[4] * 0.1008915;
netsum += feature2[5] * 1.587034E-02;
netsum += feature2[6] * 0.1592594;
netsum += 2.156724E-02;
netsum += feature3[0] * -0.3081859;
netsum += feature3[1] * 3.557891E-02;
netsum += feature3[2] * 2.385841E-02;
netsum += feature3[3] * 0.0917619;
netsum += feature3[4] * 0.1527044;
netsum += feature3[5] * 1.573258E-02;
netsum += feature3[6] * -1.742252E-02;
netsum += -0.1817411;
netsum += feature4[0] * -0.311413;
netsum += feature4[1] * 1.100017E-02;
netsum += feature4[2] * 9.607796E-02;
netsum += feature4[3] * 0.1235664;
netsum += feature4[4] * 0.1278843;
netsum += feature4[5] * -4.006739E-03;
netsum += feature4[6] * -0.2482496;
outarray[0] = 1 / (1 + exp(-netsum));
 
 
outarray[0] = 0.0607 *  (outarray[0] - .1) / .8  + -0.0284;
if (outarray[0]<-0.0284) outarray[0] = -0.0284;
if (outarray[0]>0.0323) outarray[0] = 0.0323;
 
               
}
 
Mislaid:
Я несколько лет назад занимался сетями, исключительно средствами MQL. Какие выводы я сделал. При обучении сети мы имеем два крайних варианта, все остальные промежуточные. Крайние варианты: размер обучающей выборки сопоставим с числом нейронов (отличается не более, чем на порядок); второй - размер обучающей выборки на много порядков превосходит число нейронов. В первом случае на графике мы видим хаотичный набор весов нейронов, типичный упаковщик, который запоминает предъявленную последовательность.  Даем на вход другую последовательность, чаще всего, ничего общего. Второй вариант показывает на графике кривую, соответствующую какой-то скользящей средней. То есть, пытается поймать тенденцию. Результаты далекие, но, лучшие, чем в первом варианте. В результате я пришел к выводу, что сети второго типа более правильны и веса нейронов должны быть нестационарными. То есть, сеть непрерывно должна подстраиваться под ситуацию.

   Соглашусь с Вашими  рассуждениями .

   Но в  моем случае просто  хочу прогнать несколько вариантов сетей на готовом советнике . Все из-за того , что в самом нейрошеле  рисуются  многообещающие  картинки .



  

 
 Неужели компилятор скушает ??? :
-1.742252E-02;
Причина обращения: