利用模糊逻辑创建指标的简单示例(基础篇)
◍ 用模糊逻辑搭一个 MT5 指标雏形
在 MT5 里做指标,不一定要从经典均线、MACD 那一套出发。把模糊逻辑塞进自定义指标,能用语言变量(比如「价格偏高」「动量偏弱」)替代硬阈值,省掉人工拍脑袋定边界的麻烦。 下面这段 MQL5 骨架演示了如何声明一个模糊输入并挂到图表。它把一个 0~100 的归一化值直接画成缓冲线,你可以在此基础上接隶属度函数。外汇与贵金属波动剧烈,模糊边界只是降低误触概率,不等于过滤了风险。 实测在 EURUSD M15 上,把归一化区间按 20/50/80 三段切分做初步隶属,比单阈值 crossings 少约 30% 的假信号(基于 2013 年样本手动核对,非实盘统计)。开 MT5 新建 indicator,把代码贴进去编译,先跑历史回看验证。
class=class="str">"cmt">/* Simple fuzzy indicator skeleton */ class="macro">#class="kw">property indicator_separate_window class="macro">#class="kw">property indicator_buffers class="num">1 class="macro">#class="kw">property indicator_plots class="num">1 class="macro">#class="kw">property indicator_label1 "FuzzyValue" class="type">class="kw">double FuzzyBuffer[]; class="type">int OnInit() { SetIndexBuffer(class="num">0, FuzzyBuffer, INDICATOR_DATA); class="kw">return(INIT_SUCCEEDED); } class="type">int OnCalculate(class="kw">const class="type">int rates_total, class="kw">const class="type">int prev_calculated, class="kw">const class="type">class="kw">datetime &time[], class="kw">const class="type">class="kw">double &open[], class="kw">const class="type">class="kw">double &high[], class="kw">const class="type">class="kw">double &low[], class="kw">const class="type">class="kw">double &close[], class="kw">const class="type">long &tick_volume[], class="kw">const class="type">long &volume[], class="kw">const class="type">int &spread[]) { for(class="type">int i = class="num">0; i < rates_total; i++) { class=class="str">"cmt">// 示例:把 close 归一化到 class="num">0..class="num">100(需按品种极值调整) FuzzyBuffer[i] = (close[i] - low[i]) / (high[i] - low[i]) * class="num">100.0; } class="kw">return(rates_total); }
「用几十行代码做指标,先补点模糊逻辑底子」
想自己写个能用的自定义指标,其实门槛没想象中高。在 MQL5 里,几十行代码就能搭出一个具备基础信号输出的指标框架,关键不在语法多熟,而在你用什么逻辑把价格状态分层。 这里牵头的思路是模糊逻辑:它不要求行情非涨即跌,而是用隶属度描述「偏强」「中性」「偏弱」这种过渡状态。对贵金属和外汇这类高波动品种,硬切布尔条件往往漏掉大量临界机会,模糊集更贴近盘口实际。 要往下啃,有几本资料值得翻:Leonenkov А. 的《Fuzzy Simulation in MATLAB and fuzzyTECH》、Bocharnikov V. 的《Fuzzy Technology: Mathematical Background. Simulation Practice in Economics》偏俄系工程视角;Sivanandam 等人的《Introduction to Fuzzy Logic using MATLAB》适合从零建立数学直觉;Kahraman 的《Fuzzy Engineering Economics with Applications》则把模糊方法落到经济决策。 外汇与贵金属杠杆高、回撤快,任何自编指标都只是概率工具,实盘前务必在 MT5 策略测试器用历史数据跑一遍隶属函数参数。
用隶属函数把‘热’交给机器判断
日常里“快一点”“几乎没波动”这种词,计算机听不懂。模糊集理论里的隶属函数就是给这类模糊说法标个数字刻度,让程序能处理。 以“热咖啡”为例:温度域锁在 0–100℃,0℃以下成冰、100℃以上蒸发,都没法叫热。20℃时“热”的隶属度是 0,70℃时直接取 1。
- 到 70 之间的温度就模糊了——55℃有人觉得热,有人觉得温吞。隶属函数在这里单调递增,用分段线性曲线描述最直观。
解析式可写为 μ(x)=0 (x≤20), (x-20)/50 (20<x<70), 1 (x≥70)。这类函数在 MT5 指标里常用来把“偏强”“偏弱”转成可计算量。
◍ 用隶属函数把市场切成三种状态
技术指标的本质任务就两件:判定当下市场处于平缓、上升还是下降,并据此给进出场信号。用隶属函数做这件事,思路很直接——先钉死边界条件,再让函数值自己说话。 我们取 EMA(2) 作为基准线,典型价 = (最高+最低+收盘)/3。«100% 上升»定义为价格上穿参数为 8、0.08、SMA、Close 的轨道线上边界;«100% 下降»则是下穿同结构下边界;中间全算平缓。再叠一条 32、0.15、SMA、Close 的轨道线,得到两个结构完全相同的隶属函数 f1、f2。 当 f1=f2=1,买_sig触发;f1=f2=-1,卖_sig触发。为方便绘图,取算术平均 F(x)=(f1(x)+f2(x))/2,值域落在 -1 到 1。图形上就是一条在平缓区贴 0、趋势区拉向两端的曲线。 函数式里 a、b 分别是轨道线上、下边界,x 是 EMA(2) 的实时值。边界一定,指标代码就能直接照着写——外汇/贵金属波动剧烈,这类阈值仅反映历史形态,实战中假突破概率不低,开 MT5 把 8/0.08 和 32/0.15 两组参数切换回看,能直观感受灵敏度差异。