Sinir ağları konusunda danışmanlar, deneyim paylaşımı. - sayfa 6

 

İlginç konu. Bir fikrim var ama daha basit. Soru sorarken :)

Giriş noktasının nasıl belirleneceği açıktır - bir zikzak alıyoruz, ancak girişi tahmin etmek için noktadan önce ne olduğunu bulmanız gerekiyor. Önceki verileri analiz etmek için çubuklardaki hangi pencere kullanılır?

Giriş ve çıkış fonksiyonlarını ayırmayı denediniz mi? Yoksa genellikle bir darbe mi kullanılır - karşı sinyalin alınması mı? Darbeye girmek yerine farklı kâr/zarar tespit yöntemlerini kullanırsanız sonuç ne olur?

 
Dün demoda bir nöron başlattım https://www.mql5.com/ru/signals/129790 Henüz bir şey yok gibi görünüyor.
 
-Aleks- :

İlginç konu. Bir fikrim var ama daha basit. Soru sorarken :)

Giriş noktasının nasıl belirleneceği açıktır - bir zikzak alıyoruz, ancak girişi tahmin etmek için noktadan önce ne olduğunu bulmanız gerekiyor. Önceki verileri analiz etmek için çubuklardaki hangi pencere kullanılır?

Giriş ve çıkış fonksiyonlarını ayırmayı denediniz mi? Yoksa genellikle bir darbe mi kullanılır - karşı sinyalin alınması mı? Darbeye girmek yerine farklı kâr/zarar tespit yöntemlerini kullanırsanız sonuç ne olur?

1 bar ileriyi, yani 1 bar geri kaymayı tahmin etmeye çalıştım. Ama sorun şu ki, son çubuklardaki zikzak kendi başına değerlerle doldurulmalı ve yeniden çiziliyor, bu yüzden her şey o kadar net değil, bana bunu yapmanın en iyi yolunu söyle..
 
Anton Govorukhin :
Dün demoda bir nöron başlattım https://www.mql5.com/ru/signals/129790 Henüz bir şey yok gibi görünüyor.
Harika, gözlemleyelim .. ama temeli nedir?
 
Maksim Dmitrievski :
Harika, gözlemleyelim .. ama bunun temeli nedir?
Hacimler, açık faiz, piyasadaki güç dengesi.
 

Şimdiye kadar, ilginç bir şey olmadı. Kodda ve mantıkta hatalar olabilir. Sırf konuyu geliştirmek için yazıyorum, tabiri caizse birileri yeniden yapacak ya da hatalarımı düzeltecek.

Koddaki ana noktaları yorumladım. Tahmin çubukları - tahminin derinliği, ileriye baktığımız çubuk sayısı. Ardından, ızgarayı eğitmek için dizinin uzunluğu ve eğitim dönemlerinin sayısı. 30 nöron, kodda değiştirilebilir.

 //+------------------------------------------------------------------+
//|                                                      zzNeuro.mq5 |
//|                                                 max dmitrievsky  |
//|                        https://www.mql5.com/ru/users/dmitrievsky |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#include <Trade\Trade.mqh>        
#include <Trade\PositionInfo.mqh> 
#include <Trade\AccountInfo.mqh>
#include "class_mlp.mqh"
CTrade            m_Trade;
CPositionInfo     m_Position;
CNetMLP *net;

input double MaximumRisk= 0.01 ;
input int ZZperiod = 300 ;
input int PrognozBars = 30 ;

input int vectorLength = 1000 ;
input int epoch = 10000 ;

int     zz_handle, RSI_handle, MA1_handle, MA2_handle; //хендлы индикаторов
double a1[],a2[],a3[],a4[],a5[],ma1[],ma2[],MAbuff[],zzH[],zzL[]; //массивы индикаторов
double inputs[], outputs[]; //массивы для нейросети
bool    learn;
double in[ 6 ],out[ 1 ]; //количество входов и выходов нейросети
int     snn[]={ 70 , 1 }; // параметры нейросети

