如何在MQL4中绘制弧形进度图(半饼样式)
MQL4 双色弧形进度条实现方案
你要的半环形双色进度条可以直接通过MQL4内置的CCanvas类实现,无需依赖第三方组件,可直接集成到EA或自定义指标中,核心逻辑是通过绘制两个不同角度的扇形叠加,再用中心圆形掏空实现环形效果。
实现步骤
- 引入官方Canvas库:
#include <Canvas\Canvas.mqh> - 初始化Canvas对象,绑定到目标图表窗口,指定绘制区域的坐标与尺寸
- 定义弧形基础参数:圆心坐标、外半径、环形宽度、总角度范围(半弧形一般为180度)、进度数值(0~1区间)
- 先绘制完整长度的底色扇形(对应蓝色部分)
- 再绘制对应进度比例的前景扇形(对应粉色部分),覆盖在底色上方
- 绘制和背景色一致的小半径实心圆覆盖圆心区域,得到空心环形效果
- 调用
Update()方法刷新Canvas完成渲染
核心代码示例
#include <Canvas\Canvas.mqh> CCanvas g_arcCanvas; // 进度条绘制函数,progress取值范围0~1 void DrawArcBar(double progress, int posX, int posY, int outerRadius, int ringWidth = 15) { // 清空绘制区域 g_arcCanvas.FillRectangle(posX, posY, posX + outerRadius * 2, posY + outerRadius, 0x00000000); int centerX = posX + outerRadius; int centerY = posY + outerRadius; const double totalRad = M_PI; // 半弧形总弧度(180度) const double startRad = -M_PI / 2; // 起始角度为正上方 // 绘制蓝色底色弧形 g_arcCanvas.FillPie(centerX, centerY, outerRadius, startRad, startRad + totalRad, 0xC80078FF); // 绘制粉色进度弧形 if(progress > 0 && progress <= 1) { double progressEndRad = startRad + totalRad * progress; g_arcCanvas.FillPie(centerX, centerY, outerRadius, startRad, progressEndRad, 0xC8FF50A0); } // 绘制中心透明圆实现空心效果,若图表有底色可替换为对应背景色ARGB值 g_arcCanvas.FillCircle(centerX, centerY, outerRadius - ringWidth, 0x00000000); g_arcCanvas.Update(); } int OnInit() { // 创建Canvas对象,绑定主窗口,左上角坐标(10,10),绘制区域尺寸300*150 if(!g_arcCanvas.Create(0, "ArcProgressBar", 0, 10, 10, 300, 150)) { Print("Canvas初始化失败,错误码:", GetLastError()); return INIT_FAILED; } // 示例:绘制75%进度的弧形条 DrawArcBar(0.75, 0, 0, 150); return INIT_SUCCEEDED; } void OnDeinit(const int reason) { // 释放Canvas资源 g_arcCanvas.Destroy(); }
注意事项
- 颜色使用ARGB格式定义,前两位为透明度,取值00~FF,数值越高越不透明,可根据需求自行调整
- 若在指标中使用,将绘制逻辑放到
OnCalculate函数中,将progress参数绑定为你要展示的指标数值归一化结果即可 - 如果需要全圆形进度条,只需要把totalRad参数改为
2 * M_PI,绘制区域高度调整为和宽度一致即可
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

