Guarda come scaricare robot di trading gratuitamente
Ci trovi su Facebook!
Unisciti alla nostra fan page
Script interessante?
Pubblica il link!
lasciare che altri lo valutino
Ti è piaciuto lo script? Provalo nel Terminale MetaTrader 5
Librerie

Fuzzy - libreria per lo sviluppo di modelli fuzzy - libreria per MetaTrader 5

Pubblicati da::
MetaQuotes
Visualizzazioni:
378
Valutazioni:
(34)
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>\MQL5\Include\Math\FuzzyNet\
Gli script di prova possono essere trovati in <terminal_data_folder>\MQL5\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 MQL5 sono state apportate le seguenti aggiunte:

  • 8 nuove funzioni di appartenenza.
  • 4 nuovi metodi di defuzzificazione per sistemi di tipo Mamdani.

Utilizzando la libreria

  1. A seconda del tuo compito, crea un sistema fuzzy di tipo Mamdani o Sugeno vuoto.
  2. Crea variabili fuzzy di input e output .
  3. Termini appropriati vengono aggiunti a ciascuna variabile fuzzy. Prima di ciò, ad un termine vengono assegnati un nome e una funzione di appartenenza.
  4. Le variabili sono aggiunte al sistema.
  5. Vengono create un'insieme di regole.
  6. Le regole sono aggiunte al sistema.
  7. I dati di input vengono inviati al sistema.
  8. 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:
  1. GenericFuzzyRule - classe per la creazione di una condizione di regola non fuzzy.
  2. MamdaniFuzzyRule - classe per la creazione di una conclusione di regole fuzzy di tipo Mamdani.
  3. SugenoFuzzyRule - classe per creare una conclusione di una regola fuzzy di tipo Sugeno.

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:
  1. Funzione di appartenenza Gaussiana.
  2. Funzione di appartenenza gaussiana bilaterale.
  3. Funzione di appartenenza a campana generalizzata.
  4. Funzione di appartenenza S-shaped.
  5. Funzione di appartenenza Z-shaped.
  6. Funzione di appartenenza Pi-shaped.
  7. Funzione di appartenenza sigmoide.
  8. Prodotto di due funzioni di appartenenza sigmoide.
  9. Funzione di appartenenza sotto forma di differenza tra due funzioni sigmoidi.
  10. Funzione di appartenenza trapezoidale.
  11. Funzione di appartenenza triangolare.
  12. Funzione di appartenenza sotto forma di una costante.
  13. Funzione di appartenenza come composizione 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:
  1. LinearSugenoFuction - classe per la creazione di funzioni lineari.
  2. SugenoVariable - classe per la creazione di una variabile fuzzy di tipo Sugeno.

Le varibili fuzzy di tipo Sugeno vengono utilizzate quando sviluppiamo regole per un sistema di tipo Sugeno.

 

Utilizzo della libreria FuzzyNet in MQL5

Prima di scrivere un sistema fuzzy, dovresti avere una chiara visione dei suoi elementi, incluso:

  1. Numero dei valori di input e output da riordinare per variabili fuzzy.
  2. Numero di termini e le loro funzioni di appartenenza per ogni variabile fuzzy.
  3. Il tipo di sistema fuzzy a seconda dell'attività.
  4. Numero e contenuto delle regole fuzzy corrispondenti al sistema selezionato.
  5. Parametri e caratteristiche specifiche del sistema.

Sviluppo e calcolo del sistema:

  1. 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();
  2. 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);
  3. 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());
  4. Inserisce le variabili di input al sistema:
    fuzzy_system.Input().Add(FuzzyVariable fuzzy_variable);
  5. Creare le variabili di input prestando attenzione al tipo del tuo sistema. Per un sistema di tipo Mamdani, la creazione è simile ai passi 2 e3 . 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[]));
  6. 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);
  7. 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);
  8. 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);
  9. 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);
  10. Devono essere specificati anche i valori di output:
    Dictionary_Obj_Double *p_od_out=new Dictionary_Obj_Double;   
    CList *out=new CList;
  11. 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.mq5 calcola la percentuale di mancia che devi pagare in base alla qualità del servizio e del cibo.

Inserisci i parametri di ingresso:

Parametri d'ingresso

Risultati del calcolo:

Risultati del calcolo

Cruise Control Sample (Sugeno)

Lo script di esempio Cruise_Control_Sample_Sugeno.mq5 è 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:

Parametri d'ingresso

Risultati del calcolo:

Risultati del calcolo

Tradotto dal russo da MetaQuotes Ltd.
Codice originale https://www.mql5.com/ru/code/13697

Pubblicazione automatica con WebRequest() Pubblicazione automatica con WebRequest()

Un esempio della pubblicazione di un messaggio contenente un'immagine sul sito web MQL5.com utilizzando la funzione WebRequest(). Questo è un esempio di come autorizzare utilizzando login e password, e inserire un'immagine in un messaggio di testo

QuotesDemo QuotesDemo

Esempio di ricezione delle quote degli indici mondiali da Google Finance.

RegularExpressions in MQL5 per lavorare con le espressioni regolari RegularExpressions in MQL5 per lavorare con le espressioni regolari

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.

Grafico Navigazione Demo Grafico Navigazione Demo

Script semplice con dimostrazione dell'utilizzo della funzione ChartNavigate().