私たちのファンページに参加してください
FuzzyNetファジー論理ライブラリ - MetaTrader 5のためのライブラリ
- 発行者:
- MetaQuotes
- ビュー:
- 1981
- 評価:
- パブリッシュ済み:
- 2016.10.11 14:05
- アップデート済み:
- 2017.05.19 18:20
- このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動
アーカイブをterminal_data_folderに解凍します。
ライブラリコードは <terminal_data_folder>\MQL5\Include\Math\FuzzyNet\に配置されます。
テストスクリプトの例は <terminal_data_folder>\MQL5\Scripts\FuzzyNet\にあります。
FuzzyNetは最も人気のあるファジィモデル開発のための数学ライブラリの1つです。
Fuzzy Logic Library for Microsoft.Net(FuzzyNet)はマムダニ及び菅野ファジィ推論法を実装する簡単に使用できるコンポーネントです。
FuzzyNetは下記を含みます。
ライブラリをMQL5に変換する際には下記が追加されました。
- 8つの新しいメンバーシップ関数
- マムダニシステムの4つの非ファジィ化メソッド
ライブラリの使用
- タスクに応じて、空のマムダニまたは菅野ファジシステムを作成します。
- ファジィ入力変数及び出力変数を作成します。
- 各ファジィ変数には適切な項が追加されます。その前に、名前とメンバーシップ関数が項に与えられます。
- システムに変数が追加されます。
- 一式のルールが作成されます。
- システムにルールが追加されます。
- システムに入力データが送られます。
- システム計算関数が呼ばれます。
注意事項:マムダニ推論システムは、作成の後からシステムの計算関数が呼び出される前までの任意の段階で設定することができます。システム設定が作成後に変更されない場合、システムはデフォルトの設定で動作します。
- インプリケーションはMin演算子で実行されます(出力ファジィ集合は切り捨てられます)。
- 集合はMax演算子で実行されます(インプリケーションの後で得られた出力メンバーシップ関数の最大値が受け取られます)。
- 非ファジィ化は、重心法を用いて行われます。
下記にはFuzzyNetライブラリ(v. 1.2.0)の変換が示されています。
ライブラリを使うには、作成しているシステムに応じてMamdaniFuzzySystem.mqhまたはSugenoFuzzySystem.mqh ファイルをインクルードします。
変換されたFuzzyNetライブラリパッケージについてのより詳細な情報は以下にあります。パッケージ |
説明 |
---|---|
Dictionary.mqh |
このパッケージには他のパッケージのために必要な追加的なクラスが含まれています。 |
FuzzyRule.mqh |
ファジィルールを作成するためのクラス:
パッケージにはまた、ファジィルールを実装するための補助クラスが含まれています。 |
FuzzyTerm.mqh | ファジィ項を作成するためのパッケージ。 |
FuzzyVariable.mqh | ファジィ変数を作成するためのパッケージ。 |
GenericFuzzySystem.mqh | クラスはマムダニ及び菅野システムのための共通関数を実装しています。 |
Helper.mqh | このパッケージには他のパッケージのために必要な追加的なクラスが含まれています。 |
InferenceMethod.mqh | このパッケージには他のパッケージのために必要な追加的なクラスが含まれています。 |
MamdaniFuzzySystem.mqh | マムダニファジィシステムを作成するためのクラス |
MembershipFunction.mqh | メンバーシップ関数のためのクラス:
|
RuleParser.mqh | ファジィルールを解析するためのクラス。 |
SugenoFuzzySystem.mqh | 菅野ファジィシステムを作成するためのクラス。 |
SugenoVariable.mqh | このパッケージには下記のクラスが含まれています。
菅野型のファジィ変数は菅野システムのルールを開発する際に使用されています。 |
MQL5でのFuzzyNetライブラリの使用
ファジィシステムを作成する前には、下記のようなその要素の明確なビジョンを持つことが必要です。
- ファジー変数によって再配置される入力/出力値の数
- 各ファジィ変数のための項とそのメンバーシップ関数の数
- タスクに応じたファジィシステムのタイプ
- 選択されたシステムに対応するファジィルールの数および内容
- 特定のパラメータおよびシステムの特徴
システム開発と計算は下記のとおりです。
- 空のシステムを作成します。
マムダニシステムでは:
MamdaniFuzzySystem *fuzzy_system=new MamdaniFuzzySystem();
菅野システムでは:
SugenoFuzzySystem *fuzzy_system=new SugenoFuzzySystem();
- すべての変数へパラメータとして名と最大/最小値を割り当てることにより、システムとは別にすべてのファジィ入力変数を作成します。
FuzzyVariable *fuzzy_variable=new FuzzyVariable(const string name,const double min,const double max);
- ファジィ項の関数を作成、ファジィ項自体を作成し、それらに適切な名前とメンバーシップ関数を渡します。その後、対応する変数に項を追加します。この工程はプログラムコードを減らすために次のように書くことができます。
fuzzy_variable.Terms().Add(new FuzzyTerm(const string name,new IMembershipFunction());
- システムへ入力変数を追加します。
fuzzy_system.Input().Add(FuzzyVariable fuzzy_variable);
- システムの種類に注意を払って入力変数を作成します。マムダニシステムでの作成はステップ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[]));
- ステップ4と同様に、出力変数もシステムに追加されるべきです。
マムダニシステムでは:
fuzzy_system.Output().Add(FuzzyVariable fuzzy_variable);
菅野システムでは:
fuzzy_system.Output().Add(FuzzyVariable fuzzy_variable);
- システムに応じた一連のルールを配置します。ルールは一般的な文字列として定義され、自動的にキーワードに基づいて分析されます。「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);
- システムにすべてのルールを加えます。
マムダニシステムでは:
fuzzy_system.Rules().Add(MamdaniFuzzyRule fuzzy_rule);
菅野システムでは:
fuzzy_system.Rules().Add(SugenoFuzzyRule fuzzy_rule);
- 計算のためにシステムに変数の入力値を渡します。これを行うには、それらが定義される必要があります。その入力で、システムは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);
- 出力値も同様に指定する必要があります。
Dictionary_Obj_Double *p_od_out=new Dictionary_Obj_Double; CList *out=new CList;
- 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/13697
この指標は、MACD指標上に発散ラインをプロットし、緑と赤の矢印として売買シグナルを与えます。
ChartChangerこのスクリプトは、円内でのチャートを迅速に変えるためのホットキーに割り当てられています。