double min,max, minMA, maxMA; //переменные для нормировки данных входящих векторов

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- инициализируем хендлы индикаторов
   learn= false ;
   zz_handle= iCustom ( Symbol (), 0 , "zz" ,ZZperiod);
   RSI_handle= iRSI ( Symbol (), 0 , 14 , PRICE_CLOSE );
   MA1_handle= iMA ( Symbol (), 0 , 200 , 0 , MODE_SMA , PRICE_CLOSE );
   MA2_handle= iMA ( Symbol (), 0 , 20 , 0 , MODE_SMA , PRICE_CLOSE );
   
//---
   return ( INIT_SUCCEEDED );
  }
  
void FillZZarray( double &a[]) //заполняем массив выходов для нейросети с индикатора зигзаг. Присваиваем значения зигзага каждому бару.
{                             //1 растущий, -1 падающий.
   ArrayResize (a,vectorLength); 
    
   int lastcountbar = 0 ;
   for ( int i= 0 ;i<vectorLength;i++)
     {
       if (zzH[i]> 0 )  
       {
        a[i]= 1 ; lastcountbar = 1 ;
       }    
       if (zzL[i]> 0 ) 
       {
        a[i]=- 1 ; lastcountbar = - 1 ;  
       } 
       if (zzH[i]== 0 && zzL[i]== 0 ) a[i] = lastcountbar;
     }
}
 
void NormalizeArrays( double &a[]) //нормируем входные данные для рси
  {
   double d1=- 1.0 ;
   double d2= 1.0 ;

   double x_min=a[ ArrayMinimum (a)];
   double x_max=a[ ArrayMaximum (a)];
   min = x_min;
   max=x_max;

   for ( int i= 0 ;i< ArraySize (a);i++)
     {
      a[i]=(((a[i]-x_min)*(d2-d1))/(x_max-x_min))+d1;
     }
  }
  
void NormalizeArraysMA( double &a[]) //нормируем входные данные для МА
  {
   double d1=- 1.0 ;
   double d2= 1.0 ;

   double x_min=a[ ArrayMinimum (a)];
   double x_max=a[ ArrayMaximum (a)];
   minMA = x_min;
   maxMA=x_max;

   for ( int i= 0 ;i< ArraySize (a);i++)
     {
      a[i]=(((a[i]-x_min)*(d2-d1))/(x_max-x_min))+d1;
     }
  }
  
void NormalizeArrays2( double &a[]) //нормируем для рси на каждом новом баре
  {
   double d1=- 1.0 ;
   double d2= 1.0 ;

   for ( int i= 0 ;i< ArraySize (a);i++)
     {
      a[i]=(((a[i]-min)*(d2-d1))/(max-min))+d1;
     }
  }
  
void NormalizeArrays2MA( double &a[]) //нормируем для МА на каждом новом баре
  {
   double d1=- 1.0 ;
   double d2= 1.0 ;

   for ( int i= 0 ;i< ArraySize (a);i++)
     {
      a[i]=(((a[i]-minMA)*(d2-d1))/(maxMA-minMA))+d1;
     }
  }
   
