Redes neurais, como dominá-las, por onde começar? - página 5

 
meta-trader2007 >> :

Refiro-me a um simples perseptron linear, como o utilizado pela Reshetov. Rosenblatt criou seu perseptron como modelo de função cerebral), um modelo muito primitivo...

O simples perseptron linear usado pelo Sr. Reshetov está mais de 40 anos desactualizado.

A verdadeira história das redes neurais começou com o Rosenblatt perseptron com sua função de ativação.

 
TheXpert >> :

O simples perseptron linear usado pelo Sr. Reshetov está mais de 40 anos desactualizado.

A verdadeira história das redes neurais começou com o Rosenblatt perseptron com sua função de ativação.

Mas sua persepensão também não é perfeita. E não é bom para prever a direção do curso.

Então, nas duas camadas de Rosenblatt perseptrons (ele os criou primeiro), a primeira camada oculta desempenhou o papel de uma função de ativação?

 
meta-trader2007 >> :

Mas sua persepensão também não é perfeita. E não é adequado para prever a direção do curso.

Isto é, nas duas camadas de Rosenblatt perseptrons (ele os criou primeiro), a primeira camada oculta desempenhou o papel de uma função de ativação?

Estou acompanhando o tema, mas você está falando de assuntos superiores. Devemos ao menos entender como fazer algo simples...


Aqui está um algoritmo de um simples Expert Advisor:

Tomemos por exemplo um algoritmo simples que dá pontos de entrada com stop losses e lucros com base no último fractal:

Se tivermos um fractal para cima, colocamos uma ordem de Buy Stop para um avanço fractal, com um stop loss abaixo do preço mínimo entre as barras de zero até a barra em que o fractal foi formado. A tomada de lucro é igual ao stop loss.


Aqui está o código deste Expert Advisor:

extern double    Lot=0.1;
extern int       Slippage=3; // Проскальзывание
extern int       Magic=1;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
 int i;
 
// Фрактал вверх 
 int iUpFr;   // Номер бара на котором образовался последний фрактал вверх
 double UpFr; // Значение последнего фрактала вверх 

for ( i=3; i<Bars; i++){
UpFr=iFractals(NULL,0,MODE_UPPER, i);
  if ( UpFr>0){
  iUpFr= i;
  //Print ("UpFr = ", UpFr, ", ", " iUpFr = ", iUpFr);
  break;
  }
}   
// Проверяем прорван-ли найденый фрактал, если он прорван, то по нему не имеет смысла выставлять ордер
bool OkUpFr; // Если false, то прорван, если true, то не прорван
if( UpFr>=High[iHighest(NULL,0,MODE_HIGH, iUpFr,0)]){ OkUpFr=true;}

double SellSl=High[iHighest(NULL,0,MODE_HIGH, iUpFr+1,0)]; // Минимальное значение цены от нулевого бара до номера на котором сформировался последний фрактал вверх


// Фрактал вниз
 int iDnFr;   // Номер бара на котором образовался последний фрактал вниз
 double DnFr; // Значение последнего фрактала вниз
 
for ( i=3; i<Bars; i++){
DnFr=iFractals(NULL,0,MODE_LOWER, i);
  if ( DnFr>0){
  iDnFr= i;
  //Print ("DnFr = ", DnFr, ", ", " iDnFr = ", iDnFr);
  break;
  }
} 
// Проверяем прорван-ли найденый фрактал, если он прорван, то по нему не имеет смысла выставлять ордер
bool OkDnFr; // Если false, то прорван, если true, то не прорван
if( DnFr<=Low[iLowest(NULL,0,MODE_LOW, iDnFr,0)]){ OkDnFr=true;}

double BuySl=Low[iLowest(NULL,0,MODE_LOW, iDnFr+1,0)]; // Максимальное значение цены от нулевого бара до номера на котором сформировался последний фрактал вниз
 
 // Параметры ордеров
  double Tick=MarketInfo(Symbol(),MODE_TICKSIZE);
  double spread=MarketInfo(Symbol(),MODE_SPREAD)* Tick;

  double B;
  double Bsl;
  double S;
  double Ssl;    
  double Btp; 
  double Stp; 
  B=NormalizeDouble( UpFr+1* Tick+ spread,Digits);      // Цена для покупки
  Bsl=NormalizeDouble( BuySl-1* Tick,Digits);          // Стоп лосс для ордера на покупку
  Btp=NormalizeDouble( B+( B- Bsl),Digits);             // Тейк профит для ордера на покупку
  S=NormalizeDouble( DnFr-1* Tick,Digits);             // Цена для продажи
  Ssl=NormalizeDouble( SellSl+ spread+1* Tick,Digits);  // Стоп лосс для ордера на продажу
  Stp=NormalizeDouble( S-( Ssl- S),Digits);             // Тейк профит для ордера на продажу
  
bool Buy; // если Buy==true, значит появились условия для Buy stop
bool Sell;// если Sell==true, значит появились условия для Sell stop

