Unisciti alla nostra fan page
- Pubblicati da::
- MetaQuotes
- Visualizzazioni:
- 552
- Valutazioni:
- Pubblicato:
- 2021.11.15 16:28
-
Hai bisogno di un robot o indicatore basato su questo codice? Ordinalo su Freelance Vai a Freelance
Autore
Dmitry Kalyuzhny. Sito web progetto FuzzyNet - http://sourceforge.net/projects/fuzzynet/
Scompatta l'archivio in terminal_data_folder.
I codici della libreria sono posizionati in <terminal_data_folder>\MQL4\Include\Math\FuzzyNet\
Gli script di prova possono essere trovati in <terminal_data_folder>\MQL4\Scripts\FuzzyNet\
FuzzyNet è una delle librerie matematiche più popolari per la creazione di modelli fuzzy
Fuzzy Logic Library per Microsoft.Net (FuzzyNet) è un componente facile da usare che implementa i sistemi di inferenza fuzzy Mamdani e Sugeno.
FuzzyNet include:
- 5 funzioni di appartenenza.
- Modulo flessibile per lo sviluppo di regole di sistema fuzzy.
- Sistema di inferenza fuzzy Mamdani.
- Sistema di inferenza fuzzy Sugeno.
- Un metodo di defuzzificazione per sistemi di tipo Mamdani.
- Quantità illimitata di variabili di input e output.
Durante la conversione della libreria in MQL4 sono state apportate le seguenti aggiunte:
- 8 nuove funzioni di appartenenza.
- 4 nuovi metodi di defuzzificazione per sistemi di tipo Mamdani.
Utilizzando la libreria
- A seconda del tuo compito, crea un sistema fuzzy di tipo Mamdani o Sugeno vuoto.
- Crea variabili fuzzy di input e output .
- Termini appropriati vengono aggiunti a ciascuna variabile fuzzy. Prima di ciò, ad un termine vengono assegnati un nome e una funzione di appartenenza.
- Le variabili sono aggiunte al sistema.
- Vengono create un'insieme di regole.
- Le regole sono aggiunte al sistema.
- I dati di input vengono inviati al sistema.
- Viene chiamata la funzione di calcolo del sistema.
Nota: Il sistema di inferenza di tipo Mamdani può essere configurato in qualsiasi momento dopo la sua creazione prima che venga chiamata la funzione di calcolo del sistema. Se le impostazioni di sistema non hanno subito modifiche dopo la loro creazione, il sistema lavora con le impostazioni predefinite:
- L'Implicazione viene eseguita utilizzando l'operatore Min (un set fuzzy di output viene troncato).
- L'Aggregazione viene eseguita utilizzando l'operatore Max (ricevendo i valori massimi delle funzioni di appartenenza di output ottenute dopo l'implicazione).
- La defuzzificazione viene eseguita utilizzando il metodo del center of gravity
La conversione della libreria FuzzyNet (v. 1.2.0) è visualizzata qui sotto.
Per lavorare con la libreria, includere il file MamdaniFuzzySystem.mqh o SugenoFuzzySystem.mqh a seconda del sistema che si sta creando.
Sotto informazioni più dettagliate circa i pacchetti della libreria portati da FuzzyNet:Pacchetti | Descrizione |
---|---|
Dictionary.mqh | Il pacchetto contiene classi aggiuntive necessarie per altri pacchetti |
FuzzyRule.mqh | Classi per creare le regole fuzzy:
Il pacchetto contiene anche classi ausiliari per implementare regole fuzzy. |
FuzzyTerm.mqh | Pacchetto per la creazione di termini fuzzy. |
FuzzyVariable.mqh | Pacchetto per la creazione di variabili fuzzy. |
GenericFuzzySystem.mqh | La classe implementa le funzionalità comuni per i sistemi Mamdani e Sugeno. |
Helper.mqh | Il pacchetto contiene classi aggiuntive necessarie per altri pacchetti |
InferenceMethod.mqh | Il pacchetto contiene classi aggiuntive necessarie per altri pacchetti |
MamdaniFuzzySystem.mqh | La classe per la creazione di un sistema fuzzy di tipo Mamdani. |
MembershipFunction.mqh | Classi di funzioni di appartenenza:
|
RuleParser.mqh | Classe per analizzare regole fuzzy. |
SugenoFuzzySystem.mqh | Classe per la creazione di un sistema fuzzy di tipo Sugeno. |
SugenoVariable.mqh | Il pacchetto contiene le seguenti classi:
Le varibili fuzzy di tipo Sugeno vengono utilizzate quando sviluppiamo regole per un sistema di tipo Sugeno. |
Utilizzo della libreria FuzzyNet in MQL4
Prima di scrivere un sistema fuzzy, dovresti avere una chiara visione dei suoi elementi, incluso:
- Numero dei valori di input e output da riordinare per variabili fuzzy.
- Numero di termini e le loro funzioni di appartenenza per ogni variabile fuzzy.
- Il tipo di sistema fuzzy a seconda dell'attività.
- Numero e contenuto delle regole fuzzy corrispondenti al sistema selezionato.
- Parametri e caratteristiche specifiche del sistema.
Sviluppo e calcolo del sistema:
- Creare un sistema vuoto.
Per un sistema di tipo Mamdani:
MamdaniFuzzySystem *fuzzy_system=new MamdaniFuzzySystem();
Per un sistema di tipo Sugeno:
SugenoFuzzySystem *fuzzy_system=new SugenoFuzzySystem();
- Creare tutte le variabili di input fuzzy separatamente dal sistema assegnando un nome e valori massimo/minimo a tutte le variabili come parametri:
FuzzyVariable *fuzzy_variable=new FuzzyVariable(const string name,const double min,const double max);
- Creare funzioni dei termini fuzzy, creare termini fuzzy autonomamente e passare loro nomi appropriati e funzioni di appartenenza. Successivamente, aggiungi i termini alle variabili corrispondenti. Per ridurre il codice del programma, il processo può essere scritto come segue:
fuzzy_variable.Terms().Add(new FuzzyTerm(const string name,new IMembershipFunction());
- Inserisce le variabili di input al sistema:
fuzzy_system.Input().Add(FuzzyVariable fuzzy_variable);
- Creare le variabili di input prestando attenzione al tipo del tuo sistema. Per un sistema di tipo Mamdani, la creazione è simile ai passi 2 e 3 . Per un modello di tipo Sugeno, creare variabili fuzzy speciali accettando solo un nome di variabile come parametri:
SugenoVariable *sugeno_variable=new SugenoVariable(const string name);
Le funzioni lineari che interpretano la combinazione lineare dei valori di input vengono aggiunte a una variabile fuzzy di tipo Sugeno invece di termini fuzzy. Un nome ed un array di coefficenti vengono utilizzati come parametri di funzioni lineari. Un'equazione lineare viene formata in base a tale array, pertanto è importante rispettare l'ordine degli elementi nell'array. Una lunghezza dell'array di coefficienti dovrebbe essere uguale alla quantità di valori di input o superarla di uno. Se le lunghezze sono uguali, un termine assoluto di un'equazione è uguale a zero. Se la lunghezza dell'array supera l'ammontare di uno, un termine assoluto è uguale all'ultimo valore dell'elemento. Tutti gli altri elementi dell'array a partire dal primo sono assegnati a variabili di input fuzzy nell'ordine in cui sono stati inseriti nel sistema.sugeno_varriable.Functions().Add(fuzzy_sytem.CreateSugenoFunction(const string name, const double &coeffs[]));
- Analogamente al passaggio 4, anche le variabili di output dovrebbero essere aggiunte al sistema:
Per un sistema di tipo Mamdani:
fuzzy_system.Output().Add(FuzzyVariable fuzzy_variable);
Per un sistema di tipo Sugeno:
fuzzy_system.Output().Add(FuzzyVariable fuzzy_variable);
- Organizzare una serie di regole in base al sistema. Le regole sono definite come una stringa comune e analizzate automaticamente in base a parole chiave. Le parole chiavi sono "if", "then", "is", "and", "or", "not", "(" , ")", "slightly", "somewhat", "very" e "extremely", così come tutti i nomi delle variabili, dei termini e delle funzioni disponibili nel sistema.
Per un sistema di tipo Mamdani:
MamdaniFuzzyRule *fuzzy_rule = fuzzy_system.ParseRule(const string rule_text);
Per un sistema di tipo Sugeno:
SugenoFuzzyRule *fuzzy_rule = fuzzy_system.ParseRule(const string rule_text);
- Inserisci tutte le regole nel sistema:
Per un sistema di tipo Mamdani:
fuzzy_system.Rules().Add(MamdaniFuzzyRule fuzzy_rule);
Per un sistema di tipo Sugeno:
fuzzy_system.Rules().Add(SugenoFuzzyRule fuzzy_rule);
- Passa i valori di input delle variabili al sistema per il calcolo. Per fare ciò, dovrebbero essere definiti. Al suo input, il sistema accetta l'elenco di valori compreso l'oggetto della classe Dictionary_Obj_Double. La classe è descritta nel file Dictionary.mqh.
Dictionary_Obj_Double *p_od_in=new Dictionary_Obj_Double;
La classe implementa il metodo SetAll(CObject *key, const double value) accettando due parametri - una variabile fuzzy e un valore numerico. Questo elemento è una variabile di input del sistema.p_od_in.SetAll(FuzzyVariable fuzzy_variable,const double value);
Tutti gli altri valori di input vengono compilati allo stesso modo. Crea l'elenco e aggiungi tutti i valori:CList *in=new CList; in.Add(p_od_in);
- Devono essere specificati anche i valori di output:
Dictionary_Obj_Double *p_od_out=new Dictionary_Obj_Double; CList *out=new CList;
- La chiamata alla funzione Calculate(CList *&list) per il nostro sistema restituisce l'elenco dei risultati del calcolo del sistema:
out=fuzzy_system.Calculate(in);
Successivamente, l'elenco out memorizza tutti i valori di output calcolati nell'ordine in cui sono stati inseriti nel sistema. Abbiamo solo bisogno di riceverli:p_od_out=out.GetNodeAtIndex(int index); double result=p_od_out.Value();
Ora, la variabile result memorizza il risultato del calcolo del sistema per un valore di uscita immesso nel sistema con un numero specificato in index.
Script d'esempio
Tips Sample (Mamdani)
Tips_Sample_Mamdani.mq4 calcola la percentuale di mancia che devi pagare in base alla qualità del servizio e del cibo.
Inserisci i parametri di ingresso:
Risultati del calcolo:
Cruise Control Sample (Sugeno)
Lo script di esempio Cruise_Control_Sample_Sugeno.mq4 è un esempio di regolatore fuzzy. Rappresenta un sistema di controllo automatico della velocità dell'auto che calcola l'accelerazione necessaria utilizzando i dati sulla deviazione corrente e il tasso di variazione della deviazione affinché l'auto raggiunga la velocità desiderata.
Inserisci i parametri di ingresso:
Risultati del calcolo:
Tradotto dal russo da MetaQuotes Ltd.
Codice originale https://www.mql5.com/ru/code/13717
![QuotesDemo](https://c.mql5.com/i/code/expert.png)
L'Expert Advisor mostra i valori correnti degli Indici Azionari Mondiali di Google Finance utilizzando la funzione WebRequest.
![SignalsDemo](https://c.mql5.com/i/code/expert.png)
L'Expert Advisor mostra le proprietà dei segnali,consente di modificare le impostazioni della copia del segnale e sottoscrivere o disiscrivere il segnale di trade selezionato.
![RegularExpressions in MQL4 per lavorare con le espressioni regolari](https://c.mql5.com/i/code/library.png)
Le espressioni regolari forniscono un linguaggio formale per l'elaborazione rapida e flessibile dei testi. Ogni espressione regolare è un modello (maschera), per il quale il motore delle espressioni regolari cerca di trovare corrispondenze nel testo di origine. Un modello è costituito da uno o più caratteri letterali, operatori o costrutti.
![DMH](https://c.mql5.com/i/code/indicator.png)
Directional Movement using Hann windowing - metatrader 4 version