赫茲量化交易軟件:點數(shù)圖指標
簡介
可提供當前市場形勢相關信息的圖表類型多種多樣。許多圖表很久以前就出現(xiàn)了,比如點數(shù)圖。
該圖表類型早在十九世紀末即已聞名遐邇。 Charles Dow 于 1901 年 7 月 20 日為《華爾街日報》撰寫的評論首次提及該圖表,并稱其為“書寫”法。盡管 Dow 早在 1886 年就提到過“書寫”法,但直到這一天,才第一次正式確定其使用。
盡管 Dow 只在評論中介紹了這一方法,但現(xiàn)在您卻可以找到詳述此法的大量書籍。我想給交易新手推薦由 Thomas J. Dorsey 編著的一本書,名為《點數(shù)圖:預測和追蹤市場價格的基本應用》。

編輯切換為居中
說明
點數(shù)圖是一組垂直列:X 列為上升價格,而 O 列則為下滑價格。它是基于價格行為而非時間標繪,這一點獨一無二。因此,從圖表數(shù)據(jù)中移除一個值(時間)后,赫茲量化就得到了以 45 度角標繪的趨勢線。
點數(shù)圖利用兩個預定義值標繪:
格值是指添加一個 X 或一個 O 所需的價格變動量(最初,該值以每股美元數(shù)表示,但隨著時間的推移,它變成了我們將在指標中使用的點)。
轉向值是指將列從 X 變?yōu)?O (或相反變更)所需的、以“格值”表示的價格反轉量(比如說,轉向值為 3,10 點的格值則對應 30 點)。
所以,赫茲量化選擇一個起始點,價格上漲則放上一個 X、下跌則放 O,前提是價格變化值與“格值”和“轉向值”之積相等。而且,如果價格按格值變化繼續(xù)的同一方向移動,那么如是上漲,我們在 X 列的頂部加上一個 X;如是下跌,則在 O 列的底部加上一個 O。如果價格以格值和轉向值的積而向相反方向移動,那么如價格上漲,我們放一個 X;如下跌,則放一個 O。由此分別啟用一個新的 X 列或 O 列。
出于方便考慮,點數(shù)圖通常在方格紙上標繪。為能更好地理解,赫茲量化來看一個點數(shù)圖的小例子。假設我們有下述數(shù)據(jù):
日期
最高價
最低價
07.03.2013 12:00 - 07.03.2013 20:00
1.3117
1.2989
07.03.2013 20:00 - 08.03.2013 04:00
1.3118
1.3093
08.03.2013 04:00 - 08.03.2013 12:00
1.3101
1.3080
08.03.2013 12:00 - 08.03.2013 20:00
1.3134
1.2955
假設格值等于 10,轉向值為 3,我們來繪制點數(shù)圖:
首先,赫茲量化看到價格有 128 點的增長-從 1.2989 到 1.3117,所以我們繪制 12 個 X。
價格隨后從 1.3118 到 1.3093 跌落了 25 點,不足以轉向,所以我們保持不變。
接下來,我們可以看到,價格繼續(xù)降至 1.3080??紤]到之前的值是 1.3118,它現(xiàn)已變動了 38 點,所以我們可以通過添加兩個 O 來啟用一個新列(盡管價格變動超出了三個格值的值,我們卻只放兩個 O,因為 O 的下一列始終以小一個格值開始)。
之后,價格從 1.3080 到 1.3134 上漲了 54 點,隨后又掉落了 179 點,到 1.2955。由此,下一列將包含 4 個 X,之后則是一個由 16 個 O 構成的 O 列。
如下所示:

