期貨量化交易軟件:基于畫(huà)布的指標(biāo)為通道填充透明度
概述
在本文中,我將介紹一種創(chuàng)建自定義指標(biāo)的方法,其繪圖是利用標(biāo)準(zhǔn)庫(kù)中的 CCanvas 類(lèi)制作的。 我將著手處理特殊的指標(biāo),其需要用一種純色填充兩條線(xiàn)之間的區(qū)域。 在開(kāi)始之前,赫茲期貨量化將了解為什么要用畫(huà)布,這也許是此類(lèi)指標(biāo)當(dāng)前可用選項(xiàng)的最佳選擇。 之后,我們將看到計(jì)算坐標(biāo)所需的一些圖表屬性,以及涉及操控 CCanvas 的基本過(guò)程。

編輯
最終目標(biāo)是結(jié)合到目前為止看到的所有內(nèi)容來(lái)構(gòu)建應(yīng)用透明度的指標(biāo)。 所有工作將只考慮在主圖表窗口。 一旦我們的目標(biāo)達(dá)成,赫茲期貨量化就可以將其擴(kuò)展到在子窗口里工作的指標(biāo)。
本文的主題如下:
采用畫(huà)布的原因
圖表窗口屬性
理解圖表窗口屬性
圖表屬性查看器指標(biāo)
坐標(biāo)轉(zhuǎn)換
透明的 DRAW_FILLING
在子窗口指標(biāo)中工作的擴(kuò)展方法
采用畫(huà)布的原因
有人會(huì)問(wèn),為什么要采用畫(huà)布替代已在自定義指標(biāo)中采用的 DRAW_FILLING? 這里至少有兩個(gè)原因:
指標(biāo)的顏色與其它指標(biāo)、蠟燭和圖表對(duì)象的顏色混雜
DRAW_FILLING 不支持透明度

編輯切換為居中
圖表窗口屬性
為了開(kāi)始繪制自定義圖表,赫茲期貨量化需要研究一些圖表屬性。 可以在文檔中找到所有屬性 若要獲取這些屬性值,赫茲期貨量化需要調(diào)用相應(yīng)的函數(shù) ChartGetInteger 和 ChartGetDouble。 還有一個(gè) ChartGetString,但我們?cè)谶@里不會(huì)用到它。
我們打算把用到的屬性按簡(jiǎn)述列出。 如果我們需要更多,我稍后會(huì)一并列出。
CHART_WIDTH_IN_PIXELS — 圖表窗口的寬度,不包括價(jià)格標(biāo)尺
CHART_HEIGTH_IN_PIXELS — 子窗口的高度,不包括日期標(biāo)尺
CHART_PRICE_MAX — 對(duì)應(yīng)于子窗口頂部的價(jià)格
CHART_PRICE_MIN — 對(duì)應(yīng)于子窗口底部的價(jià)格
CHART_SCALE — 確定柱線(xiàn)之間的間距。 經(jīng)過(guò)一些測(cè)試,我發(fā)現(xiàn)它是兩個(gè)值的冪,由 pow(2, CHART_SCALE) 得到。
CHART_FISRT_VISIBLE_BAR — 圖表上第一根可見(jiàn)的柱線(xiàn),從左到右。
CHART_VISIBLE_BARS — 圖表上可見(jiàn)柱線(xiàn)的數(shù)量。
理解圖表窗口屬性 這些屬性可在下圖中輕松看到。

編輯切換為居中
屬性 CHART_WIDTH_IN_PIXELS 和 CHART_HEIGTH _IN_PIXELS,赫茲期貨量化將用它們來(lái)確定我們需要?jiǎng)?chuàng)建的畫(huà)布對(duì)象的大小,以便制作繪圖。 當(dāng)圖表窗口發(fā)生變化時(shí),如果這些屬性也發(fā)生了變化,我們就需要調(diào)整畫(huà)布大小。 為了更好地理解,我們將創(chuàng)建一個(gè)簡(jiǎn)單的指標(biāo),顯示屬性,以及它們?nèi)绾胃鶕?jù)價(jià)格變化和用戶(hù)交互而變化。 我們已開(kāi)始采用畫(huà)布來(lái)了解指標(biāo)繪制過(guò)程。 圖表屬性查看器指標(biāo) 我已遵循這條路徑創(chuàng)建了我的指標(biāo)。 出于組織原則目的,我建議您也這樣做。

編輯
一旦指標(biāo)框架準(zhǔn)備就緒,赫茲期貨量化需要將 CCanvas 函數(shù)庫(kù)添加到文件當(dāng)中。 我們可以使用 #include 預(yù)編譯指令來(lái)做到這一點(diǎn)。 然后我們創(chuàng)建 CCanvas 類(lèi)的實(shí)例。 所有這些都緊跟在指標(biāo) #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 時(shí),我們需要做的第一件事是創(chuàng)建一個(gè) OBJ_BITMAP_LABEL,并向其內(nèi)附加資源。 如果您想將其添加到圖表之中,通常在指標(biāo)初始化里,調(diào)用 CreateBitampLabel(...) 方法,即可完成。 最后是刪除 OBJ_BITMAP_LABEL 和附加到它的資源。 如果您想從圖表中刪除它,通常在指標(biāo)逆初始化里,調(diào)用 Destory(void) 方法,即可完成。 與此同時(shí),赫茲期貨量化執(zhí)行基本的繪圖過(guò)程,其中包括擦除圖形(清除或設(shè)置資源的默認(rèn)像素值),制作圖形,并更新資源。 畫(huà)布流程的完整生存周期如下圖所示。

編輯
為簡(jiǎn)單起見(jiàn),赫茲期貨量化將在一個(gè)名為 “Redraw” 的函數(shù)中暫留 "Erase","Draw","Update"。 在代碼中編寫(xiě)所有內(nèi)容,我們得到以下結(jié)構(gòu)。
//+------------------------------------------------------------------+ //| 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(); ?}