自訂指標的基礎知識 | IFCM
IFC Markets - 外匯交易

自訂指標的基礎知識

引言

本文的通過舉例來解釋創建自訂指標的原理, 程式師可以在語言NTL+中開始創建的第一步.


在創建自訂指標時, 您需要確定指標的演算法, 如何計算指標緩衝區的值, 並如何顯示在螢幕中. 這些值的正確編輯是指標的最終目的


作為創建指標的例子, 將展示大量收盤價大於收盤價的柱圖和收盤價小於開盤價的柱圖的區別 ; 這些區別在n個區間中積累. 我們將展示該指標以長條圖的形式顯示在單獨的視窗中.


編寫腳本代碼

我們的演算法非常簡單並且直觀, 可以在圖表中輕鬆查看指標的工作. 對於每個第i個柱圖, 我們將分析前n個柱圖並形成統計, 如果檢測到柱圖上升, 則加1, 相反則減1.

img

讓我們來看一下指標的代碼.


開始需要聲明指標用到的所有參數.

#set_indicator_separate
double ExtMapBuffer1[];
int ExtCountedBars=0;
extern int period = 10;

預處理指令#set_indicator_separate指示我們將在單獨的視窗中輸出圖表, 並不在主圖表中疊加. 在下一行聲明了一個全域陣列ExtMapBuffer1, 其中將保存指標緩存區的值. 注意我們不會設置該陣列的大小, 因為編輯器自動分配記憶體 .


在陣列ExtMapBuffer1 中實際保存的是點的座標值, 陣列索引確定橫坐標. 之後我們初始化參數ExtCountedBars為0. 該參數將保存已經計算的數量. 因此我們不需要每次都計算所有的柱圖, 這大大加快了指標值的計算; 指標圖表的運行將更快. 在下一行聲明全域變數period , 其用來保存計算設定統計的區間的數量. 注意extern的使用使得我們可以不需要編譯通過指標屬性直接修改參數.


分析函數Initialize(), 將指定每個指標的基礎設置.


int Initialize() { Indicator.SetIndexCount(1); Indicator.SetIndexBuffer(0,ExtMapBuffer1); Indicator.SetIndexStyle(0,ltHistogram,lsSolid,5,clrBlue); return(0); }

Indicator 的對象SetIndexCount 放置指標的值的緩存數量. 帶有值的緩存ExtMapBuffer1我們只有一個, 因此指明作為唯一參數為1. 同樣我們需要將緩存的號碼與帶有緩存值的數字聯繫起來. 該聯繫將在行SetIndexBuffer(0,ExtMapBuffer1)給出, 在該處定義描述來自緩存ExtMapBuffer1非零指標的屬性.


下麵一行中, 我們設置指標的屬性. SetIndexStyle的第一個參數提供緩衝號; 我們指定SetIndexBuffer值為0. 第二個參數指定渲染類型:柱狀圖。第三參數指定lsSolid的樣式(事實上, 可以設置為任意值, 因此該選項只影響線和寬度)。下一個參數設定clrBlue線寬度5和顏色為藍色(顏色也可設定為RGB格式, 例如, 0x0000FF).


之後運行函數Run(), 該函數完成基本的檢測並執行使用者函數draw(). 函數draw() 完成所有計算.


int Run() { ExtCountedBars=Indicator.Calculated; if (ExtCountedBars < 0) { System.Print("Error"); return(-1); } draw(); return(0); }

在全域變數ExtCountedBars 導入柱圖數, 該數在最後調用後不會改變. 對於這些值, 我們已經全部計算過, 因此不需要再次計算. 之後, 當ExtCountedBars < 0 , 停止指標的工作. 之後引用函數draw(), 計算數值並將起放置到指標的緩存區.


void draw() { int pos=Chart.Bars-ExtCountedBars-1; int value; while(pos>=0) { value=0; for(int i=pos;i < pos+period && i < Chart.Bars-1;i++) { if(Open[i] < Close[i]) value+=1; else value-=1; } ExtMapBuffer1[pos]=value; pos--; } }