編輯
圖 1. 日本燭形圖(左)與點數(shù)圖(右)
上面的點數(shù)圖示例是個非常粗略的示例,只是用于輔助初學者更好地理解這一概念。
制圖原則
點數(shù)制圖的技巧有好幾個,上文就講過一個。而這些制圖技巧又根據(jù)其所使用的數(shù)據(jù)而有所區(qū)別。比如說,我們可以使用每日數(shù)據(jù)且不考慮當日波動,即可得到一個粗略的標繪?;蛘?,赫茲量化也可以考慮當日價格波動數(shù)據(jù),從而得到一個更加詳盡且平滑的標繪。
為實現(xiàn)更平滑、更準確的點數(shù)圖,人們決定采用分鐘數(shù)據(jù)來計算和制圖,因為一分鐘內的價格波動不會太大,通常不超過 6 個點,兩三個點也不少見。因此,我們將使用每個分鐘柱上的開盤價數(shù)據(jù)。
制表原則本身相當簡單:
我們取一個起始點,即第一個分鐘柱的開盤價。
而且,如果價格移動的距離大于等于格值與轉向值之積,赫茲量化則分別繪制交易品種(下行為 O,上行為 X)。存儲最后一個交易品種的價格數(shù)據(jù),以供進一步的制圖。
如果價格按格值向同一方向移動,則會繪制對應的一個交易品種。
而且,如果價格轉向,計算將基于最后一個交易品種的價格,而不是兩者中的最高價格。換句話說,如果價格波動未超過格值的 50%,它只是被忽略了。
現(xiàn)在,我們來確定點數(shù)圖的風格。MQL5 語言支持 7 種指標繪圖風格:線條、剖面(段)、直方、箭頭(交易品種)、填充區(qū)域(填充通道)、柱以及日本燭形。
箭頭(交易品種)對于理想的視覺呈現(xiàn)來講堪稱完美,但這種風格要求不同數(shù)量(MQL5 根本不支持)或大量的指標緩沖區(qū),因為列中每一個 X 或 O 的繪制,都需要一個單獨的指標緩沖區(qū)。這就意味著,如果您決定使用這種風格,就要定義波幅并具備足夠的內存資源。
所以,赫茲量化決定將日本燭形作為繪圖風格-即彩色的日本燭形圖。不同的顏色應該用于 X 列與 O 列的區(qū)分。由此,指標僅需要 5 個緩沖區(qū),從而實現(xiàn)可用資源的高效利用。
利用水平線將各列劃分成為格值。得到的結果相當不錯:

