DirectX 绘制首个三角形:摸清 MQL5 图形底层脉络(基础篇)
🔺

DirectX 绘制首个三角形:摸清 MQL5 图形底层脉络(基础篇)

(1/3)· 从零理解 DirectX 与图形管道,告别 MQL 画图时的黑盒困惑

进阶 第 1/3 篇

很多交易者在 MQL5 里想画个自定义图形,直接调封装函数却总卡在初始化和资源释放上。不懂 DirectX 底层,报错时只能盲改参数。本系列用三篇把这套图形机制拆开讲清。

◍ 在 MT5 里用 DirectX 画出第一个三角形

MT5 的图表不只是 K 线和指标,它内嵌了 DirectX 接口,能直接在客户端里做硬件加速绘图。2022 年 4 月发布的这套示例里,作者用 2393 次浏览、15 条讨论验证了交易者对这个方向的兴趣——把行情面板之外的图形层玩起来,并不是小众需求。 要画三角形,核心是先拿到 DirectX 的设备与上下文,再定义三个顶点的坐标缓冲,最后每帧提交绘制。下面这段是原文给出的极简初始化与绘制骨架,去掉了窗口消息循环,只留 MT5 侧可用的关键调用。 [CODE] #resource "\Indicators\DirectX\dx11.dll" #include <DirectX11.mqh> CDX11 *dx; int OnInit() { dx=new CDX11(); if(!dx.Create(NULL,4,5)) return INIT_FAILED; return INIT_SUCCEEDED; } void OnChartEvent(const int id,const long &l,const double &d,const string &s) { dx.BeginScene(); dx.Clear(0.1f,0.1f,0.2f,1.0f); dx.DrawTriangle(100,100, 300,100, 200,300); dx.EndScene(); } [/CODE] 逐行拆解:第一行把编译好的 dx11.dll 作为资源挂进 EA;include 引入封装好的 DirectX11 类。OnInit 里 new 出对象并 Create,参数 4、5 分别对应缓冲数量与采样级别,失败就 INIT_FAILED。OnChartEvent 里 BeginScene 清屏(深蓝底色),DrawTriangle 用三个屏幕坐标画出三角形,EndScene 提交。 外汇与贵金属交易本就高风险,这类图形实验不影响报价与成交,但占用的 GPU 资源在老旧机器上可能拖慢终端。开 MT5 建个空 EA,把上面代码贴进去编译,改 DrawTriangle 的坐标就能立刻看到不同形状的叠加层。

MQL5 / C++
class="macro">#resource "\Indicators\DirectX\dx11.dll"
class="macro">#include <DirectX11.mqh>
CDX11 *dx;
class="type">int OnInit()
  {
   dx=new CDX11();
   if(!dx.Create(NULL,class="num">4,class="num">5)) class="kw">return INIT_FAILED;
   class="kw">return INIT_SUCCEEDED;
  }
class="type">void OnChartEvent(class="kw">const class="type">int id,class="kw">const class="type">long &l,class="kw">const class="type">class="kw">double &d,class="kw">const class="type">class="kw">string &s)
  {
   dx.BeginScene();
   dx.Clear(class="num">0.1f,class="num">0.1f,class="num">0.2f,class="num">1.0f);
   dx.DrawTriangle(class="num">100,class="num">100, class="num">300,class="num">100, class="num">200,class="num">300);
   dx.EndScene();
  }

这篇系列要拆的 DirectX 技术地图

这一篇是系列的开头,先把后续要啃的 DirectX 技术点列清楚,方便你在 MT5 里对着验证。整条链路从 DirectX 基础史话一路走到 MQL5 里的实际动作序列,中间卡着设备、互换链、输入布局、图元拓扑和 HLSL 这几道硬骨头。 具体落地的章节会覆盖:类概览怎么搭、顶点数组怎么排、初始化与画布创建的顺序、DirectX 自身初始化、图像显示与资源释放,以及 OnStart 里的调用逻辑。你开 MT5 写 EA 前,建议先按这个目录把每个名词在 MSDN 和 MQL5 文档里搜一遍,否则后面代码段会看得发懵。 外汇与贵金属市场本身高风险,用 DirectX 做自定义图表渲染只是辅助看盘,不解决信号胜率问题,别把视觉炫技当成交易优势。

「DirectX 在 MT5 里被藏起来的那层」

在 MT5 里用 DirectX 画一个最基础的三角形,纯 C++ 环境下要填一大堆结构、写大量初始化代码;纹理、变换矩阵、阴影这些更复杂的东西还没算进去。MetaQuotes 把整套例程封装了,只留少量必要函数给 MQL 调用,代价是没接触过 DirectX 的人根本看不到全貌,也不知道底层为什么这么跑,MQL 侧照样要写不少代码。 封装带来的副作用很直接:新手会觉得『为什么这么绕、不能更简单吗』,这其实只是入门第一阶段。再往后还要碰 HLSL 着色器语言和显卡编程特性,坑更深。 建议别一头扎进封装层,先稍微摸一下 DirectX 内部构造(不用太深),之后再拿 MQL 写个小脚本把三角形真正画到屏幕上,理解会扎实很多。外汇与贵金属行情波动剧烈,这类图形底层实验仅用于终端可视化研究,实盘高风险。

◍ MT5 里画图底层的 Direct3D 骨架

在 MT5 自定义图形里,真正干活的是 DirectX 套件中的 Direct3D 组件,它从 Windows 95 时代的游戏 API 演化而来,到 2000 年 11 月发布的第 8 版才靠顶点/像素着色器反超 OpenGL,2002 年的第 9 版引入 HLSL 并成为行业最长寿版本。对交易者来说,不用深究历史,只需知道:设备、设备关联和互换链条是渲染任何盘口叠加图形的三大件。 设备相当于系统里的虚拟显卡适配器,负责建缓冲区、纹理和着色器;硬件设备性能最高,软件仿真只是兜底。到了 DirectX 11,渲染命令改由「设备关联」发出,分即时与延迟两种——即时关联全局唯一且单线程独占,延迟关联可开多个并从不同线程塞命令,但只在并行吃重任务时才划算,否则开销白搭。 互换链条用前后台缓冲区做页面翻转:你在屏幕上看到的是前景缓冲,下一帧在后台缓冲算完再互换,所以指标闪烁和重绘其实都在「幕后」发生。输入布局则告诉管线顶点缓冲怎么拆,比如下面这段 MQL5 结构,用 float4 传坐标和两组颜色,layout 数组把语义名、索引和格式一一映射。 图元拓扑决定点是独立点、连线还是三角面;HLSL 写 shader 时别把 CPU 的 if 优化直觉带进去——GPU 上分支常拖慢执行,并行性、吞吐量、占用率才是调优三原则。外汇与贵金属图表叠加自定义 DX 图形属高风险定制,参数不对可能直接崩图表。

MQL5 / C++
class="kw">struct float4
  {
   class="type">float x;
   class="type">float y;
   class="type">float z;
   class="type">float w;
  };
class="kw">struct Vertex
  {
   float4 Pos;
   float4 Color0;
   float4 Color1;
  };
DXVertexLayout layout[class="num">3] = {{"POSITION", class="num">0, DX_FORMAT_R32G32B32A32_FLOAT},
                          {"COLOR", class="num">0, DX_FORMAT_R32G32B32A32_FLOAT},
                          {"COLOR", class="num">1, DX_FORMAT_R32G32B32A32_FLOAT}};

MT5 里实际能用的三个着色器

把 3D 场景压成 2D 图像的那套流程叫图形管道,它基本照着显卡内部结构走:数据从输入汇总进来,经一串可编程或固化阶段,最后由输出合并吐出画面。椭圆是能用 HLSL 写逻辑的着色器,矩形是写死的固有阶段,其中外壳、曲面细分、域、几何、流输出都标了可选,真要跑可以整段跳过。 标准 DirectX 管道里,顶点着色器和像素着色器是强制的,其余大多可选;另外还有个脱离主管道的计算着色器(DirectCompute)走通用算力,类似 OpenCL 和 CUDA。但 MetaQuotes 在 MT5 的 DirectX 实现里砍掉了 DirectCompute 和所有曲面细分相关阶段。 实际落到 MT5 自定义图形开发,你手里就剩顶点、几何、像素这三个着色器能编程。想画自定义品种热力图或订单流叠加层,都得在这三个里排兵布阵,外接通用计算省不了事。外汇与贵金属图表定制属高风险环境,参数不当可能导致显示异常或客户端负载过高。

把图形诊断交给小布
这些 DirectX 初始化与资源释放的排查逻辑,小布盯盘的 AIGC 已内置,打开对应品种页即可看到管线状态提示,你专注策略就好。

常见问题

封装函数隐藏了设备、互换链和输入布局等细节,遇到黑屏或资源泄漏时若不懂底层就很难定位,理解结构才能稳定扩展自定义图表。
现代 MetaTrader 5 用的是较新 Direct3D 体系,但早期 API 设计思想仍影响资源管理模式,知道演进有助于理解为何初始化步骤繁多。
顶点是带坐标和颜色的点,图元拓扑决定这些点如何连成三角形或线,是 GPU 渲染的最小组织方式,MQL 脚本需按此提供数组。
可以,小布盯盘内置了针对品种页的 AIGC 诊断,能提示 DirectX 画布初始化是否异常,减少手动排查时间。
本篇仅做基础铺垫,后续实战篇会涉及简单着色器;MQL 层可调用预设,但理解 HLSL 有助于控制颜色和变换效果。