if( OkUpFr==true){ Buy=true;}
if( OkDnFr==true){ Sell=true;}
 
// Проверка открытых ордеров и выставленых ордеров
int total = OrdersTotal(); // Общее кол-во открытых и отложеных ордеров.
int Ticket = OrderTicket( ); // Возвращает номер тикета для текущего выбранного ордера. 
bool PendingOrderBuy=false;  
bool PendingOrderSell=false;   
bool MarketOrderBuy=false;
bool MarketOrderSell=false;
if( total>0){  
  for( i=0; i<= total; i++){
     if (OrderSelect( i, SELECT_BY_POS)==true){
        if (OrderSymbol()==Symbol() && OrderMagicNumber()== Magic){
         double OpenPrice=NormalizeDouble(OrderOpenPrice(),Digits);
         double StopLoss=NormalizeDouble(OrderStopLoss(),Digits);
         double TakeProfit=NormalizeDouble(OrderTakeProfit(),Digits);
         Ticket = OrderTicket( );
           if (OrderType( )==OP_BUY){
           MarketOrderBuy = true;
           }
           if (OrderType( )==OP_SELL){
           MarketOrderSell = true;
           }
           if (OrderType( )==OP_BUYSTOP){
           PendingOrderBuy = true;
           if( OpenPrice!= B) {OrderDelete( Ticket,CLR_NONE);} 
           if( StopLoss!= Bsl){OrderDelete( Ticket,CLR_NONE);}       
           }
           if (OrderType( )==OP_SELLSTOP){
           PendingOrderSell = true;
           if( OpenPrice!= S) {OrderDelete( Ticket,CLR_NONE);} 
           if( StopLoss!= Ssl){OrderDelete( Ticket,CLR_NONE);}    
           }  
        }
     }
  }
} 
// Выставление отложеных ордеров
if( Buy==true && PendingOrderBuy==false && MarketOrderBuy==false){
         Ticket=OrderSend (Symbol(),OP_BUYSTOP, Lot, B, Slippage, Bsl, Btp,NULL, Magic,0,CLR_NONE);
         if( Ticket<0)
         {
         Print("OrderSend failed with error #",GetLastError());
         return(0);
         }
}
if( Sell==true && PendingOrderSell==false && MarketOrderSell==false){
         Ticket=OrderSend (Symbol(),OP_SELLSTOP, Lot, S, Slippage, Ssl, Stp,NULL, Magic,0,CLR_NONE);
         if( Ticket<0)
         {
         Print("OrderSend failed with error #",GetLastError());
         return(0);
         }
}     
//----
   return(0);
  }

Neste algoritmo, você pode selecionar vários pontos de ancoragem, com base nos quais o modelo fractal será medido:


Parâmetros, que podem ser usados como pesos:

Para comprar:
iUpFr
iUpFr-iSellSl
UpFr-SellSl
(UpFr-SellSl)/(iUpFr-iSellSl)
(UpFr-SellSl)/(iUpFr)

Para vender:
iDnFr
iDnFr-iBuySl
BuySl-DnFr
(BuySl-DnFr)/(iDnFr-iBuySl)
(BuySl-DnFr)/(iDnFr)


Entendo corretamente que o próximo passo da criação da rede neural será a introdução de variáveis que serão comparadas a essas propriedades?

E a comparação ocorrerá durante a otimização?

Se eu estiver errado, que outras medidas práticas eu preciso tomar para fechar esta EA, uma simples rede neural?



 

A matemática das redes neurais não é tão complicada assim. A escolha dos parâmetros de entrada é muito mais importante para o sucesso da previsão da rede. A questão aqui é: quais indicadores e seus parâmetros descrevem completamente o estado atual do mercado e sua história? Conhecer apenas alguns preços passados de uma moeda está longe de ser suficiente para prever o preço futuro, não importa quantas camadas estejam na rede. É por isso que você tem que escolher ou muitos preços passados ou indicadores de períodos diferentes. A grande maioria utiliza indicadores, pois permitem uma maneira mais eficiente de descrever a posição do último preço em relação aos preços do passado. Talvez devêssemos mudar a discussão para a seleção dos parâmetros de entrada. Penso que a correlação dos valores recentes dos muves de diferentes períodos pode ser um bom input para a rede. Quem tem uma opinião diferente? É possível misturar diferentes tipos de indicadores, por exemplo, MACD, RSI, AC, Stoch etc., na entrada da mesma rede?

 
gpwr >> :

Podem ser misturados diferentes tipos de indicadores, por exemplo, MACD, RSI, AC, Stoch, etc., na entrada da mesma rede?

Acho que você pode, desde que o conjunto de indicadores dê boas entradas no mercado. Depois disso, temos outra pergunta difícil - o que devemos fornecer à produção líquida durante o treinamento? O que nós queremos? Para reconhecer um padrão? Prever a cor da próxima vela? Ou talvez não um, mas vários? Ou talvez queiramos prever a magnitude do movimento? )))