編輯切換為居中
圖 2. 利用 EURUSD 指標在日時間框架上制圖
指標的算法
首先,我們需要確定指標的輸入參數(shù)。由于點數(shù)圖并不考慮時間,而且我們使用源于分鐘柱的數(shù)據(jù)進行標繪,所以我們需要確定待處理的數(shù)據(jù)量,以免不必要地占用系統(tǒng)資源。此外,標繪一個使用全部歷史的點數(shù)圖也沒有什么意義。那么,我們引入第一個參數(shù) - History。它會將分鐘柱的數(shù)量納入計算考慮范疇。
而且,我們需要確定“格值”和“轉向值”。為此,赫茲量化將分別引入 Cell 和 CellForChange 變量。我們還會為 X 引入顏色參數(shù) ColorUp,為 O 引入 ColorDown。而最后將是線顏色參數(shù) - LineColor。
// +++ Program start +++ //+------------------------------------------------------------------+ //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? APFD.mq5 | //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Aktiniy ICQ:695710750 | //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ICQ:695710750 | //+------------------------------------------------------------------+ #property copyright "Aktiniy ICQ:695710750" #property link ? ? ?"ICQ:695710750" #property version ? "1.00" //--- Indicator plotting in a separate window #property indicator_separate_window #property indicator_buffers 5 #property indicator_plots ? 1 //--- plot Label1 #property indicator_label1 ?"APFD" #property indicator_type1 ? DRAW_COLOR_CANDLES #property indicator_style1 ?STYLE_SOLID #property indicator_color1 ?clrRed,clrGold #property indicator_width1 ?1 //--- Set the input parameters input int ? History=10000; input int ? Cell=5; input int ? CellForChange=3; input color ColorUp=clrRed; input color ColorDown=clrGold; input color LineColor=clrAqua; //--- Declare indicator buffers double CandlesBufferOpen[]; double CandlesBufferHigh[]; double CandlesBufferLow[]; double CandlesBufferClose[]; double CandlesBufferColor[]; //--- Array for copying calculation data from the minute bars double OpenPrice[]; // Variables for calculations double PriceNow=0; double PriceBefore=0; //--- Introduce auxiliary variables char ? Trend=0; ? ? ?// Direction of the price trend double BeginPrice=0; // Starting price for the calculation char ? FirstTrend=0; // Direction of the initial market trend int ? ?Columns=0; ? ?// Variable for the calculation of columns double InterimOpenPrice=0; double InterimClosePrice=0; double NumberCell=0; // Variable for the calculation of cells double Tick=0; ? ? ? // Tick size double OldPrice=0; ? // Value of the last calculation price //--- Create arrays to temporary store data on column opening and closing prices double InterimOpen[]; double InterimClose[]; // +++ Program start +++
我們現(xiàn)在來研究 OnInit() 函數(shù)。它會將指標緩沖區(qū)綁定到一維數(shù)組。我們還將設置沒有為更精確顯示而渲染的指標值,并
計算用于計算的輔助變量 Tick (一次價格變動的大?。┑闹?。此外,我們還會設定顏色方案,并在指標緩沖區(qū)按時間序列設置索引順序。要便利地計算該指標的值,該步驟必不可少。
// +++ The OnInit function +++ //+------------------------------------------------------------------+ //| Custom indicator initialization function ? ? ? ? ? ? ? ? ? ? ? ? | //+------------------------------------------------------------------+ int OnInit() ?{ //--- indicator buffers mapping ? SetIndexBuffer(0,CandlesBufferOpen,INDICATOR_DATA); ? SetIndexBuffer(1,CandlesBufferHigh,INDICATOR_DATA); ? SetIndexBuffer(2,CandlesBufferLow,INDICATOR_DATA); ? SetIndexBuffer(3,CandlesBufferClose,INDICATOR_DATA); ? SetIndexBuffer(4,CandlesBufferColor,INDICATOR_COLOR_INDEX); //--- Set the value of the indicator without rendering ? PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0); //--- Calculate the size of one tick ? Tick=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE); //--- Set the color scheme ? PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,ColorUp); ? PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,ColorDown); //--- Set the indexing order in arrays as time series ? ArraySetAsSeries(CandlesBufferClose,true); ? ArraySetAsSeries(CandlesBufferColor,true); ? ArraySetAsSeries(CandlesBufferHigh,true); ? ArraySetAsSeries(CandlesBufferLow,true); ? ArraySetAsSeries(CandlesBufferOpen,true); //--- Check the input parameter for correctness ? if(CellForChange<2) ? ? ?Alert("The CellForChange parameter must be more than 1 due to plotting peculiarities"); //--- ? return(0); ?} // +++ The OnInit function +++
赫茲量化已經抵達指標的“核心”,執(zhí)行計算所在的 OnCalculate() 函數(shù)。指標值的計算,被分解成了可從 OnCalculate() 調用的 6 個基本函數(shù)。我們來見識一下:
1. ?復制數(shù)據(jù)的函數(shù)
此函數(shù)會將數(shù)據(jù)從分鐘柱復制到某個計算數(shù)組。首先,我們調整接收數(shù)組的大小,再利用 CopyOpen() 函數(shù)將開盤價復制到其中。
//+------------------------------------------------------------------+ //| Function for copying data for the calculation ? ? ? ? ? ? ? ? ? ?| //+------------------------------------------------------------------+ int FuncCopy(int HistoryInt) ?{ //--- Resize the array for copying calculation data ? ArrayResize(OpenPrice,(HistoryInt)); //--- Copy data from the minute bars to the array ? int Open=CopyOpen(Symbol(),PERIOD_M1,0,(HistoryInt),OpenPrice); //--- ? return(Open); ?}