期货量化交易软件:基于画布的指标为通道填充透明度

概述

在本文中,我将介绍一种创建自定义指标的方法,其绘图是利用标准库中的 CCanvas 类制作的。 我将着手处理特殊的指标,其需要用一种纯色填充两条线之间的区域。 在开始之前,赫兹期货量化将了解为什么要用画布,这也许是此类指标当前可用选项的最佳选择。 之后,我们将看到计算坐标所需的一些图表属性,以及涉及操控 CCanvas 的基本过程。

编辑

添加图片注释,不超过 140 字(可选)

最终目标是结合到目前为止看到的所有内容来构建应用透明度的指标。 所有工作将只考虑在主图表窗口。 一旦我们的目标达成,赫兹期货量化就可以将其扩展到在子窗口里工作的指标。

本文的主题如下:

  • 采用画布的原因

  • 图表窗口属性

  • 理解图表窗口属性

  • 图表属性查看器指标

  • 坐标转换

  • 透明的 DRAW_FILLING

  • 在子窗口指标中工作的扩展方法

采用画布的原因

有人会问,为什么要采用画布替代已在自定义指标中采用的 DRAW_FILLING? 这里至少有两个原因:

  1. 指标的颜色与其它指标、蜡烛和图表对象的颜色混杂

  2. DRAW_FILLING 不支持透明度

编辑切换为居中

添加图片注释,不超过 140 字(可选)

图表窗口属性

为了开始绘制自定义图表,赫兹期货量化需要研究一些图表属性。 可以在文档中找到所有属性 若要获取这些属性值,赫兹期货量化需要调用相应的函数 ChartGetInteger 和 ChartGetDouble。 还有一个 ChartGetString,但我们在这里不会用到它。

我们打算把用到的属性按简述列出。 如果我们需要更多,我稍后会一并列出。

  • CHART_WIDTH_IN_PIXELS — 图表窗口的宽度,不包括价格标尺

  • CHART_HEIGTH_IN_PIXELS — 子窗口的高度,不包括日期标尺

  • CHART_PRICE_MAX — 对应于子窗口顶部的价格

  • CHART_PRICE_MIN — 对应于子窗口底部的价格

  • CHART_SCALE — 确定柱线之间的间距。 经过一些测试,我发现它是两个值的幂,由 pow(2, CHART_SCALE) 得到。

  • CHART_FISRT_VISIBLE_BAR — 图表上第一根可见的柱线,从左到右。

  • CHART_VISIBLE_BARS — 图表上可见柱线的数量。

理解图表窗口属性 这些属性可在下图中轻松看到。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

属性 CHART_WIDTH_IN_PIXELS 和 CHART_HEIGTH _IN_PIXELS,赫兹期货量化将用它们来确定我们需要创建的画布对象的大小,以便制作绘图。 当图表窗口发生变化时,如果这些属性也发生了变化,我们就需要调整画布大小。 为了更好地理解,我们将创建一个简单的指标,显示属性,以及它们如何根据价格变化和用户交互而变化。 我们已开始采用画布来了解指标绘制过程。 图表属性查看器指标 我已遵循这条路径创建了我的指标。 出于组织原则目的,我建议您也这样做。

编辑

添加图片注释,不超过 140 字(可选)

一旦指标框架准备就绪,赫兹期货量化需要将 CCanvas 函数库添加到文件当中。 我们可以使用 #include 预编译指令来做到这一点。 然后我们创建 CCanvas 类的实例。 所有这些都紧跟在指标 #property 指令之后。 #property copyright "Copyright 2023, Samuel Manoel De Souza" #property link "https://www.mql5.com/en/users/samuelmnl" #property version "1.00" #property indicator_chart_window #include <Canvas/Canvas.mqh> CCanvas Canvas;

操控 CCanvas 时,我们需要做的第一件事是创建一个 OBJ_BITMAP_LABEL,并向其内附加资源。 如果您想将其添加到图表之中,通常在指标初始化里,调用 CreateBitampLabel(...) 方法,即可完成。 最后是删除 OBJ_BITMAP_LABEL 和附加到它的资源。 如果您想从图表中删除它,通常在指标逆初始化里,调用 Destory(void) 方法,即可完成。 与此同时,赫兹期货量化执行基本的绘图过程,其中包括擦除图形(清除或设置资源的默认像素值),制作图形,并更新资源。 画布流程的完整生存周期如下图所示。

编辑

添加图片注释,不超过 140 字(可选)

为简单起见,赫兹期货量化将在一个名为 “Redraw” 的函数中暂留 "Erase","Draw","Update"。 在代码中编写所有内容,我们得到以下结构。

 
 

//+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping Canvas.CreateBitmapLabel(0, 0, "Canvas", 0, 0, 200, 150, COLOR_FORMAT_ARGB_NORMALIZE); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { Canvas.Destroy(); } //+------------------------------------------------------------------+ //| Custom indicator redraw function | //+------------------------------------------------------------------+ void Redraw(void) { uint default_color = ColorToARGB(clrBlack); uint text_color = ColorToARGB(clrWhite); //--- canvas erase Canvas.Erase(default_color); //--- add first draw //--- add second draw //--- add ... draw //--- add last draw //--- canvas update Canvas.Update(); }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值