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

 

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

ファジィモデル開発のためのFuzzyNetライブラリはC#で書かれました。MQL5への変換中にライブラリには8つのメンバーシップ関数と4つのマムダニシステムの非ファジィ化メソッドが追加されました。

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

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

入力パラメータ

作者: MetaQuotes Software Corp.

 

1.これがMT5で利用できるようになったのは素晴らしいことです。数学はアフリカの数学であり、MT4で動作するということを正しく理解していますか?

2.私は最初にMatlabでFuzziを試しましたが、正直なところ、それはずっと前のことで、利益を保証するFX取引に適用する方法を本当に理解していませんでした。その結果、ウェーブレットや統計学などの方向に進みました。

3.ファジィロジックを実際に応用するための文献を教えてください。トレードでなくても。

4.このトピックに興味があるのですが、このサイトにこのトピックに関する記事は必要でしょうか?

 
Alexey Volchanskiy:

1.これがMT5で利用できるようになったのは素晴らしいことです。mathsはアフリカの数学であり、MT4でも機能するということを正しく理解していますか?

2.私は最初にMatlabでFuzziを試しましたが、正直なところ、それはずっと前のことで、利益を保証するFX取引に適用する方法を本当に理解していませんでした。その結果、ウェーブレットや統計学などの方向に進みました。

3.ファジィロジックを実際に応用するための文献を教えてください。トレードでなくても。

4.このトピックに興味があるのですが、サイトにはこのトピックに関する記事が必要でしょうか?

こんにちは。

1.私たちは、MT4のための適応を作るでしょう(少し後)。

3.4.FuzzyNetの使用に関する記事を近々公開する予定です。その後、サービスデスクに このトピックをより具体的に議論するように書いて ください。

 

このテーマは注目に値する。その応用には、そのテーマを理解する必要がある。そして、この観点からすると、先端の例は深刻ではない。マムダニシステムとスゲノシステムの違いは、少なくとも一応説明されるべきである。また、ファジィ論理の基本的な概念は、そのような概念を初めて耳にする人にとって有用であろう。

アーカイブのどこかにロシア語のファジィ 論理の本がある(ファジィ論理 システムのプログラムの説明)。だから、アーカイブ内のストロークで見つけることができません。後で私はそれを投稿します。

幸運

 
基本的な知識を持つ数少ない情報源。
ファイル:
FuzLog.zip  1062 kb
 

こんにちは、

Fuzzy、SVM、Neuralのようなシステムが好きなので、いろいろ見ていたら、このライブラリを見つけたので、試してみました。含まれているスクリプトは十分に理解できるのですが、コンパイル時のエラーが少ないのが気になります - sugenoを使ったスクリプトcruise_control_sample_sugeno.mq5では:

//+------------------------------------------------------------------+
//|ファジーネットmqh
//| Copyright 2015, MetaQuotes Software Corp.|
//|https://www.mql5.com
//+------------------------------------------------------------------+
//| MetaQuotes言語5(MQL5)でのFuzzyNetライブラリの実装。
//||
//| FuzzyNetライブラリの特徴は以下の通り。
| - マムダニ・ファジィ・モデルの作成|
//| スゲノファジィモデルの作成|
//| 正規メンバーシップ関数|
//| 三角メンバーシップ関数|
//| 台形メンバーシップ関数|
//| メンバーシップ関数|
//| - Defuzzification method of center of gravity (COG) |
//| 面積の2等分線(BOA)によるデファジー法
//| 最大値平均(MeOM)によるデファジー法
//||
//| MQL5用FuzzyNetとMQL5用FuzzyNetの機能的な違いを見つけてください。
//| およびオリジナルのFuzzyNetプロジェクトについては、開発者にお問い合わせください。
//| www.mql5.com。|
//||
//| の計算アルゴリズムで見つかったバグを報告することができる。
//| FuzzyNetプロジェクト・コーディネーターに通知してください。
//+------------------------------------------------------------------+
//| ソースライセンス|
//||
//| このプログラムはフリーソフトウェアです。
//| GNU一般公衆利用許諾契約書(GNU General Public License)の条項の下で、以下のように変更してください。
//| フリーソフトウェアファウンデーション(www.fsf.org) が発行。
|ライセンスのバージョン2、あるいは(あなたの選択で)それ以降のバージョン。|
//||
//| このプログラムが役に立つことを願って配布しています。
//| しかし、いかなる保証もない。
//| 商品性または特定目的適合性。を参照してください。
//| 詳細はGNU General Public Licenseを参照のこと。
//||
//| GNU一般公衆利用許諾契約書のコピーは|にあります。
//| http://www.fsf.org/licensing/licenses                            |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs
//+------------------------------------------------------------------+
//| ライブラリの接続|
//+------------------------------------------------------------------+
#include <Math\FuzzyNet\SugenoFuzzySystem.mqh>
//--- 入力パラメータ
input double   Speed_Error;
input double   Speed_ErrorDot;
//+------------------------------------------------------------------+
//| スクリプト・プログラム開始機能|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- スゲノファジィシステム
   CSugenoFuzzySystem *fsCruiseControl=new CSugenoFuzzySystem();
