O "New Neural" é um projecto de motor de rede neural Open Source para a plataforma MetaTrader 5. - página 46

 
maxfade:

uma piada barbuda vem-me imediatamente à cabeça

Duvido dos "zeros" no momento do nascimento, além de pensar que os erros - as deflexões estão presentes o tempo todo.
A propósito, sim, o bebé nasce com pelo menos um aperto e um reflexo de deglutição, e isso também é trabalho cerebral. Portanto, ele não tem um cérebro zero, especialmente porque a sua aprendizagem começa muito antes do seu nascimento. É uma questão de evolução em vez de aprender a carregar as escalas de um recém-nascido.
 

Mudei-o para que quando um objecto é criado via construtor com parâmetros, uma nova sequência seja rubricada no final da sequência.

Funcionará um pouco mais lentamente, mas a sequência será única o tempo todo.

Ao criar através do construtor padrão, você precisa chamar Srand() e a seqüência será a mesma, girando em círculo.

  uint st=GetTickCount();
  CRandm *rnd=new CRandm((uint)TimeLocal(),10000);// длинна последовательности
  for(int i=0;i<1000000;i++)// количество вызовов
    {
     rnd.Rand();
    } 
  delete rnd;   
  Print("time=",GetTickCount()-st);
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
Arquivos anexados:
Randm.mqh  5 kb
 

Eu proponho considerar uma bíblia de ordem virtual (emula a abertura/fecho no mercado. os comandos são quase os mesmos que para ordens reais).

Será útil quando você precisar executar um modelo sobre dados históricos (fora do testador de estratégia).

O que você esqueceu? O que podemos melhorar, acrescentar, mudar, modificar? - A biblioteca é muito básica.

Até agora só foram implementadas operações dos tipos buy-0 e sell-1.

Arquivos anexados:
C_Orders.mqh  15 kb
 

Palestra 1 aqui https://www.mql5.com/ru/forum/4956/page23

Palestra 2 aqui https://www.mql5.com/ru/forum/4956/page34

Palestra 3 aqui https://www.mql5.com/ru/forum/4956/page36

Palestra 4. Aplicação da organização do córtex visual à transformação de séries temporais

Portanto, nossa tarefa é construir uma rede neural de classificação de padrões de preços de acordo com o princípio do cérebro. Esta rede pode ser dividida em dois módulos: o módulo de transformação de entradas (preço) e o módulo de classificação que pode ser construído de acordo com qualquer princípio conhecido (por exemplo, Máquina Vectorial de Suporte):

Na minha palestra anterior descrevi o modelo HMAX do córtex visual como um exemplo de transformação de informação biológica. A grande desvantagem deste modelo é que os valores de pesos (campos receptivos) não são treinados nele, mas simplesmente tirados de medições biológicas de neurónios do cérebro. Por exemplo, os campos receptivos de neurônios simples em V1 (S1) são medidos como mostrado no vídeo aqui https://www.youtube.com/watch?v=Cw5PKV9Rj3o(os cliques que você ouve são pulsos de neurônios). No nosso caso de citações de séries temporais, os "campos receptivos" de neurónios que transformam a informação são desconhecidos de antemão. Por isso, teremos de ser nós a encontrá-los. Por exemplo, a primeira camada de transformação de preços (camada S1) pode ser construída da seguinte forma, por analogia com a camada S1 do córtex visual:

Neste exemplo, a nossa camada S1 tem 6 subcamadas, numeradas de 0 a 5. Neurônios (círculos) do mesmo sub-camada têm os mesmos pesos de entrada (campos receptivos), convencionalmente mostrados nos retângulos da esquerda. Cada sub-camada de neurónios tem o seu próprio campo receptivo. Sabemos antecipadamente que se existe um sub-camada com campo receptivo w_0,k onde k=0...5 (direção "para cima"), então deve haver um sub-camada com campo receptivo -w_0,k (direção "para baixo"). Que as camadas com campo positivo sejam numeradas com números pares (0, 2, 4) e as suas contrapartidas negativas numeradas com números difusos (1, 3, 5). Além disso, sabemos que os subcamadas S1 devem ter campos receptivos de diferentes tamanhos. Deixe o tamanho do campo aumentar de sub-camada 0 (e sua contraparte negativa 1) para sub-camada 4 (e sua contraparte negativa 5). As entradas de todos os neurônios da mesma coluna são alimentadas com os mesmos preços (por exemplo, os neurônios da primeira coluna são alimentados com preços x_0...x_5). As entradas de neurónios na coluna seguinte são alimentadas com preços deslocados por 1 barra (x_1...x_6), etc. Assim, nossa camada S1 consiste em neurônios com campos receptivos de diferentes direções (para cima, para baixo), tamanhos e posições de tempo.

O aprendizado dos pesos de entrada dos neurônios da camada S1 é feito apenas para uma coluna de neurônios de diferentes subcamadas, e não importa qual delas. Então todos os pesos são copiados para os restantes neurónios em cada sub-camada. A aprendizagem é feita sem um professor, alimentando diferentes padrões de preços com insumos da camada S1 e mudando os pesos por alguma regra. Há muitas regras para a auto-aprendizagem dos pesos dos neurónios, bem descritas aqui:

Miller, K. D., e MacKay, D. J. C. (1994). O papel das restrições na aprendizagem Hebbian. Neural Computat., 6, 100-126.

