신경망에 대한 고문, 경험 공유. - 페이지 6

 

흥미로운 주제. 아이디어가 있지만 더 간단합니다. 질문하면서 :)

진입점을 결정하는 방법은 분명합니다. 지그재그로 이동하지만 진입점을 예측하려면 해당 지점 이전에 무엇이 있었는지 알아야 합니다. 이전 데이터를 분석하는 데 사용되는 막대의 창은 무엇입니까?

입력 기능과 출력 기능을 분리해 보셨나요? 아니면 일반적으로 쿠데타가 사용됩니까? 반대 신호의 도착? 쿠데타가 아닌 다른 방식의 손익 고정 방식을 사용하면 결과가 어떻게 될까요?

 
어제 데모에서 뉴런을 시작했습니다. https://www.mql5.com/ru/signals/129790 아직 아무것도 없는 것 같습니다.
 
-Aleks- :

흥미로운 주제. 아이디어가 있지만 더 간단합니다. 질문하면서 :)

진입점을 결정하는 방법은 분명합니다. 지그재그로 이동하지만 진입점을 예측하려면 해당 지점 이전에 무엇이 있었는지 알아야 합니다. 이전 데이터를 분석하는 데 사용되는 막대의 창은 무엇입니까?

입력 기능과 출력 기능을 분리해 보셨나요? 아니면 쿠데타가 일반적으로 사용됩니까? 반대 신호를 수신합니까? 쿠데타가 아닌 다른 방식의 손익 고정 방식을 사용하면 결과가 어떻게 될까요?

1바 앞으로, 즉 1바 뒤로 시프트하여 예측하려고 했습니다. 그런데 문제는 마지막 막대의 지그재그가 자체적으로 값을 채워야 하고 다시 그려지므로 모든 것이 명확하지 않다는 것입니다. 제대로 하는 방법을 알려주세요.
 
Anton Govorukhin :
어제 데모에서 뉴런을 시작했습니다. https://www.mql5.com/ru/signals/129790 아직 아무것도 없는 것 같습니다.
좋습니다. 관찰해 봅시다. 하지만 그 근거는 무엇입니까?
 
막심 드미트리예프스키 :
좋습니다. 관찰해 봅시다. 하지만 그 근거는 무엇입니까?
거래량, 미결제약정, 시장의 힘의 균형.
 

지금까지 흥미로운 일은 없었습니다. 코드와 논리에 오류가 있을 수 있습니다. 나는 단지 주제를 발전시키기 위해 글을 씁니다. 말하자면 누군가가 스스로 그것을 리메이크하거나 내 실수를 수정 할 것입니다.

코드의 요점을 주석 처리했습니다. 예측 막대 - 예측의 깊이, 앞으로 예상되는 막대의 수. 다음으로, 그리드 훈련을 위한 배열의 길이와 훈련 에포크의 수입니다. 30개의 뉴런은 코드에서 변경할 수 있습니다.

 //+------------------------------------------------------------------+
//|                                                      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);
        }
 
여러분, 고문이 기초를 고려하지 않으면 손익 확률 = 50/50 - 퍼짐! 그리고 어드바이저의 어떤 뉴런도 자신이나 다른 사람을 돕지 않습니다. :)
 
Rustam Karpunin :
여러분, 고문이 기초를 고려하지 않으면 손익 확률 = 50/50 - 퍼짐! 그리고 어드바이저의 어떤 뉴런도 자신이나 다른 사람을 돕지 않습니다. :)
누가 그걸 말했어?
 
Rustam Karpunin :
여러분, 고문이 기초를 고려하지 않으면 손익 확률 = 50/50 - 퍼짐! 그리고 어드바이저의 어떤 뉴런도 자신이나 다른 사람을 돕지 않습니다. :)
NS는 매우 훌륭합니다. 저는 그들과 함께 작업하는 몇 가지 기능을 사용하기 시작했고 흥미로운 결과가 이미 나타나고 있습니다. 나중에 게시하겠습니다. 전략을 세우는 데만도 많은 시간이 걸립니다.
 
뭐라고요
신경망에 대한 고문?