Discussão do artigo "Algoritmos genéticos - é fácil!" - página 7

 
Graff:
Senhores! Se não for muito difícil, por favor, me dê alguns exemplos de uso da biblioteca UGA.
Em que tipo de exemplos (em que tópico) você está interessado?
 
joo:
Em que tipo de exemplos (sobre qual tópico) você está interessado?
Quaisquer exemplos que usem o UGA, pois os exemplos no artigo não deixam claro como ele funciona. O artigo tem um exemplo com um zigue-zague, podemos ter exemplos com outros indicadores (RSI, CCI....)?
 
Graff:
qualquer um que use UGA, pois os exemplos no artigo não deixam claro como ele funciona. no artigo há um exemplo com ziguezague, podemos ter exemplos com outros indicadores (RSI, CCI....)?

Escreva um script no qual:

1) carregamento na matriz de dados do instrumento necessário para calcular o indicador

2) cálculo do(s) indicador(es) com algum conjunto de parâmetros (esses parâmetros do indicador devem ser otimizados).

3) determinação dos pontos de entrada/saída com base nos sinais do indicador

4) cálculo de um indicador estatístico de interesse (o número de pips ganhos levando em conta o spread, o drawdown, etc.).


Os itens 2), 3), 4) são etapas em uma iteração do GA - cálculo do FF para um indivíduo. Escreva um script desse tipo e eu, por minha vez, tentarei ajudá-lo a "parafusar" o UGA nele.


PS. Duvido que alguém publique um exemplo pronto de negociação usando a UGA - se alguém estiver seriamente envolvido em pesquisas usando essa biblioteca (ou qualquer outra biblioteca semelhante), provavelmente esses desenvolvimentos são privados (o tempo é gasto no estudo de algo que não está diretamente relacionado à negociação).

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
zsazsa:

Ótimo artigo! Obrigado.

1) Pelo que vejo, você queria usar o UGA para otimizar o treinamento de NNs. Foi bem-sucedido?

2) Quais foram os genes do cromossomo nesse caso?

3) Você também desenvolveu sua própria biblioteca de NNs ou encontrou alguma implementação de NN existente que suporte a integração com o MT5 e o GA?

1) Sim.
2) Represento os pesos e as tendências dos neurônios de uma rede como genes do cromossomo.
3) Escrevi minha própria realização de uma rede neural.
 

Andrey, bom dia para você. Estou tentando aprender a usar sua biblioteca pelo "método científico" (no exemplo de UGA_script.mq5 e skin.mqh proposto por você). Se não se importar, dê-me uma introdução adicional sobre como definir corretamente os parâmetros de entrada para resolver o problema de treinamento da rede Kohonen, quando temos um conjunto de pontos no plano, que precisamos atribuir (classificar) a determinados núcleos. Ou seja, temos N pontos com coordenadas (x,y), M kernels (que serão "deslocados" após o treinamento), função FF - "medida de proximidade". Pelo que entendi, no UGA_script.mq5, os parâmetros devem ser definidos da seguinte forma: ChromosomeCount_P= ???? (não sei como definir), GeneCount_P=2*M (2 coordenadas para cada núcleo), Epoch_P= ???? (não sei como definir). Desde já agradeço.

 
kogriv:

Andrey, bom dia para você. Estou tentando aprender a usar sua biblioteca pelo "método científico" (no exemplo de UGA_script.mq5 e skin.mqh proposto por você). Se não se importar, dê-me uma introdução adicional sobre como definir corretamente os parâmetros de entrada para resolver o problema de treinamento da rede Kohonen, quando temos um conjunto de pontos no plano, que precisamos atribuir (classificar) a determinados núcleos. Ou seja, temos N pontos com coordenadas (x,y), M kernels (que serão "deslocados" após o treinamento), função FF - "medida de proximidade". Pelo que entendi, no UGA_script.mq5, os parâmetros devem ser definidos da seguinte forma:

1) ChromosomeCount_P= ???? (Não entendo como definir isso),

2) GeneCount_P=2*M (2 coordenadas para cada núcleo),

3) Epoch_P= ???? (não entendo como definir).

Desde já, obrigado.

1) Defina 50 para começar, se não for suficiente, aumente o valor (não exagere, até 200-300, caso contrário você corre o risco de não esperar pelo resultado).

2) Sim.

3) Comece com 50-100, se não for suficiente, aumente o valor (não exagere, até 200-1000, caso contrário, você corre o risco de não obter resultados).

Os números são empíricos, você pode alterá-los como quiser, concentrando-se na velocidade de convergência ou na precisão do resultado (esses são, em geral, requisitos mutuamente exclusivos, o meio está em algum lugar no meio - perdoe o trocadilho).

 

