Participe de nossa página de fãs
Coloque um link para ele, e permita que outras pessoas também o avaliem
Avalie seu funcionamento no terminal MetaTrader 5
- Publicado por:
- MetaQuotes
- Visualizações:
- 2820
- Avaliação:
- 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
- Dependendo da sua tarefa, criar um sistema fuzzy vazio do tipo Mamdani ou Sugeno.
- Criar variáveis de entrada e saída fuzzy.
- 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.
- As variáveis são adicionadas ao sistema.
- Um conjunto de regras é criado.
- As regras são adicionadas ao sistema.
- Dados de entrada são enviados ao sistema.
- 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:
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:
|
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:
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:
- Número de valores de entrada e saída a serem reorganizadas pelas variáveis fuzzy.
- Número de termos e suas funções de pertinência para cada variável fuzzy.
- O tipo de um sistema fuzzy dependendo da sua tarefa.
- Número e conteúdo de regras fuzzy correspondentes ao sistema selecionado.
- Parâmetros e características específicos do sistema.
O desenvolvimento do sistema e cálculo:
- 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();
- 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);
- 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());
- Entrar com as variáveis de entrada ao sistema:
fuzzy_system.Input().Add(FuzzyVariable fuzzy_variable);
- 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[]));
- 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);
- 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);
- 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);
- 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);
- 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;
- 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:
Os 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:
Os resultados dos cálculos:
Traduzido do russo pela MetaQuotes Ltd.
Publicação original: https://www.mql5.com/ru/code/13697

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

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

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

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