Consulenti sulle reti neurali, condividendo le esperienze. - pagina 6

 

È un argomento interessante. Ho un'idea, ma una più semplice. Farò domande per ora :)

È chiaro come determinare il punto di entrata - prendiamo uno zig-zag, ma abbiamo bisogno di sapere cosa c'era prima del punto per prevedere l'entrata. Quale finestra delle barre viene usata per analizzare i dati precedenti?

Avete provato a separare le funzioni di ingresso e di uscita? O di solito si usa l'inversione, cioè l'arrivo del segnale opposto? Quale sarebbe il risultato se si utilizzassero diversi modi di fissare i profitti e le perdite invece di un'uscita a un flip?

 
Iniziato il neuroner sulla demo ieri https://www.mql5.com/ru/signals/129790 Sembra essere OK finora.
 
-Aleks-:

È un argomento interessante. Ho un'idea, ma una più semplice. Farò domande per ora :)

È chiaro come determinare il punto di entrata - prendiamo uno zig-zag, ma abbiamo bisogno di sapere cosa c'era prima del punto per prevedere l'entrata. Quale finestra delle barre viene usata per analizzare i dati precedenti?

Avete provato a separare le funzioni di ingresso e di uscita? O di solito si usa l'inversione, cioè l'arrivo del segnale opposto? Quale sarebbe il risultato se si utilizzassero diversi modi di fissare i profitti e le perdite invece di un'uscita a un flip?

Ho provato la previsione di 1 barra in avanti, cioè uno spostamento di 1 barra indietro. Ma il problema è che lo zigzag delle ultime barre deve essere riempito di valori ed è in eccesso, quindi non è tutto così chiaro... Sto ancora usando segnali di inversione per aprire/riaprire, o sto fregando martin... Ma il campo di ricerca è molto vasto, è difficile dire come farlo bene...
 
Anton Govorukhin:
Avviato il neurone nella demo ieri https://www.mql5.com/ru/signals/129790 Sembra essere ok finora.
Bene, vediamo... su cosa si basa?
 
Maxim Dmitrievsky:
Прикольно, понаблюдаемс.. а что в основу заложено?
Объемы, открытый интерес, баланс сил на рынке.
 

Finora non viene fuori niente di interessante. Ci possono essere errori nel codice e nella logica. Sto scrivendo solo per sviluppare l'argomento, per così dire, forse qualcuno lo cambierà per sé o correggerà i miei errori.

Ho corretto i momenti principali nel codice. Prognosis bars - profondità di previsione, quante barre da guardare in avanti. Poi la lunghezza della matrice per la formazione della griglia e il numero di epoche di formazione. 30 neuroni, si può cambiare nel codice.

//+------------------------------------------------------------------+
//|                                                      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);
        }
 
Signori, se i vostri Expert Advisor non tengono conto della base, allora la probabilità di profitto/perdita = 50/50 - spread! E nessun neurone nell'Expert Advisor aiuterà, né il proprio né quello di nessun altro:)
 
Rustam Karpunin:
Signori, se i vostri Expert Advisor non tengono conto della base, allora la probabilità di profitto/perdita = 50/50 - lo spread! E nessun neurone nell'Expert Advisor aiuterà, né il proprio né quello di nessun altro:)
Chi lo dice?
 
Rustam Karpunin:
Signori, se i vostri Expert Advisor non imparano i fondamentali, la probabilità di profitto/perdita = 50/50 - spread! E nessun neurone nell'Expert Advisor aiuterà, né il proprio né quello di nessun altro:)
Questo è molto bello, ho iniziato a comprare alcune funzionalità di lavoro con loro, ho già ottenuto risultati interessanti, li posterò più tardi. Ho solo bisogno di spendere molto tempo per pensare ad una strategia.
 
che cos'è
Consulenti di reti neurali?
Motivazione: