最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

期貨量化交易軟件:如何編寫快速非重繪鋸齒形調(diào)整浪

2023-08-18 17:06 作者:bili_45793681098  | 我要投稿

簡介

在所有可能的鋸齒形調(diào)整浪繪圖算法中,赫茲期貨量化可以分離出其中一類,作者將其命名為“突破減速水平時轉(zhuǎn)向的鋸齒形調(diào)整浪”。該類,無論是整體還是部分,包含了大多數(shù)已存在的鋸齒形調(diào)整浪。類名稱本身實際上是算法模板。要從中得到指標(biāo),只要添加能夠檢測減速水平的函數(shù)就足夠了。該函數(shù)的算法多樣性僅受限于作者對未來鋸齒形調(diào)整浪的想象力。

編輯切換為居中

一般方法

首先,我們來嘗試制定編寫指標(biāo)的一般方法。于是:

- 任何指標(biāo)(以及任何 EA)的 start() 函數(shù)是一種回調(diào)函數(shù),即調(diào)用來處理一個特定事件的函數(shù)。也就是說,處理一個價格變動。


- 編寫指標(biāo)的目的,一般來說,是計算一個或多個市場特征。跟計算所需要的輔助量一起,它們形成了給定指標(biāo)的關(guān)鍵變量集。赫茲期貨量化定義指標(biāo)的狀態(tài)為那些關(guān)鍵變量在特定時間的數(shù)值集?;谠摱x,赫茲期貨量化可以表述如下:

  • 通過在新的價格變動中計算變量的新值,start() 函數(shù)計算指標(biāo)的新狀態(tài)。

  • 這樣,start() 函數(shù)實際上成為將指標(biāo)從一個狀態(tài)轉(zhuǎn)換到另一個狀態(tài)的運算符。

- 如此說來,編寫指標(biāo)的過程就成了確定描述其狀態(tài)(狀態(tài)變量)的量集,以及編寫在新的價格變動出現(xiàn)時將指標(biāo)轉(zhuǎn)換為新狀態(tài)的運算符。狀態(tài)變量的初始化變成指標(biāo)算法的基本部分。赫茲期貨量化將以某種類型的鋸齒形調(diào)整浪演示如何實現(xiàn)。

所討論的是什么鋸齒形調(diào)整浪

如本文以上所述,赫茲期貨量化對于在突破減速水平時轉(zhuǎn)向的鋸齒形調(diào)整浪感興趣。什么是“減速水平”?假設(shè)我們要編寫一個鋸齒形調(diào)整浪,當(dāng)價格從峰值移動 H 個點時其峰值是固定的。峰值固定意味著某段鋸齒形調(diào)整浪轉(zhuǎn)到相反方向。赫茲期貨量化只固定最小值,現(xiàn)在就處于上升段。為一個不完整的上升段引入一個價格時間最大值的變量,TempMax。如果價格突破以下水平,我們將固定該最大值(并轉(zhuǎn)向):

SwitchLevel = TempMax - H *Point 。

如果時間最大值在轉(zhuǎn)向前更新,我們就必須計算 SwitchLevel 的新值。這樣,SwitchLevel 將跟隨時間最大值,位于其后 H 個點處。

對于下降段,情形完全對稱。SwitchLevel 將跟隨時間最小值(TempMin),同樣位于其后 H 個點。但現(xiàn)在,我們有:

SwitchLevel = TempMin + H *Point。

事實上,我們僅描述了將要創(chuàng)建的鋸齒形調(diào)整浪減速水平的計算方法。顯然,這不是唯一的算法。例如,如果我們將通道的上下邊界視為減速水平,我們將得到跟通道計算方法同樣多的鋸齒形調(diào)整浪。此外,經(jīng)過仔細(xì)考慮后發(fā)現(xiàn),作者所知的絕大多數(shù)鋸齒形調(diào)整浪均完全或部分的包含在考慮的類別中。但并非全部。例如,在威廉姆的分形上計算的鋸齒形調(diào)整浪無法包含在此類別中。

鋸齒形調(diào)整浪模型

赫茲期貨量化現(xiàn)在決定鋸齒形調(diào)整浪狀態(tài)的變量。

首先,這將會是當(dāng)前段的方向。赫茲期貨量化將相應(yīng)的變量命名為 UpZ,對上升段賦值為true,對下降段賦值為false。

顯然,我們應(yīng)該將上面引入的 TempMax 和 TempMin 添加到列表。我們還將添加其時間坐標(biāo)。但是,在定義測量單位時,我們有一些自由度。對于時間坐標(biāo),赫茲期貨量化將使用從圖表頭部開始的柱數(shù),即我們將使用跟 MT4 中接受的剛好相反的編號系統(tǒng)。這會簡化代碼并提高執(zhí)行率。這樣,列表將添加 TempMaxBar 和 TempMinBar 變量。

我們計劃在圖表上繪制鋸齒形調(diào)整浪并使用。所以我們將向列表添加最后固定的鋸齒形調(diào)整浪峰值坐標(biāo):CurMax, CurMaxBar, CurMin, CurMinBar。

