Assista a como baixar robôs de negociação gratuitos
Encontre-nos em Twitter!
Participe de nossa página de fãs
Script interessante?
Coloque um link para ele, e permita que outras pessoas também o avaliem
Você gostou do script?
Avalie seu funcionamento no terminal MetaTrader 5
Bibliotecas

Fuzzy - Biblioteca de Lógica Fuzzy - biblioteca para MetaTrader 5

Publicado por:
MetaQuotes
Visualizações:
2560
Avaliação:
(34)
Publicado:
2015.08.31 12:31
Atualizado:
2017.05.19 18:17
Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance

Autor

Dmitry Kalyuzhny. Site do projeto FuzzyNet - http://sourceforge.net/projects/fuzzynet/

Descompacte o arquivo no terminal_data_folder.
Os códigos da biblioteca estão localizados no <terminal_data_folder>\MQL5\Include\Math\FuzzyNet\
Exemplos de testes de scripts podem ser encontrados no <terminal_data_folder>\MQL5\Scripts\FuzzyNet\

FuzzyNet é uma das bibliotecas matemáticas mais populares para a criação de modelos fuzzy

Biblioteca Lógica Fuzzy para Microsoft.Net (FuzzyNet) é um componente de uso fácil que implementa sistemas de inferência fuzzy Mamdani e Sugeno.

FuzzyNet inclui:

  • 5 funções de pertinência.
  • Forma flexível para o desenvolvimento de regras do sistema fuzzy.
  • Sistema de inferência fuzzy Mamdani .
  • Sistema de inferência fuzzy Sugeno.
  • Um método de defuzificação para sistemas do tipo Mamdani.
  • Uma quantidade ilimitada de variáveis ​​para entrada e saída.

As seguintes adições foram feitas ao converter a biblioteca para MQL5:

  • 8 novas funções de pertinência.
  • 4 novos métodos de defuzificação para sistemas do tipo Mamdani.

Usando a Biblioteca

  1. Dependendo da sua tarefa, criar um sistema fuzzy vazio do tipo Mamdani ou Sugeno.
  2. Criar variáveis ​​de entrada e saída fuzzy.
  3. Termos apropriados são adicionados a cada variável fuzzy. Antes disso, um nome e uma função de pertinência são atribuídas a um termo.
  4. As variáveis ​​são adicionadas ao sistema.
  5. Um conjunto de regras é criado.
  6. As regras são adicionadas ao sistema.
  7. Dados de entrada são enviados ao sistema.
  8. A função de cálculo dosistema é chamada.

Nota: O sistema de inferência tipo Mamdani pode ser configurado em qualquer estágio após a sua criação antes de ser chamada a função de cálculo do sistema. Se as configurações do sistema não foram alteradas após a sua criação, o sistema funciona com as configurações padrão:

  • A implicação é realizada usando o operador Min (uma saída de configuração fuzzy é truncada).
  • A agregação é realizada usando o operador Max (recebendo valores máximos nas saídas das funções de pertinência obtidos após implicação)
  • Defuzificação é realizada utilizando o método centro de gravidade.

A conversão da biblioteca FuzzyNet (v. 1.2.0) é exibida a seguir.

Para trabalhar com a biblioteca, incluir os arquivos MamdaniFuzzySystem.mqh ou SugenoFuzzySystem.mqh, dependendo do sistema que você está criando.

Abaixo, informações mais detalhadas sobre os pacotes de bibliotecas portados FuzzyNet:
Pacotes
Descrição
Dictionary.mqh
O pacote contém classes adicionais necessárias para outros pacotes.
FuzzyRule.mqh
Classes para a criação de regras fuzzy:
  1. GenericFuzzyRule - classe para a criação de uma regra com a condição sem fuzzy.
  2. MamdaniFuzzyRule - classe para a criação de uma regra de conclusão fuzzy tipo Mamdani.
  3. SugenoFuzzyRule - classe para a criação de uma regra de conclusão fuzzy tipo Sugeno.

O pacote também contém classes auxiliares para implementar regras fuzzy.

