四分位看板:用图表按钮免改代码切换价位层(基础篇)
(1/3)·还在反复进脚本改布尔开关?这篇基础篇把四分位线控制搬到了图表按钮上
「四分位看板在 MT5 里的落点」
四分位理论做进 MT5 工具包时,核心不是画几条线,而是把价格区间按四分位切分后实时标注当前所处带位。2025 年 11 月 13 日发布的示例版本在 MetaTrader 5 环境跑通,基础看板不含指标堆叠,纯价格行为切片。 原文示例帖获 723 次查看、0 条评论,说明这类裸价格结构工具在发布初期讨论度低,但适合个人验证使用。 开 MT5 后可用自定义指标加载四分位看板,重点调一个参数:区间回溯根数。回溯太短噪声多,太长则带位钝化,倾向先用 200~300 根 H1 数据做初次观察。外汇与贵金属波动剧烈,四分位仅作概率参考,不构成方向承诺。
◍ 从改代码到点按钮:四分位开关的解放
四分位绘图脚本是整个价格区间划分体系的第一块拼图,它负责在 MT5 图表上自动落线,并用一组布尔开关控制每类级别的显隐。最早的做法是在输入参数里硬改:把 DrawSmallQuarters 设为 true 才出小四分位线,把 DrawLargeQuarters 设为 false 就隐藏大四分位线,上冲/下探区域同理。 这种改参流程对实盘很磨人——你盯着 EURUSD 或 XAUUSD 这类高波动品种,想临时只看大四分位线,就得停下手去调代码重加载。外汇与贵金属杠杆高、跳空频繁,图表干扰线多一分,误读价位的概率就大一分。 后来的看板工具把这套布尔逻辑搬到了图表按钮上。不用再碰 DrawSmallQuarters 这类字段,直接在图面点一下就能翻转开关,一键只看大线或全量显示,操作链路从「改代码—编译—重载」缩成「点一下」。下面这三行就是原脚本的默认输入,注意小四分位默认是关的,大四分位和上冲区默认开:
<span class="keyword">input</span> <span class="keyword">class="type">bool</span> <span style="background-class="type">class="kw">color:rgb(class="num">216, class="num">232, class="num">194);">DrawLargeQuarters</span> = <span class="macro">true</span>; <span class="comment">class=class="str">"cmt">// Draw intermediate large quarter lines.</span> <span class="keyword">input</span> <span class="keyword">class="type">bool</span> <span style="background-class="type">class="kw">color:rgb(class="num">222, class="num">188, class="num">133);">DrawSmallQuarters </span> = <span class="macro">false</span>; <span class="comment">class=class="str">"cmt">// Draw small quarter lines.</span> <span class="keyword">input</span> <span class="keyword">class="type">bool</span> <span style="background-class="type">class="kw">color:rgb(class="num">249, class="num">204, class="num">202);">DrawOvershootAreas</span> = <span class="macro">true</span>; <span class="comment">class=class="str">"cmt">// Mark overshoot/undershoot areas for large quarter lines.</span>
四分位看板的四个图表按钮怎么用
这套 EA 把价位显示做成图表按钮,不用去参数面板改布尔值。四个按钮分别是:大四分位线、小四分位线、上冲/下探、趋势方向,点一下切换对应价位显隐,文字激活是绿色、关掉是红色,状态一眼能看清。 趋势方向按钮顺手做了个轻量分析:按一下就用 50 周期 SMA 和当前价比,直接告诉你偏多、偏空还是横盘,按钮同样变色提示。外汇和贵金属波动大、杠杆高,这种一键判断只是快速参考,真下单前最好自己再核对一下周期和价位。 想验证很简单,挂上 EA 点几下按钮,看绿红切换和 SMA 方向是否跟图表对得上就行。
「四分位EA的面板与开关逻辑怎么搭」
这套EA把易用性放在第一位:输入参数只暴露价位间距和配色,核心算法不碰;全局布尔变量当功能开关,大四分位线默认开、小四分位线默认关,想改显示逻辑直接翻这几个变量就行。 界面从一块背景面板起手,用矩形标签模拟,位置由 PanelX=10、PanelY=10、PanelWidth=250 定死,按钮高 30、间距 5,全部相对面板定位。四个按钮分别切大四分位、小四分位、上冲区和趋势评论,激活显绿、未激活显红,单次点击即反转状态。 事件处理只监听图表点击,靠按钮名匹配功能。市场剧烈波动时这种轻量架构不容易卡,但外汇和贵金属本身高杠杆高风险,按钮再顺手也只是辅助,别当成方向依据。 四分位线绘制前先清旧线,主水平线恒显,附加线随开关走;趋势评论用指定周期 SMA 对比现价,高于 SMA 偏多、低于偏空、贴近则横盘,文本贴按钮下方动态刷。下面这段输入与全局定义,复制进 MT5 就能改参数验证。
class="macro">#class="kw">property copyright "Christian Benjamin" class="macro">#class="kw">property link "[MQL5官方文档] class="macro">#class="kw">property version "class="num">1.0" class="macro">#class="kw">property strict class=class="str">"cmt">//---- Input parameters for drawing levels ---------------------------- input class="type">class="kw">double MajorStep = class="num">0.1000; class=class="str">"cmt">// Difference between major whole numbers class=class="str">"cmt">//---- Color settings --------------------------------------------------- input class="type">class="kw">color MajorColor = 0x2F4F4F; class=class="str">"cmt">// Dark Slate Gray for major lines. input class="type">class="kw">color LargeQuarterColor = 0x8B0000; class=class="str">"cmt">// Dark Red for large quarter lines. input class="type">class="kw">color SmallQuarterColor = 0x00008B; class=class="str">"cmt">// Dark Blue for small quarter lines. input class="type">class="kw">color OvershootColor = clrRed; class=class="str">"cmt">// Red for overshoot/undershoot lines. class=class="str">"cmt">//---- Line styles and thickness settings ----------------------------- input ENUM_LINE_STYLE MajorLineStyle = STYLE_SOLID; input class="type">int MajorLineWidth = class="num">4; input ENUM_LINE_STYLE LargeQuarterLineStyle = STYLE_DOT; input class="type">int LargeQuarterLineWidth = class="num">3; input ENUM_LINE_STYLE OvershootLineStyle = STYLE_DASH; input class="type">int OvershootLineWidth = class="num">1; input ENUM_LINE_STYLE SmallQuarterLineStyle = STYLE_SOLID; input class="type">int SmallQuarterLineWidth = class="num">1; class=class="str">"cmt">//---- Panel and button settings -------------------------------------- input class="type">int PanelX = class="num">10; input class="type">int PanelY = class="num">10; input class="type">int PanelWidth = class="num">250; input class="type">int ButtonHeight = class="num">30; input class="type">int ButtonSpacing= class="num">5; class=class="str">"cmt">//---- Global toggle variables ---------------------------------------- class="type">bool g_DrawLargeQuarters = true; class="type">bool g_DrawSmallQuarters = false;
◍ 面板按钮怎么驱动价位线刷新
把季度位画线做成可交互面板,核心不在画多少条线,而在点击按钮时状态变量如何翻转并触发重绘。下面这段里 g_DrawOvershootAreas 默认开、g_DrawTrendDirection 默认关,意味着载入指标时只显示刺穿区,趋势方向注释要手动点开才跑。 CreatePanel() 用 OBJ_RECTANGLE_LABEL 在左上角距边 PanelX/PanelY 处生成底板,文本塞了四个换行当占位,边框设 BORDER_RAISED 做出微凸质感;若你改 CORNER_RIGHT_UPPER 就能挪到右上,避开自带工具栏。 OnChartEvent 里 CHARTEVENT_OBJECT_CLICK 分支靠 sparam 比对按钮名:点 BUTTON_LARGE 就把 g_DrawLargeQuarters 取反,随后 UpdateButtonColors 改色、DrawQuarterLines 重画;点 BUTTON_TREND 同理,开状态时调 UpdateTrendComment 写方向文字,关时 DeleteTrendComment 清掉。外汇与贵金属波动大,这类面板只是辅助定位,信号失效概率不低。 DrawQuarterLines 先删旧线,取 SYMBOL_BID 做锚,用 MathFloor(price/MajorStep)*MajorStep 落到大周期下沿;g_DrawLargeQuarters 为真时以 MajorStep/4.0 为步长循环 i=1..3 插三条大季度分位线。开 MT5 把 MajorStep 调成 0.005 或 0.01,黄金和欧美会给出完全不同的网格密度,自己跑一遍最直观。
class="type">bool g_DrawOvershootAreas = true; class="type">bool g_DrawTrendDirection = false; class=class="str">"cmt">//---- Object names for panel and buttons ----------------------------- class="macro">#define PANEL_NAME "LevelsPanel" class="macro">#define BUTTON_LARGE "btnLargeQuarters" class="macro">#define BUTTON_SMALL "btnSmallQuarters" class="macro">#define BUTTON_OVERSHOOT "btnOvershoot" class="macro">#define BUTTON_TREND "btnTrendDirection" class="macro">#define TREND_LABEL "TrendDirectionLabel" class="type">void CreatePanel() { if(ObjectCreate(class="num">0, PANEL_NAME, OBJ_RECTANGLE_LABEL, class="num">0, class="num">0, class="num">0)) { ObjectSetInteger(class="num">0, PANEL_NAME, OBJPROP_CORNER, CORNER_LEFT_UPPER); ObjectSetInteger(class="num">0, PANEL_NAME, OBJPROP_XDISTANCE, PanelX); ObjectSetInteger(class="num">0, PANEL_NAME, OBJPROP_YDISTANCE, PanelY); ObjectSetInteger(class="num">0, PANEL_NAME, OBJPROP_COLOR, clrDarkGray); ObjectSetString(class="num">0, PANEL_NAME, OBJPROP_TEXT, "\n\n\n\n"); ObjectSetInteger(class="num">0, PANEL_NAME, OBJPROP_BORDER_TYPE, BORDER_RAISED); } } class="type">void OnChartEvent(const class="type">int id, const class="type">long &lparam, const class="type">class="kw">double &dparam, const class="type">class="kw">string &sparam) { if(id == CHARTEVENT_OBJECT_CLICK) { if(sparam == BUTTON_LARGE) { g_DrawLargeQuarters = !g_DrawLargeQuarters; UpdateButtonColors(); DrawQuarterLines(); } else if(sparam == BUTTON_TREND) { g_DrawTrendDirection = !g_DrawTrendDirection; UpdateButtonColors(); if(g_DrawTrendDirection) UpdateTrendComment(); else DeleteTrendComment(); } class=class="str">"cmt">// Similar handling for other buttons... } } class="type">void DrawQuarterLines() { DeleteQuarterLines(); class="type">class="kw">double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); class="type">class="kw">double lowerMajor = MathFloor(currentPrice / MajorStep) * MajorStep; DrawHorizontalLine("MajorLower", lowerMajor, MajorColor, MajorLineWidth, MajorLineStyle); if(g_DrawLargeQuarters) { class="type">class="kw">double LQIncrement = MajorStep / class="num">4.0; for(class="type">int i = class="num">1; i < class="num">4; i++)