這就是列表要添加的內(nèi)容。具體鋸齒形調(diào)整浪的個體作者可以根據(jù)他/她對鋸齒形調(diào)整浪的處理自由補充列表。例如,可能需要添加之前峰值的坐標(biāo):PreMax、PreMaxBar、PreMin、PreMinBar?;蛘?,在這種情況下,你可能需要使用數(shù)組添加預(yù)定義數(shù)量的之前峰值的坐標(biāo)。

轉(zhuǎn)移運算符

在這種方法中,為鋸齒形調(diào)整浪編寫轉(zhuǎn)移運算符變?yōu)橄喈?dāng)簡單的任務(wù)。赫茲期貨量化只需將感興趣的鋸齒形調(diào)整浪類別的定義轉(zhuǎn)化為 MQL4。呈現(xiàn)如下:

// First, process the case of an up-segment ? ?if (UpZ) { // Check whether the current maximum has changed ? ? ?if (High[pos]>TempMax) { // If yes, then correct the corresponding variables ? ? ? ?TempMax = High[pos]; ? ? ? ?TempMaxBar = Bars-pos; ?// Here switching to direct numbering ? ? ?} else { // If not, then check whether the slowing level has been broken through ? ? ? ?if (Low[pos]<SwitchLevel()) { // If yes, then fix the maximum ? ? ? ? ?CurMax = TempMax; ? ? ? ? ?CurMaxBar = TempMaxBar; // And draw a peak ? ? ? ? ?ZZ[Bars-CurMaxBar]=CurMax; ?// Here switching to reverse numbering // Correct the corresponding variables ? ? ? ? ?UpZ = false; ? ? ? ? ?TempMin = Low[pos]; ? ? ? ? ?TempMinBar = Bars-pos; ?// Here switching to direct numbering ? ? ? ?} ? ? ?} ? ?} ?else { // Now processing the case of down-segment // Check whether the current minimum has changed ? ? ?if (Low[pos]<TempMin) { // If yes, then correct the corresponding variables ? ? ? ?TempMin = Low[pos]; ? ? ? ?TempMinBar = Bars-pos; ?// Here switching to direct numbering ? ? ?} else { // If not, then check whether the slowing level has been broken through ? ? ? ?if (High[pos]>SwitchLevel()) { // If yes, then fix the minimum ? ? ? ? ?CurMin = TempMin; ? ? ? ? ?CurMinBar = TempMinBar; // And draw a peak ? ? ? ? ?ZZ[Bars-CurMinBar]=CurMin; ?// Here switching to reverse numbering // Correct the corresponding variables ? ? ? ? ?UpZ = true; ? ? ? ? ?TempMax = High[pos]; ? ? ? ? ?TempMaxBar = Bars-pos; ?// Here switching to direct numbering ? ? ? } ? ? ?} ? ?}

轉(zhuǎn)移運算符已經(jīng)就緒?,F(xiàn)在我們可以隨時引用指標(biāo)的狀態(tài)變量。

但是,這種運算符有一種特性,在繪制鋸齒形調(diào)整浪時會被認(rèn)為是錯誤。讓我們更加詳細(xì)的討論以下片段:

? ? ?if (High[pos]>TempMax) { // If yes, then correct the corresponding variables ? ? ? ?TempMax = High[pos]; ? ? ? ?TempMaxBar = Bars-pos; ?// Here switching to direct numbering ? ? ?} else { // If not, then check whether the slowing level has been broken through ? ? ? ?if (Low[pos]<SwitchLevel()) { // If yes, then fix the maximum ? ? ? ? ?CurMax = TempMax; ? ? ? ? ?CurMaxBar = TempMaxBar;

使用 if - else 語句對意味著不考慮包含 TempMax 的柱的 Low 。當(dāng)出現(xiàn)價格變?yōu)榈陀谙乱粋€固定最小值的情況時,可以認(rèn)為是鋸齒形調(diào)整浪繪制錯誤。這是錯誤嗎?

考慮到對于歷史記錄和實時中效果必須一致,作者認(rèn)為這不是錯誤。事實上,在一個時間范圍內(nèi),赫茲期貨量化將永遠(yuǎn)不會知道之前歷史發(fā)生的事情,柱的最高值或最低值。這里使用 if - else 結(jié)構(gòu)意味著進(jìn)行刻意的決策:我們喜歡動量。這意味著犧牲上升段的最小值和下降段的最大值。時間范圍越小,這種兩難困境發(fā)生的頻率就越低,這是有道理的。

另一個片段需要一些注釋:

// Correct the corresponding variables ? ? ? ? ?UpZ = false; ? ? ? ? ?TempMin = Low[pos]; ? ? ? ? ?TempMinBar = Bars-pos; ?// Here switching to direct numbering ? ? ? ?} ? ? ?}

事實上,這里時間最小值檢驗的起始點是為區(qū)段之間的轉(zhuǎn)向時刻設(shè)置的。它對于給出的示例是有道理的,但在一般情況下,你一定不要這樣做。在從固定最大值到當(dāng)前位置(即到轉(zhuǎn)向時刻)的最小時間間隔設(shè)置臨時最小值更加合理。代碼可如下所示:

? // Correct the corresponding variables ? ? ? ? ?UpZ = false; ? ? ? ? ?TempMinBar = CurMaxBar+1; ? ? ? ? ?TempExtPos = Bars - TempMinBar; ?// Here switching to reverse numbering ? ? ? ? ?TempMin = Low[TempExtPos]; ? ? ? ? ?for (i=TempExtPos-1;i>=pos;i--) { ? ? ? ? ? ?if (Low[i]<TempMin) { ? ? ? ? ? ? ?TempMin = Low[i]; ? ? ? ? ? ? ?TempMinBar = Bars-i; ?// Here switching to direct numbering ? ? ? ? ? ?} ? ? ? ? ?}

這里,最小值已經(jīng)固定的柱的 Low 不再予以考慮。

這兩個注意事項也關(guān)乎對下降段的處理。

指標(biāo)

現(xiàn)在只需要完成指標(biāo),使其正常作用。不需要在 init() 和 deinit() 上注釋,因為一切都很清楚和標(biāo)準(zhǔn)。但是,我們將對函數(shù) start() 做出一個重要決定。赫茲期貨量化將只使用完整的柱。這樣做的主要原因是可以實現(xiàn)簡單緊湊的代碼結(jié)構(gòu)。

還有另一個相關(guān)的重要考慮。在交易系統(tǒng)上的嚴(yán)肅工作意味著收集歷史統(tǒng)計數(shù)據(jù)。只有實時獲得的特征跟從歷史獲得的特征完全一致時,統(tǒng)計數(shù)據(jù)才有效(正確)。赫茲期貨量化沒有真實價格變動的歷史記錄,所以只能在完整的柱上實時實現(xiàn)完全一致性。對于減小延遲,我們能做的最多是采用較小的時間范圍,減小至 M1。

另一個重要的特點是不要使用 IndicatorCounted() 函數(shù)。這樣做的主要原因是使用的代碼需要另一個重要操作 - 指標(biāo)狀態(tài)變量的初始化。這無法在函數(shù) init() 完成,因為使用直接編號要求在歷史記錄提取時重新計算指標(biāo),從而要重新初始化狀態(tài)變量。init() 函數(shù)并非在歷史記錄提取時啟動。

因此,我們必須再添加一個“標(biāo)準(zhǔn)”函數(shù) Reset()。最終,使用 IndicatorCounted() 的想法并沒有多大幫助,因為影響了對這種類型的指標(biāo)組織必要的重新計算檢驗。該檢驗實現(xiàn)如下:

int start() { // ?Work with completed bars only ?if (Bars == PreBars) return(0); ? // ?Check whether there are enough bars on the chart ?if (Bars < MinBars) { ? ?Alert(": Not enough bars on the chart"); ? ?return(0); ?} ? // ?If the history was not pumped, make calculations for the bar just completed ?if (Bars-PreBars == 1 && BarTime==Time[1]) StartPos = 1; // ?Otherwise, count the number of bars specified in function Reset() ?else StartPos = Reset(); // Modify check variables ?PreBars = Bars; ? ?BarTime=Time[0]; // Cycle on history ?for (pos=StartPos;pos>0;pos--) {

Reset() 函數(shù)呈現(xiàn)如下:

int Reset() { ?if (MinBars == 0) MinBars = Bars-1; ?StartPos = MinBars; ?PreBars = 0; ?BarTime = 0; ?dH = H*Point; ?UpZ = true; ?TempMaxBar = Bars-StartPos; ?TempMinBar = Bars-StartPos; ?TempMax = High[StartPos]; ?TempMin = Low[StartPos]; ?StartPos++; ?return(StartPos); }

這里我們特別注意一下附加變量 dH ,赫茲期貨量化將轉(zhuǎn)換為價格范圍的鋸齒形調(diào)整浪轉(zhuǎn)向閥值(H )永久分配給它??赡軙a(chǎn)生一個問題:為什么是 UpZ = true,而不是 false?答案很簡單。在少量的片段后,不管 UpZ 的初始值如何,指標(biāo)會得到相同的圖形。

最終,減速水平的計算如下:

double SwitchLevel() { ?double SwLvl; ?if (UpZ) SwLvl = TempMax - dH; ?else SwLvl = TempMin + dH; ?return(SwLvl); }

這里一切都很清楚了。


期貨量化交易軟件:如何編寫快速非重繪鋸齒形調(diào)整浪的評論 (共 條)

分享到微博請遵守國家法律
江源县| 南昌县| 开江县| 抚顺市| 峨山| 民丰县| 得荣县| 吉林省| 铜陵市| 濉溪县| 淅川县| 江山市| 忻城县| 华亭县| 攀枝花市| 泾阳县| 邯郸市| 昭通市| 自治县| 宾川县| 达日县| 钦州市| 保靖县| 兰考县| 新化县| 云梦县| 田林县| 淅川县| 田东县| 内乡县| 娄底市| 渝北区| 资阳市| 汝阳县| 义马市| 海伦市| 同德县| 昌黎县| 旬阳县| 长岛县| 中西区|