A primeira regra de auto-aprendizagem neuronal foi postulada por Hebb em 1949(https://en.wikipedia.org/wiki/Hebbian_theory). Esta regra diz: "Se um neurônio recebe entrada de outro neurônio, e ambos são altamente ativos, o peso entre os neurônios deve ser aumentado". Matematicamente, está escrito da seguinte forma

dw_i = mu*x_i*y,

onde dw_i é o incremento de peso w_i, x_i é o valor na entrada i-ésimo, y é a saída de um neurônio, mu é a taxa de aprendizagem. Vamos usar a regra Oja (https://en.wikipedia.org/wiki/Oja's_rule), que pertence à classe das regras de aprendizagem competitivas :

dw_i = mu*y*(x_i - y*w_i/a),

onde dw_i é o peso incremental w_i, x_i é o preço no i-ésimo input, y é o output do neurónio calculado como y = SUM(w_i*x_i, i=0..m-1), mu é a taxa de aprendizagem, a é um parâmetro (soma dos quadrados de pesos SUM(w_i^2,i=0..m-1) tende para a). A vantagem desta regra é que ela automaticamente encontra pesos como principais vetores próprios das cotações de preços. Em outras palavras, a regra de Ogi reproduz a Abordagem da Componente Principal (PCA). Isto coincide com a suposição biológica de que os campos receptivos da camada S1 do córtex visual representam os principais vetores próprios da informação visual. O código C++ em anexo treina automaticamente os pesos dos 32 subcamadas S1 com aspas EURUSD M5 como entrada, mu=1, a=1. Estes pesos como funções de entrada são mostrados abaixo

Os pesos das duas primeiras subcamadas (0 e 1) são mostrados em vermelho. Eles têm apenas dois valores não zero: -0,707 e +0,707. Os pesos das subcamadas 2 e 3 são mostrados em laranja. Eles têm 4 valores diferentes de zero. Etc.

Para usar o código anexo, você precisa instalar as bibliotecas Boost e CImg http://cimg.sourceforge.net/. Eu não tenho as camadas superiores (C1, S2, C2) e provavelmente não o farei por muito tempo. Aqueles que leram minhas leções anteriores devem entender como todas as camadas HMAX funcionam e completar o módulo de conversão de cotações. Na próxima (última) palestra vou falar sobre a SparseNets.

Arquivos anexados:
BrainPower.zip  907 kb
 

Eu proponho considerar uma bíblia de ordem virtual (emula a abertura/fecho no mercado. os comandos são quase os mesmos que para ordens reais).

Será útil quando você precisar executar um modelo sobre dados históricos (fora do testador de estratégia).

O que você esqueceu? O que podemos melhorar, acrescentar, mudar, modificar? - A biblioteca é muito básica.

Até agora, só foram implementadas operações de compra-0 e venda-1.

Obrigado pela biblioteca. Posso receber uma breve instrução sobre como usá-la?
 
Graff:
Obrigado pela biblioteca. Posso ter um tutorial rápido sobre como usá-lo?

Na verdade, não há muito para contar.

Antes de cada execução do histórico, a fim de limpar o histórico do pedido, ligue

void Initialise(int MaxPossibleCountOrd, double Spread, double Point_);

e depois, de acordo com a sua estratégia de negociação, chame os comandos necessários:

int    OrderOpen        (int Type, double Volume, int Time,double Price,double SL, double TP);
void   Possible_SL_or_TP(int Time, double PriceHigh,double PriceLow);
void   OrderClose       (int Ticket, int Time,double Price);
void   OrderCloseAll    (int Time, double   Price);
int    ProfitTradeCount ();
int    TotalPipsProfit  ();
int    LossSeriesCount  ();
int    ProfitSeriesCount();

O spread é fixo, é definido durante a inicialização. Para um spread flutuante, teremos de adicionar a funcionalidade apropriada. Na minha opinião, não é necessário - basta definir o máximo possível de spread para um instrumento e pronto.

 
joo:

Não há muito para contar.

Antes de cada execução do histórico, para limpar o histórico da ordem, você precisa chamar os seguintes comandos:

e depois, de acordo com a estratégia de negociação, chamar os comandos necessários:

O spread é fixo, é definido durante a inicialização. Para um spread flutuante, teremos de adicionar a funcionalidade apropriada. Para mim não é necessário no inferno - basta definir o máximo possível de spread para um instrumento e pronto.

Obrigado, vou tentar hoje à noite. O analógico para o MT4https://www.mql5.com/ru/forum/124013 pode ser de alguma ajuda.
Простая идея мультивалютного тестера с примером реализации - MQL4 форум
  • www.mql5.com
Простая идея мультивалютного тестера с примером реализации - MQL4 форум
 

Desculpe, mas parece que calculei mal. Neste momento, não tenho praticamente nenhuma oportunidade de me envolver no projecto.

Embora o desejo de participar seja enorme, estou desesperadamente com falta de tempo e energia, o que é uma pena.

Eu poderei participar após os exames (meados de Dezembro). A propósito, um dos cursos está directamente relacionado com redes neurais.

 

A propósito. Há duas funções de alvo. Para regressão logística e simples regressão.

A classificação é um caso de regressão logística.

A função alvo é para a regressão logística:

E para a regressão normal:

embora os seus derivados sejam semelhantes. Talvez seja por isso que a distinção costuma ser silenciosa.

O primeiro é usado na camada sigmoidal de saída em problemas de classificação.

O segundo é usado para saída linear em problemas de previsão.

 
TheXpert:

Desculpe, mas parece que calculei mal. Neste momento, não tenho praticamente nenhuma oportunidade de me envolver no projecto.

Embora o desejo de participar seja enorme, estou desesperadamente com falta de tempo e energia, o que é uma pena.

Eu poderei participar após os exames (meados de Dezembro). A propósito, um dos cursos está directamente relacionado com redes neurais.

Vocês estão espalhados pelos cantos camaradas. Nem pensar.