無料でロボットをダウンロードする方法を見る
Facebook上で私たちを見つけてください。
私たちのファンページに参加してください
興味深いスクリプト?
それではリンクにそれを投稿してください。-
他の人にそれを評価してもらいます
記事を気に入りましたか?MetaTrader 5ターミナルの中でそれを試してみてください。
ライブラリ

ファジィ - ファジィモデル開発のためのライブラリ - MetaTrader 4のためのライブラリ

発行者:
MetaQuotes
ビュー:
1381
評価:
(51)
パブリッシュ済み:
2016.10.11 14:14
アップデート済み:
2016.11.22 07:34
このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動

実際の著者

Dmitry Kalyuzhny. FuzzyNetプロジェクトホームページ - http://sourceforge.net/projects/fuzzynet/

アーカイブをterminal_data_folderに解凍します。
ライブラリのコードは <terminal_data_folder>\MQL4\Include\Math\FuzzyNet\
に位置します。テストスクリプトの例は <terminal_data_folder>\MQL4\Scripts\FuzzyNet\
です。

FuzzyNetは最も人気のあるファジィモデル開発のための数学ライブラリの1つです。

Fuzzy Logic Library for Microsoft.Net(FuzzyNet)はマムダニ及び菅野ファジィ推論法を実装する簡単に使用できるコンポーネントです。

FuzzyNetは下記を含みます。

ライブラリをMQL4に変換する際には下記が追加されました。

  • 8つの新しいメンバーシップ関数
  • マムダニシステムの4つの非ファジィ化メソッド

ライブラリの使用

  1. タスクに応じて、空のマムダニまたは菅野ファジシステムを作成します。
  2. ファジィ入力変数及び出力変数を作成します。
  3. 各ファジィ変数には適切な項が追加されます。その前に、名前とメンバーシップ関数が項に与えられます。
  4. システムに変数が追加されます。
  5. 一式のルールが作成されます。
  6. システムにルールが追加されます。
  7. システムに入力データが送られます。
  8. システム計算関数が呼ばれます。

注意事項:マムダニ推論システムは、作成の後からシステムの計算関数が呼び出される前までの任意の段階で設定することができます。システム設定が作成後に変更されない場合、システムはデフォルトの設定で動作します。

  • インプリケーションMin演算子で実行されます(出力ファジィ集合は切り捨てられます)。
  • 集合Max演算子で実行されます(インプリケーションの後で得られた出力メンバーシップ関数の最大値が受け取られます)。
  • 非ファジィ化は、重心法を用いて行われます。

下記にはFuzzyNetライブラリ(v. 1.2.0)の変換が示されています。

ライブラリを使うには、作成しているシステムに応じてMamdaniFuzzySystem.mqhまたはSugenoFuzzySystem.mqh ファイルをインクルードします。

変換されたFuzzyNetライブラリパッケージについてのより詳細な情報は以下にあります。
パッケージ
説明
Dictionary.mqh
このパッケージには他のパッケージのために必要な追加的なクラスが含まれています。
FuzzyRule.mqh
ファジィルールを作成するためのクラスです。
  1. GenericFuzzyRule - 非ファジィルールの条件を作成するためのクラス
  2. MamdaniFuzzyRule - マムダニ型のファジィルールの結論を作成するためのクラス
  3. SugenoFuzzyRule - 菅野型のファジィルールの結論を作成するためのクラス

パッケージにはまた、ファジィルールを実装するための補助クラスが含まれています。

FuzzyTerm.mqh ファジィ項を作成するためのパッケージ。
FuzzyVariable.mqh ファジィ変数を作成するためのパッケージ。
GenericFuzzySystem.mqh クラスはマムダニ及び菅野システムのための共通関数を実装しています。
Helper.mqh このパッケージには他のパッケージのために必要な追加的なクラスが含まれています。
InferenceMethod.mqh このパッケージには他のパッケージのために必要な追加的なクラスが含まれています。
MamdaniFuzzySystem.mqh マムダニファジィシステムを作成するためのクラス
MembershipFunction.mqh メンバーシップ関数のためのクラスです。
  1. ガウスメンバーシップ関数
  2. 両側ガウスメンバーシップ関数
  3. 一般ベル型メンバーシップ関数
  4. S字形メンバーシップ関数
  5. Z字形メンバーシップ関数
  6. Pi形メンバーシップ関数
  7. シグモイドメンバーシップ関数
  8. 2シグモイドメンバーシップ関数の積
  9. 2シグモイド関数の差の形でのメンバーシップ関数
  10. 台形メンバーシップ関数
  11. 三角形メンバーシップ関数
  12. 定数の形でのメンバーシップ関数
  13. メンバーシップ関数の組成物としてのメンバーシップ関数
RuleParser.mqh ファジィルールを解析するためのクラス。
SugenoFuzzySystem.mqh 菅野ファジィシステムを作成するためのクラス。
SugenoVariable.mqh このパッケージには下記のクラスが含まれています。
  1. LinearSugenoFuction - 線形関数を作成するためのクラス
  2. SugenoVariable - 菅野ファジィ変数を作成するためのクラス

菅野型のファジィ変数は菅野システムのルールを開発する際に使用されています。

 

MQL4でのFuzzyNetライブラリの使用

ファジィシステムを作成する前には、下記のようなその要素の明確なビジョンを持つことが必要です。

  1. ファジー変数によって再配置される入力/出力値の数
  2. 各ファジィ変数のための項とそのメンバーシップ関数の数
  3. タスクに応じたファジィシステムのタイプ
  4. 選択されたシステムに対応するファジィルールの数および内容
  5. 特定のパラメータおよびシステムの特徴

システム開発と計算は下記のとおりです。

  1. 空のシステムを作成します。

    マムダニシステムでは:

    MamdaniFuzzySystem *fuzzy_system=new MamdaniFuzzySystem();
    菅野システムでは:
    SugenoFuzzySystem *fuzzy_system=new SugenoFuzzySystem();
  2. すべての変数へパラメータとして名と最大/最小値を割り当てることにより、システムとは別にすべてのファジィ入力変数を作成します。
    FuzzyVariable *fuzzy_variable=new FuzzyVariable(const string name,const double min,const double max);
  3. ファジィ項の関数を作成、ファジィ項自体を作成し、それらに適切な名前とメンバーシップ関数を渡します。その後、対応する変数に項を追加します。この工程はプログラムコードを減らすために次のように書くことができます。
    fuzzy_variable.Terms().Add(new FuzzyTerm(const string name,new IMembershipFunction());
  4. システムへ入力変数を追加します。
    fuzzy_system.Input().Add(FuzzyVariable fuzzy_variable);
  5. システムの種類に注意を払って入力変数を作成します。マムダニシステムでの作成はステップ2と3に似ています。菅野モデルでは、パラメータとして変数名だけを受け入れる特別なファジィ変数を作成します。
    SugenoVariable *sugeno_variable=new SugenoVariable(const string name);
    入力値の線形結合を解釈する線形関数はファジー項の代わりに菅野型のファジィ変数に追加されます。名前と係数配列は線形関数のパラメータとして使用されます。線形方程式はその配列に基づいて形成され、従って、配列内の要素の順序を遵守することが重要です。係数配列の長さは入力値の量と同じまたは1つ多い必要があります。長さが等しい場合、式の絶対的な項はゼロに等しいです。配列の長さが1つの量を超えた場合、絶対的な項は最後の要素の値に等しいです。最初の要素から始まる他のすべての配列要素は、それらがシステムに追加された順にファジィ入力変数に割り当てられます。
    sugeno_varriable.Functions().Add(fuzzy_sytem.CreateSugenoFunction(const string name, const double &coeffs[]));
  6. ステップ4と同様に、出力変数もシステムに追加されるべきです。

    マムダニシステムでは:

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

    菅野システムでは:

    fuzzy_system.Output().Add(FuzzyVariable fuzzy_variable);
  7. システムに応じた一連のルールを配置します。ルールは一般的な文字列として定義され、自動的にキーワードに基づいて分析されます。「if」「then」「is」「and」「or」「not」「(」「)」「slightly」「somewhat」「very」「extremely」に加えてシステム内の変数、項や利用可能な関数のすべての名前はキーワードとなります。

    マムダニシステムでは:

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

    菅野システムでは:

    SugenoFuzzyRule *fuzzy_rule = fuzzy_system.ParseRule(const string rule_text);
  8. システムにすべてのルールを加えます。

    マムダニシステムでは:

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

    菅野システムでは:

    fuzzy_system.Rules().Add(SugenoFuzzyRule fuzzy_rule);
  9. 計算のためにシステムに変数の入力値を渡します。これを行うには、それらが定義される必要があります。その入力で、システムはDictionary_Obj_Doubleクラスオブジェクトを含む値のリストを受け付けます。このクラスはDictionary.mqhファイルに記述されています。
    Dictionary_Obj_Double *p_od_in=new Dictionary_Obj_Double;
    クラスは、ファジィ変数と数値の2つのパラメータを受け取るSetAll(CObject *key, const double value) メソッドを実装します。この要素はシステムの入力変数です。
    p_od_in.SetAll(FuzzyVariable fuzzy_variable,const double value);
    他のすべての入力値が同じように書き込まれます。リストを作成し、そこにすべての値を追加します。
    CList *in=new CList;
    in.Add(p_od_in);
    
  10. 出力値も同様に指定する必要があります。
    Dictionary_Obj_Double *p_od_out=new Dictionary_Obj_Double;   
    CList *out=new CList;
    
  11. Calculate(CList *&list) 関数を呼び出してシステムの計算結果のリストを返します。
    out=fuzzy_system.Calculate(in);
    その後でoutリストにはすべての計算された出力値がシステムに追加された順番に格納されています。やることはそれらを受信するだけです。
    p_od_out=out.GetNodeAtIndex(int index);
    double result=p_od_out.Value();
    
    ここでresult変数には indexで指定された数でシステムに追加された出力値のシステム計算結果を格納されています。

スクリプトの例

チップ例(マムダニ)

Tips_Sample_Mamdani.mq5 は、サービスと食品の品質に応じて、払われるチップの割合を計算します。

入力パラメータを入力します。


計算結果:


クルーズコントロールの例(菅野)

Cruise_Control_Sample_Sugeno.mq5 スクリプトはファジーレギュレータの一例です。これは、現在の偏差及び変化の偏差率のデータを用いて、所望の速度に到達するために、必要な加速度を算出するオートクルーズを表します。

入力パラメータを入力します。


計算結果:


MetaQuotes Ltdによってロシア語から翻訳されました。
元のコード: https://www.mql5.com/ru/code/13717

Awesome Oscillator - 4 colors, customizable Awesome Oscillator - 4 colors, customizable

Awesome Oscillator, customizable, 4 colors (as seen on some AIMS YouTube videos), and some more parameters.

Var Mov Avg 2016 (varmov) Var Mov Avg 2016 (varmov)

This indicator is based on the moving average, but it doesn't use any standard moving average indicators.

Example of OnChartEvent() Function Example of OnChartEvent() Function

This is a great beginners' example of the function OnChartEvent() & creating objects on the chart to access them for some tasks.

Inside Bar Inside Bar

Indicator detects the Inside Bars and marks them high/low (no redraw).