FuzzyTerm.mqh Pacote para a criação de termos fuzzy.
FuzzyVariable.mqh Pacote para a criação de variáveis fuzzy.
GenericFuzzySystem.mqh A classe implementa a funcionalidade comum para os sistemas Mamdani e Sugeno.
Helper.mqh O pacote contém classes adicionais necessárias para outros pacotes.
InferenceMethod.mqh O pacote contém classes adicionais necessárias para outros pacotes.
MamdaniFuzzySystem.mqh A classe para a criação de um sistema fuzzy do tipo Mamdani.
MembershipFunction.mqh Classes das funções de pertinência:
  1. Função de pertinência Gaussiana.
  2. Os dois lados da função de pertinência Gaussiana.
  3. Função de pertinência generalizada tipo Bell-shaped.
  4. Função de pertinência tipo S-shaped.
  5. Função de pertinência tipo Z-shaped.
  6. Função de pertinência tipo Pi-shaped.
  7. Função de pertinência tipo Sigmoid.
  8. Produto de duas funções de pertinência tipo Sigmoid.
  9. Função de pertinência na forma de uma diferença entre duas funções do tipo Sigmoid.
  10. Função de pertinência trapezoidal.
  11. Função de pertinência triangular.
  12. Função de pertinência na forma de uma constante.
  13. Função de pertinência como uma composição de funções de pertinência.
RuleParser.mqh Classe para analisar regras fuzzy.
SugenoFuzzySystem.mqh Classe para a criação de um sistema fuzzy do tipo Sugeno.
SugenoVariable.mqh O pacote contém as seguintes classes:
  1. LinearSugenoFuction - classe para a criação de funções lineares.
  2. SugenoVariable - classe para criar uma variável fuzzy do tipo Sugeno.

Variáveis fuzzy do tipo Sugeno são utilizadas no desenvolvimento de regras para um sistema do tipo Sugeno.

 

Usando a biblioteca FuzzyNet para MQL5

Antes de escrever um sistema fuzzy, você deve ter uma visão clara dos seus elementos, incluindo:

  1. Número de valores de entrada e saída a serem reorganizadas pelas variáveis ​​fuzzy.
  2. Número de termos e suas funções de pertinência para cada variável fuzzy.
  3. O tipo de um sistema fuzzy dependendo da sua tarefa.
  4. Número e conteúdo de regras fuzzy correspondentes ao sistema selecionado.
  5. Parâmetros e características específicos do sistema.

