模糊逻辑介绍·综合运用
🧠

模糊逻辑介绍·综合运用

(3/3)·前两层铺垫完概念与单系统后,这篇把马丹尼、关野两套推理真正跑成可挂盘的决策链

新手友好 第 3/3 篇
很多交易者把模糊系统当黑箱,直接抄网上的隶属函数就上线,结果在贵金属跳空段被连续误判。模糊逻辑不是免死金牌,外汇贵金属高杠杆下错一次隶属度就可能吞掉周盈利。先弄清马丹尼和关野的运算差异,再谈实盘。

◍ 给模糊引擎喂第 5 到第 9 条规则

上面这段代码接着把 rule5 到 rule9 用 ParseRule 解析进模糊系统,语言格式和前 4 条一致:用 if (输入变量 is 隶属度词) and (...) then (输出 is 动作词) 描述巡航控制的加速逻辑。 比如 rule7 说速度误差偏快、误差变化率偏慢时,倾向让加速动作取 faster;rule9 则是两者都偏快时反而取 slower,避免过冲。 最后九条规则统一通过 Rules().Add() 挂进 fsCruiseControl,系统才具备完整推理集。你在 MT5 里跑这套时,少加一条就可能让某些输入组合无规则命中,输出直接掉到默认零值。

MQL5 / C++
SugenoFuzzyRule *rule5 = fsCruiseControl.ParseRule("if (SpeedError is zero) and(SpeedErrorDot is zero) then(Accelerate is func)");
SugenoFuzzyRule *rule6 = fsCruiseControl.ParseRule("if (SpeedError is zero) and(SpeedErrorDot is faster) then(Accelerate is slower)");
SugenoFuzzyRule *rule7 = fsCruiseControl.ParseRule("if (SpeedError is faster) and(SpeedErrorDot is slower) then(Accelerate is faster)");
SugenoFuzzyRule *rule8 = fsCruiseControl.ParseRule("if (SpeedError is faster) and(SpeedErrorDot is zero) then(Accelerate is slower)");
SugenoFuzzyRule *rule9 = fsCruiseControl.ParseRule("if (SpeedError is faster) and(SpeedErrorDot is faster) then(Accelerate is slower)");
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);

往模糊系统塞什么、吐出来怎么接

模糊系统的输入不限制个数,但每个入口都得喂一个数值。实际写的时候,大多不会显式声明模糊特征,而是用恒定隶属函数把普通 double 值直接送进去,FuzzyNet 库就是为这种场景设计的。 具体做法是用一份 CList 清单装输入,清单里每个元素都是 Dictionary_Obj_Double 对象——它带两个字段:模糊变量和 double 数值。MQL5 的 FuzzyNet 里 Dictionary.mqh 已经把这个类实现了,直接 new 出来用 SetAll 把变量和值绑一起,再 Add 进列表即可。 输出侧结构和输入没差别。调用系统的 Calculate 方法,传进去的就是这份输入清单,返回的是另一份 CList。按下标 0 取出来的节点仍是 Dictionary_Obj_Double,用 Key() 拿变量名、Value() 拿数值。上面代码里马丹尼型取 fvTips 的值直接弹窗显示百分比,关野型取加速输出后乘 100 再显示,两者都只有一个输出但数量上并无上限。 跑这段代码前把 Service、Food 或 Speed_Error 等外部变量先赋好值,不然 Calculate 拿到空数据,Alert 出来的就是 0 或异常。外汇和贵金属策略若接这类模糊推理,请先认清模型信号仅代表概率倾向,实盘杠杆风险极高。

MQL5 / C++
CList *in=new CList;
Dictionary_Obj_Double *p_od_Service=new Dictionary_Obj_Double;
Dictionary_Obj_Double *p_od_Food=new Dictionary_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=new CList;
Dictionary_Obj_Double *p_od_Tips=new Dictionary_Obj_Double;
result=fsTips.Calculate(in);
p_od_Tips=result.GetNodeAtIndex(class="num">0);
Alert("小费, %: ",p_od_Tips.Value());
CList *in=new CList;
Dictionary_Obj_Double *p_od_Error=new Dictionary_Obj_Double;
Dictionary_Obj_Double *p_od_ErrorDot=new Dictionary_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=new CList;
Dictionary_Obj_Double *p_od_Accelerate=new Dictionary_Obj_Double;
result=fsCruiseControl.Calculate(in);
p_od_Accelerate=result.GetNodeAtIndex(class="num">0);
Alert("加速, %: ",p_od_Accelerate.Value()*class="num">100);

「模型落地前的强制校验」

基于上文脚本和 FuzzyNet 程序库搭建的模糊模型,并不能直接用于实盘。即便借助 MQL5 或 MQL4 版本的辅助库,构造一个“活性”模糊模型仍是有挑战性的任务,逻辑边界和隶属度函数都需要人工反复推敲。 外汇与贵金属市场高波动、高杠杆,任何模糊推理输出都只是概率倾向,不存在天然可靠的信号。 每个跑通的模型在接入 MT5 前,都必须做彻底的强制检查和参数调整——漏掉这一步,回测好看也只是假象。

◍ 把这条线请下神坛

模糊逻辑在 MT5 里落地,本质是把「差 / 一般 / 好」这类人话翻成可计算的隶属度,再用规则引擎推结论。上面那串参考里,马丹尼和关野两种推理模型差异最大:前者结论也是模糊集,后者直接出常数或线性式,回测时关野通常更省算力。 实际踩坑记录在 2020 年 3 月:有用户把终端升到 build 2342 后,模糊库在 RuleParser.mqh 第 712 行报「incorrect casting of pointers」,说明老接口随版本迭代已不兼容,直接抄文内代码前先核对当前 build。 下面这句规则写法就是典型马丹尼句式,very 嵌在结论术语前才合法: MamdaniFuzzyRule *rule1 = fsTips.ParseRule("if (service is poor) or (food is rancid) then (tips is very cheap)"); 外汇和贵金属波动受流动性与事件驱动,模糊系统只能给「倾向」,不能替你遮掉爆仓风险。真要验证,开 MT5 建个 ea 把上面规则跑一遍,比反复读文献来得快。

MQL5 / C++
MamdaniFuzzyRule *rule1 = fsTips.ParseRule("if (service is poor) or(food is rancid) then(tips is very cheap)");
把重复劳动交给小布
这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到模糊信号在区间震荡时的置信带,你只需决定跟不跟。

常见问题

马丹尼用取小取大,推理直观但去模糊化偏慢;关野走乘积求和,连续性强、运算轻,EA 高频调用时倾向关野。
小布盯盘目前提供信号置信可视化,不自带编译 EA,但可把你的隶属度输出接成观察页,减少手动核对。
不是。变量膨胀会让规则组合爆炸,新手友好做法是先锁 2–3 个核心特征,再按样本回测删冗余。
概率上更适配震荡与模糊边界,突破依赖尖峰触发,纯模糊系统可能滞后,常需和传统阈值混用。