Estou dando uma olhada na biblioteca.

Andrew, não consigo entender por que você deve calcular a função de adequação ANTES de remover as duplicatas da população. Isso é caro.

void CycleOfOperators
(
...........
.......
)
{
 ................................
...............

  /Determinar a aptidão de cada indivíduo na colônia de descendentes
  GetFitness(historyHromosomes);
................................
..........................
  /Preparar a população para a próxima reprodução
  RemovalDuplicates();
}// fim da função

Eu controlaria a presença de clones no estágio de geração de descendentes. (O que farei, na verdade).

 
MetaDriver:

1) Andrew, não consigo entender por que você deve calcular a função de adequação ANTES de remover as duplicatas da população. Isso é caro.

2) Eu controlaria a presença de clones no estágio de geração de descendentes. (O que farei, na verdade.)

1) Não são realizados cálculos repetidos de FF, porque a verificação é feita no banco de dados de cromossomos históricos - se pelo menos uma vez a FF tiver sido realizada antes para esse indivíduo, o valor será retirado do banco de dados.

2) Há uma nuance no assentamento de uma nova colônia na população. Mas vou me calar sobre isso. :) Faça isso da maneira que achar mais correta e me conte os resultados - depois disso, eu lhe contarei sobre a nuance.


PS Em geral, e não em relação a este comentário, é possível seguir muitas estratégias diferentes de pesquisa aleatória de AG, e cada variante merece atenção até certo ponto. Os resultados (taxa de convergência, precisão da pesquisa, ficar preso em extremos locais) dependerão quase que diretamente das estratégias de pesquisa usadas.

 
joo:

1) Não há cálculos repetidos de FFs, porque o banco de dados histórico de cromossomos é verificado - se um FF tiver sido realizado pelo menos uma vez antes para esse indivíduo, o valor será retirado do banco de dados.

2) Há uma nuance com o assentamento de uma nova colônia na população. Mas vou me calar sobre isso. :) Faça o que achar mais correto e me conte sobre os resultados - depois disso, eu lhe contarei sobre a nuance.

1) Bem, bem, bem. Contador de histórias. :) Você cometeu pelo menos um erro.

É assim que os números reais são comparados apenas por... mmmm... matemáticos, sim.

        if (Colony[Ge][chromos]!=historyHromosomes[Ge][Ch1])
          break;

Em tal comparação, uma diferença de quinze dígitos após um ponto flutuante reconhece os genes como diferentes. E sempre haverá uma diferença, porque é o destino. ;)

Pelo menos tem que ser assim:

        if (fabs(Colony[Ge][chromos]-historyHromosomes[Ge][Ch1]) > delta)  // por exemplo, 0,00001 < delta < 0,00000000001
          break;

Não tenho dúvidas de que você testou a remoção de duplicatas separadamente do algoritmo de genes, portanto, você deve ter a ilusão de que esse fragmento funciona.


2) Como tudo é misterioso... Onde o fino é fino, o rasgado é rasgado :)

Tudo é solucionável lá, com ou sem nuances. Ok, vou lhe mostrar como fiz isso.

 
MetaDriver:

1) Bem, bem, bem. Contador de histórias. :)

2) Você tem pelo menos um erro aí. É assim que os números reais são comparados apenas por... mmmm... matemáticos, sim. Em tal comparação, uma diferença de quinze dígitos após um ponto flutuante reconhece os genes como diferentes. E sempre haverá uma diferença, porque é o destino. ;)

Pelo menos tem que ser assim:

3) E você tem exatamente a mesma coisa ao remover duplicatas. Não tenho dúvidas de que você testou a remoção de duplicatas separadamente do algoritmo de genes, portanto, você deve ter a ilusão de que esse fragmento funciona.

4) Como tudo é misterioso... Onde o fino é fino, o rasgado é rasgado :) Tudo é solucionável lá, com ou sem nuances. Ok, vou mostrar como fiz isso.

1) Contador de histórias? Hmm, infelizmente não entendi o humor. A verificação do banco de dados ocorre na função CheckHistoryChromosomes(chromos,historyHromosomes ) , que é chamada a partir de GetFitness(historyHromosomes). É por isso que eu disse corretamente - não há execuções repetidas de FF.

2) A reconciliação com o banco de dados ocorre com a verificação por genes. E cada gene é normalizado por SelectInDiscreteSpace(temp,RangeMinimum,RangeMaximum,Precision,3) quando um novo cromossomo aparece. Portanto, também não há "contos de fadas" aqui.

3) Veja 2)

4) Não há mistério. O código é aberto e transparente. Há de fato uma nuance (não relacionada a problemas de implementação, mas à qualidade da convergência).