量化交易軟件下載: 赫茲量化NRTR 指標(biāo)和交易模塊
基于 NRTR 指標(biāo)的交易系統(tǒng)屬于突破策略。當(dāng)價(jià)格超過(guò)某個(gè)周期的前一高點(diǎn)時(shí), 會(huì)產(chǎn)生一個(gè)買(mǎi)入信號(hào); 當(dāng)價(jià)格跌至前一低點(diǎn)時(shí)產(chǎn)生賣(mài)出信號(hào)。在趨勢(shì)變化期間, 這種系統(tǒng)也許會(huì)使用前一趨勢(shì)的高點(diǎn)和低點(diǎn)。為了避免這種情況, 計(jì)算周期在我們的系統(tǒng)中會(huì)動(dòng)態(tài)設(shè)置。
作者已經(jīng)將 NRTR 定義為 動(dòng)態(tài)價(jià)格通道突破的趨勢(shì)指標(biāo)。
指標(biāo)操作原則如下: 在上升趨勢(shì)中, 指標(biāo)線 (通道) 處于指定時(shí)間段內(nèi)檢測(cè)到的高位之下的某個(gè)價(jià)位。下降趨勢(shì)線處于價(jià)格之上, 與某個(gè)時(shí)間段內(nèi)的價(jià)格低點(diǎn)處于恒定的距離。
用于指標(biāo)計(jì)算的價(jià)格通道周期從趨勢(shì)起點(diǎn)開(kāi)始動(dòng)態(tài)增加。因此, 前一個(gè)計(jì)算周期的價(jià)格不會(huì)影響指標(biāo)。
從圖例中可以看出, 指標(biāo)首先以的一定距離跟隨趨勢(shì)。指標(biāo)位于距本地高點(diǎn) H1 和 H2 固定的距離。本地高點(diǎn) H3 低于前一個(gè), 則不用于計(jì)算。
然后價(jià)格在 L3 點(diǎn)突破了通道。這是一個(gè)賣(mài)出信號(hào)。L3 點(diǎn)的值被設(shè)置為新的低點(diǎn)。新周期從這一點(diǎn)開(kāi)始, 即之前的所有價(jià)格均被重置, 不再用于將來(lái)的計(jì)算。隨著趨勢(shì)的發(fā)展, 最低值更新為 L3-L4-L5。動(dòng)態(tài)價(jià)格通道的周期將延長(zhǎng), 直到趨勢(shì)發(fā)生變化或周期長(zhǎng)度達(dá)到所允許的最大值。
通道寬度按極值的百分比計(jì)算, 或是依據(jù)價(jià)格波動(dòng)。這兩種方法在本文中均已實(shí)現(xiàn)。
買(mǎi)入/賣(mài)出信號(hào)在價(jià)格突破通道邊界線時(shí)產(chǎn)生。買(mǎi)入信號(hào)在價(jià)格突破支撐線時(shí)形成。如果突破了阻力線, 則形成賣(mài)出信號(hào)。
現(xiàn)在, 我們需要將指標(biāo)操作原則的描述轉(zhuǎn)換為 MQL5。我們這就開(kāi)始。
編寫(xiě)指標(biāo): 從簡(jiǎn)單到復(fù)雜
首先, 我們需要定義指標(biāo)的行為。指標(biāo)將基于收盤(pán)價(jià)。基于歷史數(shù)據(jù)的指標(biāo)值被明確解釋。但若是價(jià)格突破不完整燭條的支撐/阻力線會(huì)怎樣呢?在這個(gè)版本中, 趨勢(shì)沒(méi)有形成, 因此在燭條完整成形之前不會(huì)產(chǎn)生信號(hào)。一方面, 我們可能會(huì)錯(cuò)過(guò)走勢(shì)的一部分。例如, 如果走勢(shì)開(kāi)始于一根巨大燭條突破通道, 只有在下一根燭條開(kāi)盤(pán)時(shí)才會(huì)開(kāi)倉(cāng)。另一方面, 這是防止大量假突破所做的保護(hù)。
注意: 指標(biāo)有許多變體, 本文只針對(duì)作者提出的原始版本進(jìn)行描述。
該指標(biāo)的實(shí)現(xiàn)可在代碼庫(kù)找到, 但其周期只是部分為動(dòng)態(tài)的。當(dāng)趨勢(shì)發(fā)生變化時(shí), 這個(gè)周期會(huì)被重新設(shè)定, 但在理論上可以無(wú)止境地延伸。即, 支撐線以前值的 MathMax() 和當(dāng)前收盤(pán)價(jià)計(jì)算。在這種情況下, 支撐線只能上升, 而阻力線總是下降。在原始版本中, 所有較早的數(shù)值均被認(rèn)定過(guò)時(shí), 從而被忽略。此處的最大值/最小值計(jì)算為 ArrayMaximum/Minimum(close,i,dynamic_period)。在這種方式下, 支撐線和阻力線都會(huì)上漲和下跌。因此, 在動(dòng)態(tài)周期較短的情況下, 支撐線可能在一些舒緩的區(qū)間震蕩走勢(shì)情況下深度下移。但是這種平滑的長(zhǎng)期趨勢(shì)很罕見(jiàn), 兩種方法都不是很理想。在本文中, 我們堅(jiān)持指標(biāo)作者最初提出的想法。
下一次滯留與時(shí)間序列有關(guān)。MQL5 中的價(jià)格系列 (收盤(pán)) 默認(rèn)值為 ArraySetAsSeries = false。MQL4 中的價(jià)格系列帶有一個(gè)時(shí)間序列標(biāo)志, 它們的 Close[0] 值是最右邊柱線的收盤(pán)價(jià) (此刻最左邊的柱線按規(guī)定是不可見(jiàn)的)。請(qǐng)注意, 在本文中 ArraySetAsSeries(close,true)。
現(xiàn)在我們繼續(xù)實(shí)現(xiàn)這個(gè)指標(biāo)。我們將處理四個(gè)指標(biāo)緩沖區(qū): 其中兩個(gè)用于支撐/阻力線, 另外兩個(gè)用于買(mǎi)入和賣(mài)出信號(hào)。
#property indicator_chart_window #property indicator_buffers 4 #property indicator_plots ? 4 //指標(biāo)線條樣式 #property indicator_type1 ?DRAW_LINE #property indicator_color1 Green #property indicator_style1 STYLE_DASH #property indicator_type2 ?DRAW_LINE #property indicator_color2 Red #property indicator_style2 STYLE_DASH #property indicator_type3 ?DRAW_ARROW #property indicator_color3 Green #property indicator_type4 ?DRAW_ARROW #property indicator_color4 Red
我們來(lái)聲明指標(biāo)緩沖區(qū)和指標(biāo)的外部參數(shù)
input int ? ?period =12; ? ? ?//動(dòng)態(tài)周期 input double percent =0.2; ? ?//縮進(jìn)百分比 double Buff_Up[],Buff_Dn[]; ? double Sign_Up[],Sign_Dn[];
指標(biāo)信號(hào)將在圖表上顯示為箭頭。其余參數(shù)在 OnInit() 函數(shù)中設(shè)置。我的 DRAW_ARROW 參數(shù)來(lái)自 Wingdings 字符集, 編號(hào)為 236, 238。"向上" 信號(hào)的參數(shù):
? SetIndexBuffer(2,Sign_Up,INDICATOR_DATA); ? PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0.0); ? PlotIndexSetInteger(2,PLOT_ARROW,236); ? PlotIndexSetInteger(2,PLOT_LINE_WIDTH,1); ? ArraySetAsSeries(Sign_Up,true);
在 OnCalculate() 中開(kāi)始計(jì)算時(shí), 我們檢查所需數(shù)據(jù)的可用性以及指標(biāo)是否首次開(kāi)始計(jì)算。
//+------------------------------------------------------------------+ //| 自定義指標(biāo)迭代函數(shù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, ? ? ? ? ? ? ? ?const int prev_calculated, ? ? ? ? ? ? ? ?const datetime &time[], ? ? ? ? ? ? ? ?const double &open[], ? ? ? ? ? ? ? ?const double &high[], ? ? ? ? ? ? ? ?const double &low[], ? ? ? ? ? ? ? ?const double &close[], ? ? ? ? ? ? ? ?const long &tick_volume[], ? ? ? ? ? ? ? ?const long &volume[], ? ? ? ? ? ? ? ?const int &spread[]) { ? ?int start =0; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //計(jì)算的起始點(diǎn) ? ?int trend =0; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //趨勢(shì)值, 0 向上 -1 向下 ?static int trend_prev =0; ? ?double value =0; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//指標(biāo)值 ? ?static double value_prev =0; ? ?int dyn_period =1; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //動(dòng)態(tài)周期值 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?static int curr_period =1; ? ? ?double maxmin =0; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //用于計(jì)算的技術(shù)變量 ? ?ArraySetAsSeries(close,true); ? ?if(rates_total<period) return(0); ? ? ? if(prev_calculated==0) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 檢查指標(biāo)計(jì)算的首次開(kāi)始 ?{ ? ? ?start=rates_total-1; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 所有柱線的起始計(jì)算索引 ? ? ?trend_prev =1; ? ? ?value=close[start]*(1-0.01*percent); ? ? ? ?} ? ?else ? ? { ? ? ?start=rates_total-prev_calculated; ? ? ? ? ? ? ? ? ?// 新柱線的起始計(jì)算索引 ? ? } trend =trend_prev; value =value_prev; dyn_period =curr_period;