O desenvolvimento do sistema e cálculo:

  1. Criar um sistema vazio.

    Para um sistema do tipo Mamdani:

    MamdaniFuzzySystem *fuzzy_system=new MamdaniFuzzySystem();
    Para um sistema do tipo Sugeno:
    SugenoFuzzySystem *fuzzy_system=new SugenoFuzzySystem();
  2. Criar todas as variáveis ​​de entrada fuzzy separadamente a partir do sistema, atribuindo um nome e valores máximos/mínimos para todas as variáveis ​​como parâmetros:
    FuzzyVariable *fuzzy_variable=new FuzzyVariable(const string name,const double min,const double max);
  3. Criar funções de termos fuzzy, cria os próprios termos fuzzy e transmite nomes apropriados e funções de pertinência a eles. Depois disso, adicionar os termos para as variáveis ​​correspondentes. Para reduzir o código do programa, o processo pode ser escrito da seguinte maneira:
    fuzzy_variable.Terms().Add(new FuzzyTerm(const string name,new IMembershipFunction());
  4. Entrar com as variáveis ​​de entrada ao sistema:
    fuzzy_system.Input().Add(FuzzyVariable fuzzy_variable);
  5. Criar variáveis ​​de entrada prestando atenção ao seu tipo de sistema. Para um sistema do tipo Mamdani, o desenvolvimento é semelhante às etapas 2 e 3. Para um modelo do tipo Sugeno, desenvolver variáveis ​​fuzzy especiais que aceitem apenas um nome de variável como parâmetros:
    SugenoVariable *sugeno_variable=new SugenoVariable(const string name);
    Funções lineares interpretam a combinação linear dos valores de entrada e são adicionadas a uma variável fuzzy do tipo Sugeno, ao invés de termos fuzzy. Um nome e um coeficiente array são usados ​​como parâmetros de função lineares. Uma equação linear é formada com base no array, por conseguinte é importante cumprir com a ordem dos elementos no array. Um coeficiente de comprimento do array deve ser igual à quantidade de valores de entrada ou exceder esse valor por um. Se os comprimentos são iguais, um termo absoluto de uma equação é igual a zero. Se o comprimento do array excede a quantidade por um, um termo absoluto é igual ao último valor do elemento. Todos os outros elementos do array, começando a partir do primeiro, são atribuídos a variáveis ​​de entrada fuzzy na ordem em que foram inseridos no sistema.
    sugeno_varriable.Functions().Add(fuzzy_sytem.CreateSugenoFunction(const string name, const double &coeffs[]));
  6. Semelhante ao passo 4, variáveis ​​de saída também devem ser adicionadas ao sistema.

    Para um sistema do tipo Mamdani:

    fuzzy_system.Output().Add(FuzzyVariable fuzzy_variable);

    Para um sistema do tipo Sugeno:

    fuzzy_system.Output().Add(FuzzyVariable fuzzy_variable);
  7. Organizar um conjunto de regras de acordo com o sistema. As regras são definidas como uma string comum e automaticamente analisados ​​com base em palavras-chave. As palavras-chave são: "if", "then", "is", "and", "or", "not", "(" , ")", "slightly", "somewhat", "very" e "extremely", bem como todos os nomes de variáveis, termos e funções disponíveis no seu sistema.

    Para um sistema do tipo Mamdani:

    MamdaniFuzzyRule *fuzzy_rule = fuzzy_system.ParseRule(const string rule_text);

    Para um sistema do tipo Sugeno:

    SugenoFuzzyRule *fuzzy_rule = fuzzy_system.ParseRule(const string rule_text);
  8. Entre com todas as regras para o sistema.

    Para um sistema do tipo Mamdani:

    fuzzy_system.Rules().Add(MamdaniFuzzyRule fuzzy_rule);

    Para um sistema do tipo Sugeno:

    fuzzy_system.Rules().Add(SugenoFuzzyRule fuzzy_rule);
  9. Transmitir os valores de entrada das variáveis ​​para o sistema de cálculo. Para isto, eles devem ser definidos. O sistema aceita a lista de valores na sua entrada, incluindo o objeto de classe Dictionary_Obj_Double. A classe é descrita no arquivo Dictionary.mqh.
    Dictionary_Obj_Double *p_od_in=new Dictionary_Obj_Double;
    A classe implementa o método SetAll(CObject *key, const double value), aceitando dois parâmetros - uma variável fuzzy e um valor numérico. Este elemento é uma variável de entrada do sistema.
    p_od_in.SetAll(FuzzyVariable fuzzy_variable,const double value);
    Todos os outros valores de entrada são preenchidos da mesma maneira. Criar a lista e adicionar todos os valores a ela:
    CList *in=new CList;
    in.Add(p_od_in);
  10. Os valores de saída devem ser específicos, bem como:
    Dictionary_Obj_Double *p_od_out=new Dictionary_Obj_Double;   
    CList *out=new CList;
  11. Chamar a função Calculate(CList *&list) ao nosso sistema, retornando à lista dos resultados dos cálculos do sistema:
    out=fuzzy_system.Calculate(in);
    Depois disso, a lista "out" armazena todos os valores de saída calculados na ordem que foram inseridos. Nós só precisamos recebê-los:
    p_od_out=out.GetNodeAtIndex(int index);
    double result=p_od_out.Value();
    Agora, a variável "result" armazena o resultado do cálculo do sistema para um valor de saída inserido no sistema sob um número específico no índice.

Modelos de Scripts

Tips Sample (Mamdani)

Tips_Sample_Mamdani.mq5 calcula a porcentagem da gorjeta que você precisa pagar, dependendo da qualidade de serviço e comida.

Entre com os parâmetros de entrada:

Parâmetros de entradas

Os resultados dos cálculos:

Resultados dos cálculos

Cruise Control Sample (Sugeno)

O modelo de script Cruise_Control_Sample_Sugeno.mq5 é um exemplo de regulador fuzzy. Ela representa um sistema de controle de velocidade de um carro, calcula a aceleração necessária utilizando os dados sobre o desvio atual e a taxa de desvio de mudança, com o objetivo do carro atingir a velocidade desejada.

Entre com os parâmetros de entrada:

Parâmetros de entradas

Os resultados dos cálculos:

Resultados dos cálculos

Traduzido do russo pela MetaQuotes Ltd.
Publicação original: https://www.mql5.com/ru/code/13697

Exp_CyclePeriod Exp_CyclePeriod

O Expert Advisor Exp_CyclePeriod é baseado na reversão da direção não normalizada do oscilador CyclePeriod.

CyclePeriod_HTF CyclePeriod_HTF

O indicador CyclePeriod com a opção de seleção do timeframe nos parâmetros de entrada.

DecEMA_HTF DecEMA_HTF

O indicador DecEMA com a opção de seleção do timeframe nos parâmetros de entrada.

Demand_Index_HTF Demand_Index_HTF

O indicador Demand_Index com a opção de seleção do timeframe nos parâmetros de entrada.