//--- システムの最初の入力変数を作成する
   CFuzzyVariable *fvSpeedError=new CFuzzyVariable("SpeedError",-20.0,20.0);
   fvSpeedError.Terms().Add(new CFuzzyTerm("slower",new CTriangularMembershipFunction(-35.0,-20.0,-5.0)));
   fvSpeedError.Terms().Add(new CFuzzyTerm("zero", new CTriangularMembershipFunction(-15.0, -0.0, 15.0)));
   fvSpeedError.Terms().Add(new CFuzzyTerm("faster", new CTriangularMembershipFunction(5.0, 20.0, 35.0)));
   fsCruiseControl.Input().Add(fvSpeedError);
//--- システムの2番目の入力変数を作成する
   CFuzzyVariable *fvSpeedErrorDot=new CFuzzyVariable("SpeedErrorDot",-5.0,5.0);
   fvSpeedErrorDot.Terms().Add(new CFuzzyTerm("slower", new CTriangularMembershipFunction(-9.0, -5.0, -1.0)));
   fvSpeedErrorDot.Terms().Add(new CFuzzyTerm("zero", new CTriangularMembershipFunction(-4.0, -0.0, 4.0)));
   fvSpeedErrorDot.Terms().Add(new CFuzzyTerm("faster", new CTriangularMembershipFunction(1.0, 5.0, 9.0)));
   fsCruiseControl.Input().Add(fvSpeedErrorDot);
//--- 出力の作成
   CSugenoVariable *svAccelerate=new CSugenoVariable("Accelerate");
   double coeff1[3]={0.0,0.0,0.0};
   svAccelerate.Functions().Add(fsCruiseControl.CreateSugenoFunction("zero",coeff1));
   double coeff2[3]={0.0,0.0,1.0};
   svAccelerate.Functions().Add(fsCruiseControl.CreateSugenoFunction("faster",coeff2));
   double coeff3[3]={0.0,0.0,-1.0};
   svAccelerate.Functions().Add(fsCruiseControl.CreateSugenoFunction("slower",coeff3));
   double coeff4[3]={-0.04,-0.1,0.0};
   svAccelerate.Functions().Add(fsCruiseControl.CreateSugenoFunction("func",coeff4));
   fsCruiseControl.Output().Add(svAccelerate);
