市场轮廓指标(基础篇)
先搞清市场轮廓在 MT5 里是什么
市场轮廓(Market Profile)在 MetaTrader 5 里是一种把成交价格按时间分布堆叠起来的视图,用来观察一段时间内不同价位的成交密集程度。它不预测方向,只呈现参与者在哪些价格上花了多少时间。 在 MT5 终端中,市场轮廓通常以竖向直方图形式贴在价格轴一侧,每个时段(如每小时)生成一列字母或色块,字母越靠上或靠下代表该时段主要成交区。 其结构核心有三条原则:价格有时间价值——停留越久的价位越可能成为价值区;边缘的薄成交区往往是突破或拒绝区;轮廓形状(如 P 形、b 形)反映买方或卖方主导。 一个可验证现象:在 2025 年 8 月 4 日 07:27 发布的示例帖中,该轮廓图获得 1 044 次查看与 9 条讨论,说明这类基础结构在实盘社群中仍有高频关注。外汇与贵金属市场波动剧烈,用轮廓做参考须结合止损,高风险。
◍ 市场轮廓到底是什么工具
市场轮廓由彼得·施泰德迈尔在20世纪80年代与芝加哥商品交易所共同开发,它不是传统技术指标,也不直接给买卖信号,而是用时间、价格、成交量重构一天的交易构成。它画在近似正态曲线上,约70%的成交落在均值一个标准差内,帮交易者看清最大成交量发生在哪、谁在控盘、公允价值在哪。 推荐分析周期用 M30。开盘后第一个小时(两根30分钟柱)形成初始平衡区域,是研究全天买卖方认同价的基础。市场参与者分两类:日内交易者靠几个 tick 的大成交量搅动,其他时段交易者把价格推到新水平。 几个必须认得的形态:初始平衡区域是开盘首小时价格范围;价值区域含约70%交易活动;控制点(POC)是最长轮廓线、最接近范围中心,常做强支撑阻力;买/卖尾短说明其他时段交易者攻击性强。趋势日的初始平衡区间常占全天范围不到25%,普通日约80%,普通日正常波动时初始平衡占约50%。 实战中可用 POC 和价值区域边界找回调或突破入场,用其高/低点放保护性止损。若价格以低成交量戳出新高又快速回 POC,可能是假破;若价值区域外持续出新 POC,倾向新趋势开启。外汇与贵金属波动大、杠杆高,用这套框架仍须自担高风险,开 MT5 调出 M30 周期对照验证最直观。 经典市场轮廓基于 TPO(时间-价格机会),用大写拉丁字母每个代表30分钟,逐字母排开就能看见价格在时间上的停留分布。
「MT5内置市场轮廓怎么按时段切成交量」
打开 MT5 安装目录下的 \MQL5\Indicators\Free Indicators,能找到 MarketProfile.mq5——这是官方给的简化版市场轮廓,不按经典 TPO 字母堆砌,而是把一天拆成亚、欧、美三个时段,各自画垂直成交量分布。 它逐根读日内 K 线,按所属时段归类,再统计每个价格水平上停留的时长,用矩形长度表达。颜色越拉得长,说明该价位在那一时段被反复成交、停留越久,往往就是活跃供需带。 指标本身不输出 POC 数值,但肉眼能直接抓出矩形最长的那条水平线,那便是该时段的隐形控制点;成片的长矩形区近似价值区域,价格后续回踩这些带时更容易获得承接或压制。外汇与贵金属杠杆高、跳空频繁,这类分布只反映历史停留,不预示必然反转。 想验证就自己拖进图表跑:切到 15 分钟周期,观察美洲时段矩形在前期密集成交区的重叠,对比下一根大 K 是否从那里发起。
轮廓怎么被填进数组又画上图
市场轮廓的本质是一张以价格为行的计数表。把一根日K线的最低价到最高价切成每点一行,索引0就是日低,索引N等于日低加N点;某根日内K线落在哪几行,只看它的低高减去日低得到的点数区间。 每来一个报价,数组先清空,再按当前日K范围重设大小,把各价格水平被多少根K线触碰的次数写回对应索引。价格在某一层停留的K线越多,那一行的计数越大,画出来的矩形就越长——这是读盘时直接看‘厚薄’的依据。 初始化时用系统启动以来的毫秒数末四位当对象名前缀,避免多指标实例重名;反初始化用同前缀删矩形。下例输入参数里 InpShowDays=3 表示连画含当日在内的三天轮廓,欧洲盘从8点、美洲盘从14点起算,亚洲盘随每日开盘。 代码里 OnInit 取 GetTickCount64 末四位赋给 ExtPrefixUniq,OnDeinit 用 ObjectsDeleteAll 按前缀清 OBJ_RECTANGLE。复制去 MT5 改 InpStartDate 和 InpMultiplier,能直观比对不同天数倍数下的轮廓密度。外汇贵金属波动受会话切换影响大,轮廓厚薄只反映历史停留概率,不预示方向。
class=class="str">"cmt">//--- input parameters input class="type">uint InpStartDate =class="num">0; class=class="str">"cmt">/* day number to start calculation */ class=class="str">"cmt">// class="num">0 - current, class="num">1 - previous, etc. input class="type">uint InpShowDays =class="num">3; class=class="str">"cmt">/* number of days to display */ class=class="str">"cmt">// starting with and including the day in InpStartDate input class="type">int InpMultiplier =class="num">1; class=class="str">"cmt">/* histogram length multiplier */ input class="type">class="kw">color InpAsiaSession =clrGold; class=class="str">"cmt">/* Asian session */ input class="type">class="kw">color InpEuropeSession =clrBlue; class=class="str">"cmt">/* European session */ input class="type">class="kw">color InpAmericaSession =clrViolet; class=class="str">"cmt">/* American session */ input class="type">uint InpEuropeStartHour =class="num">8; class=class="str">"cmt">/* European session opening hour */ input class="type">uint InpAmericaStartHour=class="num">14; class=class="str">"cmt">/* American session opening hour */ class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Custom indicator initialization function | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">int OnInit() { class=class="str">"cmt">//--- create a prefix for object names class="type">class="kw">string number=StringFormat("%I64d", GetTickCount64()); ExtPrefixUniq=StringSubstr(number, StringLen(number)-class="num">4); Print("Indicator \"Market Profile\" started, prefix=", ExtPrefixUniq); class="kw">return(INIT_SUCCEEDED); } class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Custom indicator deinitialization function | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">void OnDeinit(class="kw">const class="type">int reason) { class=class="str">"cmt">//--- after use, class="kw">delete all graphical objects created by the indicator Print("Indicator \"Market Profile\" stopped, class="kw">delete all objects with prefix=", ExtPrefixUniq); ObjectsDeleteAll(class="num">0, ExtPrefixUniq, class="num">0, OBJ_RECTANGLE);