下载MetaTrader 5

请观看如何免费下载自动交易

有趣的脚本?
因此发布一个链接 -
让其他人评价

喜欢这个脚本? 在MetaTrader 5客户端尝试它

2015.09.02 17:30
程序库

Fuzzy 模糊逻辑库 - MetaTrader 4程序库

| Chinese English Русский Español Deutsch 日本語 Português

发布者:
MetaQuotes Software Corp.
显示:
2968
等级:
投票: 36

真实作者

Dmitry Kalyuzhny. FuzzyNet 项目网站 - http://sourceforge.net/projects/fuzzynet/

将文档解压缩至 终端数据文件夹
程序库代码位于 <终端数据文件夹>\MQL4\Include\Math\FuzzyNet\
样本测试脚本可在 <终端数据文件夹>\MQL4\Scripts\FuzzyNet\ 里找到

FuzzyNet 是用于创建模糊模型的最流行的数学库之一

用于 Microsoft.Net 的模糊逻辑库 (FuzzyNet) 是一款易于使用的控件, 可用来实现马丹尼和关野 (Sugeno) 型模糊推理系统。

FuzzyNet 包括:

  • 5 个隶属函数
  • 形式灵活的开发模糊系统的规则。
  • 马丹尼 模糊推理系统。
  • 关野 模糊推理系统。
  • 一个马丹尼型系统的 去模糊化 方法。
  • 无限量的输入和输出变量。

当程序库移植到 MQL4 时, 补充了以下内容:

  • 8 个新的隶属函数。
  • 4 个马丹尼型系统的去模糊化方法。

使用程序库

  1. 依据您的任务, 创建一个空的马丹尼或关野型的模糊系统。
  2. 创建模糊输入和输出变量。
  3. 为每个模糊变量添加适当的条款。在此之前, 每个条件都会被分配一个名称和隶属函数。
  4. 将变量添加到系统。
  5. 创建一套规则。
  6. 将规则添加至系统。
  7. 输入数据发送到系统。
  8. 调用系统的计算函数。

注: 马丹尼型推理系统可以在创建之后且在调用系统计算函数之前的任何阶段进行配置。如果系统设置在其创建之后未予改变, 则系统以省缺设置工作:

  • 蕴涵 的执行使用 最小 操作符 (输出模糊集被截断)。
  • 聚合 的执行使用 最大 操作符 (在蕴涵之后输出隶属函数所获得的最大数值)。
  • 去模糊化的执行使用重心方法。

移植 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. Sigmoid 隶属函数。
  8. 双 Sigmoid 隶属函数。
  9. 隶属函数的形式是双 sigmoid 函数之间的不同。
  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);
    解析输入值线形组合的线形函数被添加到关野型模糊变量, 替代模糊条款。使用名称和一个系数数组作为线性函数的参数。线性方程的形成基于该数组,因此,数组中的元素遵从顺序是很重要的。系数数组的长度可等于输入数值或超出它一个。如果长度相等, 方程的绝对条款等于零。如果数组长度超出一个, 绝对条款等于最后一个元素值。数组的其它所有元素自第一个开始, 按照录入系统的顺序分配到模糊输入变量中。
    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;
    该类实现的 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.mq4 依据服务和食物品质计算您所需支付的小费百分比。

录入输入参数:

输入参数

计算结果:

计算结果

巡航控制样本 (关野)

Cruise_Control_Sample_Sugeno.mq4 样本脚本是一个模糊调速器的例程。它代表一辆汽车的巡航控制系统, 根据当前车速和车辆提速至期望值的变化率偏差, 计算必要的加速度。

录入输入参数:

输入参数

计算结果:

计算结果

本文译自 MetaQuotes Software Corp. 撰写的俄文原文
官方代码: https://www.mql5.com/ru/code/13717

ALGLIB - 数值分析库 ALGLIB - 数值分析库

移植到MQL4的ALGLIB 数学函数库 (v. 3.5.0) 。

Trade History Export to CSV Trade History Export to CSV

统计分析当前商品历史订单,并导出CSV文档。

OrderTimeAlert OrderTimeAlert

该 EA观察市价单, 并自开单时间, 根据预定义时间生成声音信号。

背离判断 背离判断

根据基本指标的数据查找并显示不同类别的背离。