//--- クレイテ・スゲノ・ファジィ・ルール
   CSugenoFuzzyRule *rule1 = fsCruiseControl.ParseRule("if (SpeedError is slower) and (SpeedErrorDot is slower) then (Accelerate is faster)");
   CSugenoFuzzyRule *rule2 = fsCruiseControl.ParseRule("if (SpeedError is slower) and (SpeedErrorDot is zero) then (Accelerate is faster)");
   CSugenoFuzzyRule *rule3 = fsCruiseControl.ParseRule("if (SpeedError is slower) and (SpeedErrorDot is faster) then (Accelerate is zero)");
   CSugenoFuzzyRule *rule4 = fsCruiseControl.ParseRule("if (SpeedError is zero) and (SpeedErrorDot is slower) then (Accelerate is faster)");
   CSugenoFuzzyRule *rule5 = fsCruiseControl.ParseRule("if (SpeedError is zero) and (SpeedErrorDot is zero) then (Accelerate is func)");
   CSugenoFuzzyRule *rule6 = fsCruiseControl.ParseRule("if (SpeedError is zero) and (SpeedErrorDot is faster) then (Accelerate is slower)");
   CSugenoFuzzyRule *rule7 = fsCruiseControl.ParseRule("if (SpeedError is faster) and (SpeedErrorDot is slower) then (Accelerate is faster)");
   CSugenoFuzzyRule *rule8 = fsCruiseControl.ParseRule("if (SpeedError is faster) and (SpeedErrorDot is zero) then (Accelerate is slower)");
   CSugenoFuzzyRule *rule9 = fsCruiseControl.ParseRule("if (SpeedError is faster) and (SpeedErrorDot is faster) then (Accelerate is slower)");
//--- システムにSugenoファジィルールを追加する。
   fsCruiseControl.Rules().Add(rule1);
   fsCruiseControl.Rules().Add(rule2);
   fsCruiseControl.Rules().Add(rule3);
   fsCruiseControl.Rules().Add(rule4);
   fsCruiseControl.Rules().Add(rule5);
   fsCruiseControl.Rules().Add(rule6);
   fsCruiseControl.Rules().Add(rule7);
   fsCruiseControl.Rules().Add(rule8);
   fsCruiseControl.Rules().Add(rule9);
//--- 入力値を設定し、結果を得る
   CList *in=new CList;
   CDictionary_Obj_Double *p_od_Error=new CDictionary_Obj_Double;
   CDictionary_Obj_Double *p_od_ErrorDot=new CDictionary_Obj_Double;
   p_od_Error.SetAll(fvSpeedError,Speed_Error);
   p_od_ErrorDot.SetAll(fvSpeedErrorDot,Speed_ErrorDot);
   in.Add(p_od_Error);
   in.Add(p_od_ErrorDot);
//--- 結果を得る
   CList *result;
   CDictionary_Obj_Double *p_od_Accelerate;
   result=fsCruiseControl.Calculate(in);
   p_od_Accelerate=result.GetNodeAtIndex(0);
   Alert("Accelerate, %: ",p_od_Accelerate.Value()*100);
   delete in;
   delete result;
   delete fsCruiseControl;
  }
//+------------------------------------------------------------------+

そして、マムダニとのスクリプトは :

//+------------------------------------------------------------------+
//|ファジーネットmqh
//| Copyright 2015, MetaQuotes Software Corp.|
//|https://www.mql5.com
//+------------------------------------------------------------------+
//| MetaQuotes言語5(MQL5)でのFuzzyNetライブラリの実装。
//||
//| FuzzyNetライブラリの特徴は以下の通り。
| - マムダニ・ファジィ・モデルの作成|
//| スゲノファジィモデルの作成|
//| 正規メンバーシップ関数|
//| 三角メンバーシップ関数|
//| 台形メンバーシップ関数|
//| メンバーシップ関数|
//| - Defuzzification method of center of gravity (COG) |
//| 面積の2等分線(BOA)によるデファジー法
//| 最大値平均(MeOM)によるデファジー法
//||
//| MQL5用FuzzyNetとMQL5用FuzzyNetの機能的な違いを見つけてください。
//| およびオリジナルのFuzzyNetプロジェクトについては、開発者にお問い合わせください。
//| www.mql5.com。|
//||
//| の計算アルゴリズムで見つかったバグを報告することができる。
//| FuzzyNetプロジェクト・コーディネーターに通知してください。
//+------------------------------------------------------------------+
//| ソースライセンス|
//||
//| このプログラムはフリーソフトウェアです。
//| GNU一般公衆利用許諾契約書(GNU General Public License)の条項の下で、以下のように変更してください。
//| フリーソフトウェアファウンデーション(www.fsf.org) が発行。
|ライセンスのバージョン2、あるいは(あなたの選択で)それ以降のバージョン。|
//||
//| このプログラムが役に立つことを願って配布しています。
//| しかし、いかなる保証もない。
//| 商品性または特定目的適合性。を参照してください。
//| 詳細はGNU General Public Licenseを参照のこと。
//||
//| GNU一般公衆利用許諾契約書のコピーは|にあります。
//| http://www.fsf.org/licensing/licenses&nbsp;                           |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs
//+------------------------------------------------------------------+
//| ライブラリの接続|
//+------------------------------------------------------------------+
#include <Math\FuzzyNet\MamdaniFuzzySystem.mqh>
//--- 入力パラメータ
input double   Service;
input double   Food;
//+------------------------------------------------------------------+
//| スクリプト・プログラム開始機能|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- マムダニ・ファジィ・システム
   CMamdaniFuzzySystem *fsTips=new CMamdaniFuzzySystem();
//--- システムの最初の入力変数を作成する
   CFuzzyVariable *fvService=new CFuzzyVariable("service",0.0,10.0);
   fvService.Terms().Add(new CFuzzyTerm("poor", new CTriangularMembershipFunction(-5.0, 0.0, 5.0)));
   fvService.Terms().Add(new CFuzzyTerm("good", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   fvService.Terms().Add(new CFuzzyTerm("excellent", new CTriangularMembershipFunction(5.0, 10.0, 15.0)));
   fsTips.Input().Add(fvService);
//--- システムの2番目の入力変数を作成する
   CFuzzyVariable *fvFood=new CFuzzyVariable("food",0.0,10.0);
   fvFood.Terms().Add(new CFuzzyTerm("rancid", new CTrapezoidMembershipFunction(0.0, 0.0, 1.0, 3.0)));
   fvFood.Terms().Add(new CFuzzyTerm("delicious", new CTrapezoidMembershipFunction(7.0, 9.0, 10.0, 10.0)));
   fsTips.Input().Add(fvFood);
//--- 出力の作成
   CFuzzyVariable *fvTips=new CFuzzyVariable("tips",0.0,30.0);
   fvTips.Terms().Add(new CFuzzyTerm("cheap", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   fvTips.Terms().Add(new CFuzzyTerm("average", new CTriangularMembershipFunction(10.0, 15.0, 20.0)));
   fvTips.Terms().Add(new CFuzzyTerm("generous", new CTriangularMembershipFunction(20.0, 25.0, 30.0)));
   fsTips.Output().Add(fvTips);
//--- 3つのマムダニ・ファジィ・ルールを作る
   CMamdaniFuzzyRule *rule1 = fsTips.ParseRule("if (service is poor )  or (food is rancid) then tips is cheap");
   CMamdaniFuzzyRule *rule2 = fsTips.ParseRule("if ((service is good)) then tips is average");
   CMamdaniFuzzyRule *rule3 = fsTips.ParseRule("if (service is excellent) or (food is delicious) then (tips is generous)");
//--- システムに3つのマムダニ・ファジィ・ルールを追加する。
   fsTips.Rules().Add(rule1);
   fsTips.Rules().Add(rule2);
   fsTips.Rules().Add(rule3);
//--- 入力値を設定する
   CList *in=new CList;
   CDictionary_Obj_Double *p_od_Service=new CDictionary_Obj_Double;
   CDictionary_Obj_Double *p_od_Food=new CDictionary_Obj_Double;
   p_od_Service.SetAll(fvService, Service);
   p_od_Food.SetAll(fvFood, Food);
   in.Add(p_od_Service);
   in.Add(p_od_Food);
//--- 結果を得る
   CList *result;
   CDictionary_Obj_Double *p_od_Tips;
   result=fsTips.Calculate(in);
   p_od_Tips=result.GetNodeAtIndex(0);
   Alert("Tips, %: ",p_od_Tips.Value());
   delete in;
   delete result;
   delete fsTips;
  }
//+------------------------------------------------------------------+

シェアしてくれてありがとう!

 
02以上の入力変数でマンダニ・モデルを作成することは可能ですか?3つ目の入力変数を入力するとエラーになります。
 

リブを応援してくれる人たち、まあ、誰でもいいから助けて......。:)計算を速く したい。添付された例のスクリプトでは、ファジー論理クラスのオブジェクトを作成し、結果を計算して削除しています。オブジェクトを1回だけ作成し、Calculate()で新しい値だけを渡して、すでに設定されているファジーロジックで結果を受け取るようにしたいのです。

これがオリジナルの例で、正しく動作します:

//+------------------------------------------------------------------+
//|ヒントサンプルmq5
//| Copyright 2017, MetaQuotes Software Corp.
//|https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Math\Fuzzy\MamdaniFuzzySystem.mqh>
//--- 入力パラメータ
input double   Service;
input double   Food;

//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
|エキスパート初期化関数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| エキスパート・ティック機能|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  //--- マムダニ・ファジィ・システム 
   CMamdaniFuzzySystem *fsTips=new CMamdaniFuzzySystem();
//--- システムの最初の入力変数を作成する
   CFuzzyVariable *fvService=new CFuzzyVariable("service",0.0,10.0);
   fvService.Terms().Add(new CFuzzyTerm("poor", new CTriangularMembershipFunction(-5.0, 0.0, 5.0)));
   fvService.Terms().Add(new CFuzzyTerm("good", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   fvService.Terms().Add(new CFuzzyTerm("excellent", new CTriangularMembershipFunction(5.0, 10.0, 15.0)));
   fsTips.Input().Add(fvService);
//--- システムの2番目の入力変数を作成する
   CFuzzyVariable *fvFood=new CFuzzyVariable("food",0.0,10.0);
   fvFood.Terms().Add(new CFuzzyTerm("rancid", new CTrapezoidMembershipFunction(0.0, 0.0, 1.0, 3.0)));
   fvFood.Terms().Add(new CFuzzyTerm("delicious", new CTrapezoidMembershipFunction(7.0, 9.0, 10.0, 10.0)));
   fsTips.Input().Add(fvFood);
//--- 出力の作成
   CFuzzyVariable *fvTips=new CFuzzyVariable("tips",0.0,30.0);
   fvTips.Terms().Add(new CFuzzyTerm("cheap", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   fvTips.Terms().Add(new CFuzzyTerm("average", new CTriangularMembershipFunction(10.0, 15.0, 20.0)));
   fvTips.Terms().Add(new CFuzzyTerm("generous", new CTriangularMembershipFunction(20.0, 25.0, 30.0)));
   fsTips.Output().Add(fvTips);
//--- 3つのマムダニ・ファジィ・ルールを作る
   CMamdaniFuzzyRule *rule1 = fsTips.ParseRule("if (service is poor )  or (food is rancid) then tips is cheap");
   CMamdaniFuzzyRule *rule2 = fsTips.ParseRule("if ((service is good)) then tips is average");
   CMamdaniFuzzyRule *rule3 = fsTips.ParseRule("if (service is excellent) or (food is delicious) then (tips is generous)");
//--- システムに3つのマムダニ・ファジィ・ルールを追加する。
   fsTips.Rules().Add(rule1);
   fsTips.Rules().Add(rule2);
   fsTips.Rules().Add(rule3);
//--- 入力値を設定する
   CList *in=new CList;
   CDictionary_Obj_Double *p_od_Service=new CDictionary_Obj_Double;
   CDictionary_Obj_Double *p_od_Food=new CDictionary_Obj_Double;
   p_od_Service.SetAll(fvService, Service);
   p_od_Food.SetAll(fvFood, Food);
   in.Add(p_od_Service);
   in.Add(p_od_Food);
//--- 結果を得る
   CList *result;
   CDictionary_Obj_Double *p_od_Tips;
   result=fsTips.Calculate(in);
   p_od_Tips=result.GetNodeAtIndex(0);
   Print("Tips, %: ",p_od_Tips.Value());
   delete in;
   delete result;
   delete fsTips;
  }
//+------------------------------------------------------------------+

そしてエラーが発生する私の例です:

2017.09.07 14:28:56.949 Core 1  2017.07.03 00:00:00   Input values count is incorrect.
2017.09.07 14:28:56.949 Core 1  2017.07.03 00:00:00   invalid pointer access in 'MamdaniFuzzySystem.mqh' (172,42)

コードそのものです:

//+------------------------------------------------------------------+
//|TipsSample.mq5
//| Copyright 2017, MetaQuotes Software Corp.
//|https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Math\Fuzzy\MamdaniFuzzySystem.mqh>

input double   Service;
input double   Food;
//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
CMamdaniFuzzySystem *fsTips=new CMamdaniFuzzySystem();
CFuzzyVariable *fvService=new CFuzzyVariable("service",0.0,10.0);
CFuzzyVariable *fvFood=new CFuzzyVariable("food",0.0,10.0);
CFuzzyVariable *fvTips=new CFuzzyVariable("tips",0.0,30.0);
CMamdaniFuzzyRule *rule1, *rule2, *rule3;

CList *in=new CList;
CDictionary_Obj_Double *p_od_Service=new CDictionary_Obj_Double;
CDictionary_Obj_Double *p_od_Food=new CDictionary_Obj_Double;

CList *result;
CDictionary_Obj_Double *p_od_Tips;
   
int OnInit()
  {
//---
   
   fvService.Terms().Add(new CFuzzyTerm("poor", new CTriangularMembershipFunction(-5.0, 0.0, 5.0)));
   fvService.Terms().Add(new CFuzzyTerm("good", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   fvService.Terms().Add(new CFuzzyTerm("excellent", new CTriangularMembershipFunction(5.0, 10.0, 15.0)));
   fsTips.Input().Add(fvService);
//--- システムの2番目の入力変数を作成する
   
   fvFood.Terms().Add(new CFuzzyTerm("rancid", new CTrapezoidMembershipFunction(0.0, 0.0, 1.0, 3.0)));
   fvFood.Terms().Add(new CFuzzyTerm("delicious", new CTrapezoidMembershipFunction(7.0, 9.0, 10.0, 10.0)));
   fsTips.Input().Add(fvFood);
//--- 出力の作成
  
   fvTips.Terms().Add(new CFuzzyTerm("cheap", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   fvTips.Terms().Add(new CFuzzyTerm("average", new CTriangularMembershipFunction(10.0, 15.0, 20.0)));
   fvTips.Terms().Add(new CFuzzyTerm("generous", new CTriangularMembershipFunction(20.0, 25.0, 30.0)));
   fsTips.Output().Add(fvTips);
//--- 3つのマムダニ・ファジィ・ルールを作る
   rule1 = fsTips.ParseRule("if (service is poor )  or (food is rancid) then tips is cheap");
   rule2 = fsTips.ParseRule("if ((service is good)) then tips is average");
   rule3 = fsTips.ParseRule("if (service is excellent) or (food is delicious) then (tips is generous)");
   
   fsTips.Rules().Add(rule1);
   fsTips.Rules().Add(rule2);
   fsTips.Rules().Add(rule3);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
|エキスパート初期化関数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| エキスパート・ティック機能|
//+------------------------------------------------------------------+
void OnTick()
  { 
   int ir; 
   for(ir=1; ir<10; ir++)
   { 
   p_od_Service.SetAll(fvService, ir);
   p_od_Food.SetAll(fvFood, ir);
   Print(CheckPointer(in));
   in.Clear();
   in.Add(p_od_Service);
   in.Add(p_od_Food);
//--- 結果を得る
   
   result=fsTips.Calculate(in);
   Print("Error");
   p_od_Tips=result.GetNodeAtIndex(0);
   Print("Tips, %: ",p_od_Tips.Value());
   }
  }
//+------------------------------------------------------------------+

一般的に、このlibはオブジェクトを作成し、例えば新しいバーごとに結果を取得できるように設計されているのでしょうか?なぜなら、毎回ロジックを作り直すのは時間がかかるし、経済的ではないからです。

 

ファジー・ロジック・オブジェクトを1回だけ作成し、Calculate()を呼び出すことができるようになりました。

例を確認してください:

//+------------------------------------------------------------------+
//|TipsSample.mq5
//| Copyright 2017, MetaQuotes Software Corp.
//|https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Math\Fuzzy\MamdaniFuzzySystem.mqh>

input double   Service;
input double   Food;
//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
CMamdaniFuzzySystem *FSTips=new CMamdaniFuzzySystem();
CFuzzyVariable *FVService=new CFuzzyVariable("service",0.0,10.0);
CFuzzyVariable *FVFood=new CFuzzyVariable("food",0.0,10.0);
CFuzzyVariable *FVTips=new CFuzzyVariable("tips",0.0,30.0);
CMamdaniFuzzyRule *Rule1,*Rule2,*Rule3;

CList *In=new CList;
CDictionary_Obj_Double *Dic_Service=new CDictionary_Obj_Double;
CDictionary_Obj_Double *Dic_Food=new CDictionary_Obj_Double;
CDictionary_Obj_Double *Dic_Tips;
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int OnInit()
  {
   In.FreeMode(false);
//--- システムの最初の入力変数を作成する

   FVService.Terms().Add(new CFuzzyTerm("poor", new CTriangularMembershipFunction(-5.0, 0.0, 5.0)));
   FVService.Terms().Add(new CFuzzyTerm("good", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   FVService.Terms().Add(new CFuzzyTerm("excellent", new CTriangularMembershipFunction(5.0, 10.0, 15.0)));
   FSTips.Input().Add(FVService);
//--- システムの2番目の入力変数を作成する

   FVFood.Terms().Add(new CFuzzyTerm("rancid", new CTrapezoidMembershipFunction(0.0, 0.0, 1.0, 3.0)));
   FVFood.Terms().Add(new CFuzzyTerm("delicious", new CTrapezoidMembershipFunction(7.0, 9.0, 10.0, 10.0)));
   FSTips.Input().Add(FVFood);
//--- 出力の作成

   FVTips.Terms().Add(new CFuzzyTerm("cheap", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   FVTips.Terms().Add(new CFuzzyTerm("average", new CTriangularMembershipFunction(10.0, 15.0, 20.0)));
   FVTips.Terms().Add(new CFuzzyTerm("generous", new CTriangularMembershipFunction(20.0, 25.0, 30.0)));
   FSTips.Output().Add(FVTips);
//--- 3つのマムダニ・ファジィ・ルールを作る
   Rule1 = FSTips.ParseRule("if (service is poor )  or (food is rancid) then tips is cheap");
   Rule2 = FSTips.ParseRule("if ((service is good)) then tips is average");
   Rule3 = FSTips.ParseRule("if (service is excellent) or (food is delicious) then (tips is generous)");

   FSTips.Rules().Add(Rule1);
   FSTips.Rules().Add(Rule2);
   FSTips.Rules().Add(Rule3);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
|エキスパート初期化関数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- ファジーシステムの削除
   In.FreeMode(true);  
   delete In;  
   delete FSTips;  
  }
//+------------------------------------------------------------------+
//| エキスパート・ティック機能|
//+------------------------------------------------------------------+
void OnTick()
  {
   for(int ir=1; ir<10; ir++)
     {
      Dic_Service.SetAll(FVService,ir);
      Dic_Food.SetAll(FVFood,ir);
      In.Clear();
      In.Add(Dic_Service);
      In.Add(Dic_Food);
      //--- 結果を得る
      CList *result=FSTips.Calculate(In);
      Dic_Tips=result.GetNodeAtIndex(0);
      Print("Tips, %: ",Dic_Tips.Value());
      delete result;
     }
  }
//+------------------------------------------------------------------+
ファイル:
Fuzzy.zip  33 kb
 

h

when I update metatrader to build 2342

all of samples with fuzzy logic library

return error "incorrect casting of pointers" on MQL5 ¦ Include ¦ Math ¦ ¦ ¦ ¦ エラーを返します。Fuzzy \ RuleParser.mqh Line 712

Please help to fix bug

many thanks