在行«int pos=Chart.Bars-ExtCountedBars-1;» 中確定頭寸, 開始計算從舊的資料到新的資料的值. 當總的柱圖數量相同, Chart.Bars''最遠的''的元素具有指數Chart.Bars-1, 而考慮到已經計算的柱圖數: Chart.Bars-ExtCountedBars-1. 參數value 用於收集統計資訊. 然後, Chart.Bars-ExtCountedBars - 1至0的迴圈, 對於每個柱圖收集統計不超過period頭寸(我們不需要計算未載入資料的值).


收集全部整體代碼:


#set_indicator_separate double ExtMapBuffer1[]; int ExtCountedBars=0; extern int period = 10; int Initialize() { Indicator.SetIndexCount(1); Indicator.SetIndexBuffer(0,ExtMapBuffer1); Indicator.SetIndexStyle(0,ltHistogram,lsDot,5,clrBlue); return(0); } int Run() { ExtCountedBars=Indicator.Calculated; if (ExtCountedBars < 0) { System.Print("Error"); return(-1); } draw(); System.Print("ExtCountedBars="+ExtCountedBars); return(0); } void draw() { int pos=Chart.Bars-ExtCountedBars-1; int value; while(pos>=0) { value=0; for(int i=pos;i < pos+period && i < Chart.Bars-1;i++) { if(Open[i] < Close[i]) value+=1; else value-=1; } ExtMapBuffer1[pos]=value; pos--; } }

現在讓我們做一個略有改善的指標:負的行會顯示一種顏色, 正面的 - 另一種. 與此同時,每種柱體也將具有兩種顏色. 對此我們需要建立4個緩衝器。


#set_indicator_separate double ExtMapBuffer1[]; double ExtMapBuffer2[]; double ExtMapBuffer3[]; double ExtMapBuffer4[]; int ExtCountedBars=0; extern int period = 10; int Initialize() { Indicator.SetIndexCount(4); Indicator.SetIndexBuffer(0,ExtMapBuffer1); Indicator.SetIndexStyle(0,ltHistogram,lsDot,5,clrBlue); Indicator.SetIndexBuffer(1,ExtMapBuffer2); Indicator.SetIndexStyle(1,ltHistogram,lsDot,5,clrGreen); Indicator.SetIndexBuffer(2,ExtMapBuffer3); Indicator.SetIndexStyle(2,ltHistogram,lsDot,5,clrRed); Indicator.SetIndexBuffer(3,ExtMapBuffer4); Indicator.SetIndexStyle(3,ltHistogram,lsDot,5,clrLime); return(0); } int Run() { ExtCountedBars=Indicator.Calculated; if (ExtCountedBars < 0) { System.Print("Error"); return(-1); } draw(); return(0); } void draw() { int pos=Chart.Bars-ExtCountedBars-1; int value; while(pos>=0) { value=0; for(int i=pos;i < pos+period && i < Chart.Bars-1;i++) { if(Open[i] < Close[i]) value+=1; else value-=1; } if(value>0) { ExtMapBuffer1[pos]=value; ExtMapBuffer2[pos]=0; ExtMapBuffer3[pos]=1; ExtMapBuffer4[pos]=0; } if(value==0) { ExtMapBuffer1[pos]=0; ExtMapBuffer2[pos]=0; ExtMapBuffer3[pos]=0; ExtMapBuffer4[pos]=0; } if(value < 0) { ExtMapBuffer1[pos]=0; ExtMapBuffer2[pos]=value; ExtMapBuffer3[pos]=0; ExtMapBuffer4[pos]=-1; } } pos--; } }

帶有不同顏色柱體的新版本指標:

img

在編寫指標代碼時, 您可能會看到在''運行函式呼叫失敗消息(run函式呼叫不成功).這個錯誤是最有可能是存儲值至不存在的指標. 因此, 如果出現這樣的消息, 您需要仔細檢查緩衝區陣列的索引值.


指標

在本文中, 我們詳細的創建了第一個指標. 並且實現最大簡化NTL+的腳本代碼. 為大家提供了一個詳細創建指標的實踐.

Close support
Call to Skype Call to QQ Call Back