Eu gostaria de encontrar as respostas para estas perguntas.

Talvez os praticantes me digam, em que eles treinam suas redes? :))

 

Caros membros do fórum, o tópico deste tópico é Redes Neurais, como dominá-las, por onde começar?

Vamos nos aproximar do tópico....

 

Rapazes, não se trata de redes neurais - trata-se da forma como são aplicadas......

 
Andrey4-min писал(а) >>

Prezados membros do fórum, o tópico deste tópico é Redes Neurais, como dominá-las e por onde começar?

Vamos nos aproximar do tópico....

Aqui está uma breve descrição das redes futuras, que às vezes cito quando surge um tópico semelhante. Então, vamos criar uma rede simples de encaminhamento.

Passo 1: Escolha os dados de entrada. Por exemplo,

x1 = WPR Per1

x2 = WPR Per2

x3 = WPR Per3

Passo 2: Selecione o número de neurônios na camada oculta, por exemplo, dois neurônios, y1 e y2. Selecione o número de neurônios na camada de saída, por exemplo, dois neurônios, z1 e z2. Assim, criamos uma rede 3-2-2. z1 e z2 são nossas saídas.

Passo 3: Definir a lógica de decisão. Por exemplo z1>=u comprar, z1<=-u vender, z2<=-v fechar compra, z2>=v fechar venda, onde |u|<=1 e |v|<==1.

Passo 4: Descreva os neurônios ocultos y1=F(x1,x2,x3) e y2=F(x1,x2,x3):

y1 = F(a0+a1*x1+a2*x2+a3*x3)

y2 = F(b0+b1*x1+b2*x2+b3*x3)

onde F() é uma função não-linear. Por exemplo, F(x)=tanh(x)=(exp(x)-exp(-x))/(exp(x)+exp(-x)). Eu prefiro uma função mais simples para evitar erros no cálculo de exp():

F(x) = -1 se x<=-1, x se -1<x<1, 1 se x>=1.

Passo 5: Descreva os neurônios de saída z1=F(y1,y2) e z2=F(y1,y2):

z1 = F(c0+c1*y1+c2*y2)

z2 = F(d0+d1*y1+d2*y2)

onde F() é a mesma função de ativação do neurônio.

Assim, a rede foi criada e descrita. Dar períodos Per1, Per2 e Per3 para Williamps-Percent-Range (WPR) e otimizar via metadrae batter a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, d0, d1, d2, -1<=u<=+1, -1<=v<=+1. Você também pode otimizar Per1, Per2 e Per3. Você pode brincar com diferentes entradas. Por exemplo, em vez de WPR, tente MACD ou outro indicador. Você pode limitá-lo a um neurônio de saída para abrir posições: z(y1,y2)>=u comprar, z(y1,y2)<=-u vender. E próximo ao stoploss, trailing stop ou takeprofit.

Você também pode criar uma rede mais complexa onde cada decisão comercial é associada a um neurônio de saída correspondente. Por exemplo, com os mesmos dados de entrada e neurônios ocultos, criamos 4 neurônios de saída

z1(y1,y2)>u1 - aberto longo

z2(y1,y2)>u2 - abrir curto

z3(y1,y2)>u3 - fechar longo

z4(y1,y2)>u4 - fechar curto

Neste caso, o número de coeficientes otimizados aumenta significativamente. Normalmente u1=u2=u3=u4=u4=0,9.

Você pode aumentar o número de camadas e neurônios ocultos neles se você tiver um computador potente.

 
Andrey4-min писал(а) >>

Prezados membros do fórum, o tópico deste tópico é Redes Neurais, como dominá-las e por onde começar?

Vamos nos aproximar do assunto....

Não se preocupe em programar redes neurais você mesmo, existem programas já prontos. O único programa que tem um livro em russo - Statistica Neural Networks, e este livro dá a impressão de que foi escrito por especialistas em redes neurais, e tem uma introdução bastante decente e uma visão geral das técnicas de redes neurais e dos tipos existentes de redes neurais. O programa permite exportar redes treinadas como um dll que pode ser usado no MT Expert Advisors (não tentei eu mesmo, desculpe se estou errado). Os programas de comércio especializado com redes não-rede não são tão fáceis de anexar à MT e, se for possível, são tortuosos ou muito caros. Existem terminais de corretagem que exportam dados para meta arquivos, não é tão fácil implementar software especializado para trabalhar com redes não agrícolas. Eh! Por que os desenvolvedores da MT não oferecem a possibilidade de exportar dados para poder utilizar quaisquer outros programas de análise financeira sem mudanças desnecessárias.

 

Para começar, imho, o melhor programa é o NeuroShell -2, há uma ajuda russa e exemplos em russo. Além disso, as redes neurais de NS 2 podem ser facilmente anexadas a consultores e indicadores especializados em MT4.

Você pode ler aqui: http://www.fxreal.ru/forums/forums.php?forum=3