void learnWeb()
  {
   CopyBuffer (zz_handle, 0 ,PrognozBars,vectorLength,zzH);
   CopyBuffer (zz_handle, 1 ,PrognozBars,vectorLength,zzL);
   FillZZarray(outputs); //заполняем массив выходов, предварительно скопировав хай и лоу зигзага.
   
   CopyBuffer (RSI_handle, 0 ,PrognozBars* 2 + 1 ,vectorLength,a1);
   CopyBuffer (RSI_handle, 0 ,PrognozBars* 2 + 5 ,vectorLength,a2);
   CopyBuffer (RSI_handle, 0 ,PrognozBars* 2 + 10 ,vectorLength,a3);
   CopyBuffer (RSI_handle, 0 ,PrognozBars* 2 + 15 ,vectorLength,a4);
   CopyBuffer (RSI_handle, 0 ,PrognozBars* 2 + 20 ,vectorLength,a5);
   CopyBuffer (MA1_handle, 0 ,PrognozBars* 2 + 1 ,vectorLength,ma1);
   CopyBuffer (MA2_handle, 0 ,PrognozBars* 2 + 1 ,vectorLength,ma2);
   
   ArrayResize (MAbuff,vectorLength);
   for ( int i= 0 ;i< ArraySize (ma1);i++) //вычисляем разницу между двумя МА
     {
      MAbuff[i]=ma1[i]-ma2[i];
     }
    NormalizeArrays(a1);
     NormalizeArrays(a2);
      NormalizeArrays(a3);
       NormalizeArrays(a4);
        NormalizeArrays(a5);
         NormalizeArraysMA(MAbuff); //нормируем все входы
   
   int j = 0 ;
   for ( int i= 0 ;i<vectorLength* 6 ;i=i+ 6 ) //компануем массив входов для нейросети
     {
       ArrayCopy (inputs,MAbuff,i,j, 1 );
       ArrayCopy (inputs,a5,i+ 1 ,j, 1 );
       ArrayCopy (inputs,a4,i+ 2 ,j, 1 );
       ArrayCopy (inputs,a3,i+ 3 ,j, 1 );
       ArrayCopy (inputs,a2,i+ 4 ,j, 1 );
       ArrayCopy (inputs,a1,i+ 5 ,j, 1 );      
       j++;
     }      
   ArraySetAsSeries (inputs, true );
   ArraySetAsSeries (outputs, true );
   
   //+------------------------------------------------------------------+
   //| Neuro Learn                                                      |
   //+------------------------------------------------------------------+     
   net= new CNetMLP( ArraySize (snn),snn, ArraySize (in), 1 );
   net.Learn(vectorLength,inputs,outputs,epoch, 1.0 e- 8 ); Print ( "MSE=" ,net.mse, "  Epoch=" ,net.epoch);
   //--- сохранение сети в файл и удаление сети
   int h= FileOpen ( "test.net" , FILE_BIN | FILE_WRITE );
   net.Save(h);
   FileClose (h);
   
   learn= true ;
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   delete net;
   FileDelete ( "test.net" );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   
   if (learn== false ) learnWeb();
//---
   
   if (fn_NEW_BAR()) //запускаем сеть на каждом новом баре, получаем выходы. Торгуем.
   {  
       ArrayResize (a1, 1 );
       ArrayResize (a2, 1 );
       ArrayResize (a3, 1 );
       ArrayResize (a4, 1 );
       ArrayResize (a5, 1 );
       ArrayResize (ma1, 1 );
       ArrayResize (ma2, 1 );
       ArrayResize (MAbuff, 1 );
      
       CopyBuffer (RSI_handle, 0 , 1 , 1 ,a1);
       CopyBuffer (RSI_handle, 0 , 5 , 1 ,a2);
       CopyBuffer (RSI_handle, 0 , 10 , 1 ,a3);
       CopyBuffer (RSI_handle, 0 , 15 , 1 ,a4);
       CopyBuffer (RSI_handle, 0 , 20 , 1 ,a5);
       CopyBuffer (MA1_handle, 0 , 1 , 1 ,ma1);
       CopyBuffer (MA2_handle, 0 , 1 , 1 ,ma2);
      
       for ( int i= 0 ;i< ArraySize (ma1);i++)
      {
       MAbuff[i]=ma1[i]-ma2[i];
      }
       
      NormalizeArrays2(a1);
       NormalizeArrays2(a2);
        NormalizeArrays2(a3);
         NormalizeArrays2(a4);
          NormalizeArrays2(a5);
           NormalizeArrays2MA(MAbuff);
           
      in[ 0 ] = MAbuff[ 0 ];
      in[ 1 ] = a5[ 0 ];
      in[ 2 ] = a4[ 0 ];
      in[ 3 ] = a3[ 0 ];
      in[ 4 ] = a2[ 0 ];
      in[ 5 ] = a1[ 0 ];
      
          
      net.Calculate(in,out); //подаем на вход данные индикаторов на текущем баре, получаем результат на выходе.
     
//+------------------------------------------------------------------+
//| Expert trade function                                            |
//+------------------------------------------------------------------+         
   if (out[ 0 ]> 0.9 ) //если на выходе больше этого значения, то покупаем
     {
       double Lot=LotsOptimized();
       double priceBuy= SymbolInfoDouble ( Symbol (), SYMBOL_ASK );
       if (m_Position.Select( Symbol ()))
        {
         if (m_Position.PositionType()== POSITION_TYPE_SELL ) m_Trade.PositionClose( Symbol ());
        }
       if (CountPosBuy()== 0 ) m_Trade.PositionOpen( Symbol (), ORDER_TYPE_BUY ,Lot,priceBuy, 0 , 0 , NULL );
     }
       
   if (out[ 0 ]<- 0.9 ) //если ниже, то продаем
     {
       double Lot=LotsOptimized();
       double priceSell= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
       if (m_Position.Select( Symbol ()))
        {
         if (m_Position.PositionType()== POSITION_TYPE_BUY ) m_Trade.PositionClose( Symbol ());
        }
       if (CountPosSell()== 0 ) m_Trade.PositionOpen( Symbol (), ORDER_TYPE_SELL ,Lot,priceSell, 0 , 0 , NULL );
     }
   } 
  }
//+------------------------------------------------------------------+
//| Custom Functions                                                 |
//+------------------------------------------------------------------+
bool fn_NEW_BAR()
  {
   static int nBars= 0 ;
   if (nBars!= Bars ( Symbol (), 0 ))
     {
      nBars= Bars ( Symbol (), 0 );
       return ( true );
     }
   return ( false );
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+  
double LotsOptimized()
  {
   CAccountInfo myaccount;
   double lot;
//---- select lot size
   lot= NormalizeDouble (myaccount.FreeMargin()*MaximumRisk/ 1000.0 , 1 );
//---- return lot size
   if (lot< 0.01 ) lot= 0.01 ;
   if (lot> 50 ) lot= 50 ;
   return (lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountPosBuy()
  {
   CPositionInfo myposition;
   int result= 0 ;
   for ( int k= 0 ; k< PositionsTotal (); k++)
     {
       if (myposition.Select( _Symbol )== true )
        {
         if (myposition.PositionType()== POSITION_TYPE_BUY )
           {result++;}
         else
           {}
           }
        }
       return (result);
     }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   int CountPosSell()
     {
      CPositionInfo myposition;
       int result= 0 ;
       for ( int k= 0 ; k< PositionsTotal (); k++)
        {
         if (myposition.Select( _Symbol )== true )
           {
             if (myposition.PositionType()== POSITION_TYPE_SELL )
              {result++;}
             else
              {}
              }
           }
         return (result);
        }
 
Beyler, eğer danışmanlarınız temeli dikkate almıyorsa, o zaman kar / zarar olasılığı = 50/50 - yayılma! Ve danışmandaki hiçbir nöron ne kendilerine ne de başkalarına yardım etmeyecek :)
 
Rustam Karpunin :
Beyler, eğer danışmanlarınız temeli dikkate almıyorsa, o zaman kar / zarar olasılığı = 50/50 - yayılma! Ve danışmandaki hiçbir nöron ne kendilerine ne de başkalarına yardım etmeyecek :)
Kim söyledi?
 
Rustam Karpunin :
Beyler, eğer danışmanlarınız temeli dikkate almıyorsa, o zaman kar / zarar olasılığı = 50/50 - yayılma! Ve danışmandaki hiçbir nöron ne kendilerine ne de başkalarına yardım etmeyecek :)
NS çok havalı, onlarla çalışmanın bazı özelliklerini almaya başladım, ilginç sonuçlar şimdiden ortaya çıkıyor, onları daha sonra yayınlayacağım. Sadece bir strateji bulmak çok zaman alıyor.
 
ne
Sinir ağları konusunda danışmanlar mı?
Neden: