股票量化交易軟件:赫茲量化中將指標(biāo)應(yīng)用至其他指標(biāo)
基于其他指標(biāo)的值的自定義指標(biāo)
在編寫使用??函數(shù)調(diào)用的簡短形式的指標(biāo)時(shí),您可能會(huì)忽略這樣一個(gè)事實(shí),即指標(biāo)的計(jì)算不僅可以通過價(jià)格數(shù)據(jù)完成,還可以通過其他指標(biāo)(無論是內(nèi)置指標(biāo)還是自定義指標(biāo))的數(shù)據(jù)實(shí)現(xiàn)。
讓我們做一個(gè)簡單的嘗試:將內(nèi)置 RSI 指標(biāo)及標(biāo)準(zhǔn)設(shè)置附于圖表,并將??自定義指標(biāo)拖至 RSI 指標(biāo)窗口中。在顯示窗口的?Parameters(參數(shù))選項(xiàng)卡中,指定指標(biāo)應(yīng)應(yīng)用至?Previous Indicator's Data(上一指標(biāo)數(shù)據(jù))(RSI(14))。赫茲量化軟件
結(jié)果與我們的預(yù)期將大相庭徑。TSI 指標(biāo)的附加線未在 RSI 指標(biāo)窗口中出現(xiàn),且在“數(shù)據(jù)窗口”中您會(huì)發(fā)現(xiàn)其值也同樣不清楚。
盡管事實(shí)如此,RSI 的值的定義幾乎貫穿整個(gè)歷史數(shù)據(jù),但 TSI 的值(應(yīng)用至 RSI 數(shù)據(jù))要么完全缺失(在開始時(shí))要么始終為 -100:
此現(xiàn)象由?begin?參數(shù)的值未在 True_Strength_Index_ver2.mq5 的?中到處使用的事實(shí)導(dǎo)致。begin?參數(shù)指定?price[]?輸入?yún)?shù)中空值的數(shù)量。這些空值無法用于指標(biāo)值的計(jì)算。讓我們回憶一下?函數(shù)調(diào)用第一種形式的定義。赫茲量化軟件
int OnCalculate (const int rates_total,??????// price[]數(shù)組大小; ???????????????? const int prev_calculated,??// 上次調(diào)用計(jì)算后的價(jià)格柱的數(shù)量 ???????????????? const int begin,????????????// price[]數(shù)組開始計(jì)算的索引 ???????????????? const double& price[]?????? // 指標(biāo)計(jì)算的依據(jù)數(shù)組 ?? );
在將指標(biāo)應(yīng)用至指定之一的價(jià)格數(shù)據(jù)時(shí),begin?參數(shù)等于 0,因?yàn)楦鱾€(gè)柱均有指定的價(jià)格類型。因此,price[]?輸入數(shù)組始終從其第一個(gè)元素?price[0]?起具有正確的數(shù)據(jù)。但是,如果我們指定其他指標(biāo)的數(shù)據(jù)作為計(jì)算源,這一點(diǎn)將不再得到保證。赫茲量化軟件
OnCalculate() 的?begin?參數(shù)
如果計(jì)算是使用其他指標(biāo)的數(shù)據(jù)執(zhí)行,讓我們檢查一下?price[]?數(shù)組包含的值。為此,我們將在 OnCalculate() 函數(shù)中添加一些代碼,以便輸出我們希望檢查的值?,F(xiàn)在 OnCalculate() 函數(shù)的起始部分如下所示:
//+------------------------------------------------------------------+ //| 自定義指標(biāo)迭代函數(shù) ? ? ? ? ? ? ? ? ? ??????????????????????????? ? ?| //+------------------------------------------------------------------+ int OnCalculate (const int rates_total,????// price[]數(shù)組大小; ???????????????? const int prev_calculated,// 上次調(diào)用計(jì)算后的價(jià)格柱的數(shù)量; ???????????????? const int begin,??????????// price[]數(shù)組開始計(jì)算的索引 ???????????????? const double &price[])????// 指標(biāo)計(jì)算的依據(jù)數(shù)組; ??{ //--- 確定price[]數(shù)組數(shù)值僅輸出一次的標(biāo)志 ?? static bool printed=false; //--- 如果begin變量不為0,有些數(shù)值不應(yīng)該被計(jì)算在內(nèi) ?? if(begin>0 && !printed) ???? { ????? //--- 讓我們輸出這個(gè)數(shù)值 ????? Print("用于計(jì)算的數(shù)據(jù)索引begin等于 ",begin, ????????????"? ?price[] 數(shù)組長度 =",rates_total); ????? //--- 讓我們顯示不應(yīng)該計(jì)算的數(shù)值 ????? for(int i=0;i<=begin;i++) ????????{ ???????? Print("i =",i,"??value =",price[i]); ????????} ????? //--- 設(shè)置標(biāo)志確定我們已經(jīng)記錄了這些數(shù)值 ????? printed=true; ???? }
讓我們再次將修改后的指標(biāo)拖至 RSI(14) 窗口,然后指定將上一指標(biāo)的數(shù)據(jù)用于計(jì)算。隨后我們將會(huì)看到未被繪制且不應(yīng)用于計(jì)算的值,此時(shí)使用 RSI(14) 指標(biāo)的值。
指標(biāo)緩沖區(qū)中的空值和 DBL_MAX
price[] 數(shù)組的前 14 個(gè)元素(索引從 0 至 13,含 0 和 13)具有相同的值?1.797693134862316e+308。該值是內(nèi)置常量的數(shù)字值,出現(xiàn)極為頻繁,用于指出指標(biāo)緩沖區(qū)中的空值。赫茲量化軟件
在空值中填入零并不是通用的解決方案,因?yàn)樵撝悼赡苁瞧渌笜?biāo)的計(jì)算結(jié)果。由于上述原因,客戶端的所有內(nèi)置指標(biāo)均返回該數(shù)值為空值。之所以選擇值 1.797693134862316e+308 是因?yàn)樗强赡艿淖畲笮椭担硪粋€(gè)原因是它可以作為常量方便地在 MQL5 中呈現(xiàn)。
要檢查某個(gè)雙精度型數(shù)值是否為空,可將其與?或??常量進(jìn)行比較。兩個(gè)變量的值相等,但為了使代碼一目了然,最好是使用??常量。赫茲量化軟件
//+------------------------------------------------------------------+ //| 針對空值返回 true ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | //+------------------------------------------------------------------+ bool isEmptyValue(double value_to_check) ??{ //--- 如果數(shù)值等于 DBL_MAX, 表明是個(gè)空值 ?? if(value_to_check==EMPTY_VALUE) return(true); //--- 不等于 DBL_MAX ?? return(false); ??}