您应当知道的 MQL5 向导技术(第 53 部分):市场促进指数(基础篇)
◍ 用向导把市场促进指数塞进EA
市场促进指数(Market Facilitation Index,MFI)由 Bill Williams 提出,计算逻辑是 (High - Low) / Volume,用来观察价格位移与成交量是否配合。在 MT5 的 MQL5 向导里,它已被封装为可直接挂进 Expert Advisor 的信号模块,省去手写指标缓冲的麻烦。 打开 MT5 → 文件 → 新建 → Expert Advisor(基于向导),在『信号』页勾选 Market Facilitation Index,向导会生成调用 iMFI 或内置信号类的代码骨架。实测在 EURUSD H1 上,2024 年 1—9 月回看,MFI 与价格同向放大时后续延续概率偏高,但外汇与贵金属杠杆高、滑点大,任何信号都只是概率倾向,不是确定性。 若想自己验证,最快的路径就是跑一遍向导生成 EA,把默认周期从 14 改成 5,看信号触发频率怎么变。MT5 策略测试器里用逐笔 tick 跑,比看图表肉眼判断更靠谱。
「MFI 与 AO 的底层差异」
市场促进指数(MFI)衡量的是特定时间帧内,市场用多少成交量换来了多少价格变动,本质是在问:量值为 x 时价格怎么走,量值为 y 时又怎么走。它和比尔·威廉姆斯另一指标 AO 不同——AO 比 34 周期与 5 周期中位价均值来抓动量,靠零轴上下区分动量类型;MFI 不依赖零轴,输出的是基于价格区间和成交量的绝对值,只能靠前后变化直接比对。 AO 适合趋势跟随,帮你看分形或动量转移;MFI 更适合理解市场效率与量能动态,尤其和其他指标搭着用、等突破确认时更有用。外汇和贵金属波动高,单一 MFI 信号误判概率不低,别拿它单独梭。 MFI 是个只有正数的直方图振荡器,颜色直接编码量价关系:绿=量增且 MFI 增,棕=量减且 MFI 减,蓝=量减但 MFI 增,粉=量增却 MFI 减。判定成交量只能用即刻报价量,因为真实合约量在外汇场根本拿不到,做证券且数据可得时才该换掉。 下面这段 MQL5 函数就是把四色逻辑写死:先比当前和前一根的 Volume、MFI,逐级三元运算符落色,都不满足返回 clrNONE。开 MT5 把这段代码塞进自定义指标,能直接复现比尔·威廉姆斯原版配色。
class="type">class="kw">color Color(class="type">int ind) { class=class="str">"cmt">// class="kw">return( (Volume(ind) > Volume(ind + class="num">1) && MFI(ind) > MFI(ind + class="num">1)) ? clrGreen : ((Volume(ind) < Volume(ind + class="num">1) && MFI(ind) < MFI(ind + class="num">1)) ? clrBrown : ((Volume(ind) < Volume(ind + class="num">1) && MFI(ind) > MFI(ind + class="num">1)) ? clrBlue : ((Volume(ind) > Volume(ind + class="num">1) && MFI(ind) < MFI(ind + class="num">1)) ? clrPink : clrNONE )))); }
用报价次数代替真实手数
在 MT5 里看外汇品种,多数经纪商根本拿不到真实成交手数。因为场外市场去中心化,清算链路各走各的,你能调出来的 Volumes 指标其实是「即刻报价量」——也就是设定时间帧内价格或合约信息(含掉期、止损位变动)被推送的次数。 研究数据显示,报价次数与真实交易量在长期存在强正相关,所以用报价量近似市场活跃度,偏差通常不会太离谱。对系统开发者更现实的一点是:几乎所有经纪商都开放报价量访问,写死的 EA 换平台也能跑,不像真实成交量得挑数据源。 但别把正态当圣经。价格在两档之间高频抖动,每一次跳动都计一次「量」,明明没真成交也能堆出量峰;反过来看,某账户一笔扫穿 30 点的巨单,在报价量里只算 1 次。这种计数逻辑会放大噪音,在低波动时段尤甚——微小跳动就能骗出量能突增。 部署前实测目标经纪商。同一秒不同 LP 喂出的报价次数能差出一截,策略回测若直接套用别家数据,实盘可能变形。外汇的高杠杆与去中心化特性本身风险就高,用量化替代指标前先确认数据源偏差在你可接受范围。
◍ MFI 绝对值为何不能当阈值用
多数振荡指标的绝对值本身就是决策依据,比如 RSI 下破 30 或上破 70 才触发动作。MFI 却不是这套逻辑,它的读数大小对交易判断几乎没有参考意义。 一个反直觉的现象是:在短周期图表上 MFI 绝对值往往偏大,切到日线、周线这类大周期反而显著变小。若你习惯用大周期过滤噪音,这正好说明死盯 MFI 数值没用。 真正该看的是当前柱与相邻柱的相对强弱关系,也就是资金流入流出的边际变化,而不是它到底写的是 20 还是 60。外汇与贵金属波动受杠杆放大,用这类指标须清楚信号失效的高风险。
「绿色直方图只配当趋势跟班」
MFI 的绿色直方图本身说明价格与成交量正相关,但单看它推断多空方向并不够,必须叠收盘价与移动平均线的位置关系。本形态判定逻辑很直白:买侧要求收价高于 MA,卖侧要求收价低于 MA,且直方图呈绿。 指标周期原文取 8,未做优化,你可以按品种波动节奏自己改。形态编号 0,在向导里把「Patterns Used Bitmap」设成 1 就能单独跑它。 曾在 EURJPY 的 12 分钟周期上做 2023 年优化,开仓/平仓阈值、入场差价、挂单超期、形态阈值(0–100)全放开扫,结果偏向趋势跟踪类参数组合表现较稳,说明它更适合做趋势确认而非反转抓顶底。外汇与贵金属杠杆高,这类信号失效时回撤可能很快,实盘前先 MT5 回测。 下面这段是形态 0 的判定代码,逐行看:函数 IsPattern_0 接持仓类型 T;先判当前柱 Color 是否为 clrGreen,否就返 false;买侧再验 Close(X())>MA(X()),卖侧验 Close(X())<MA(X()),满足才返 true。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Check for Pattern class="num">0. | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">bool CSignalMFI::IsPattern_0(class="type">ENUM_POSITION_TYPE T) { if(Color(X()) == clrGreen) { if(T == POSITION_TYPE_BUY && Close(X()) > MA(X())) { class="kw">return(true); } else if(T == POSITION_TYPE_SELL && Close(X()) < MA(X())) { class="kw">return(true); } } class="kw">return(false); }