如何找出一定Bar數量的 K線前期高低點
今天我們來討論一下: 如何找出一定Bar數量的 K線前期高點、低點。並且實現一個小 DEMO 來 測試。
平時經常聽到技術分析流派關於 K線中前期高低點,或者 指標圖形中 前期高低點的討論,甚至有不少手動交易策略思路中包含了關於圖形走勢高低點的使用。那麼這些關於高低點的判斷或者使用是可以量化的麼?
通常這些高低點都作為 行情的轉折點使用,比如 突破位、阻力位 等等。。
那麼如何讓程式去識別、找到這些點位,以便使用呢?
在找之前需要明確一些條件(討論,歡迎留言):
週期:
這個說的週期 並不是 K線週期:
K線是一個時間週期的概念:一分鐘、一小時、一天、一個星期、一個月、一年等等。任何一個時間段都可以被用來作為一個K線的時間週期單位,這也是K線存在的基本前提。不同的k線時間週期代表著不同時間週期內市場行情的變化狀態。市場上最主要的K線分析週期為日K線。它是指以當日的開盤價,收盤價,最高價和最低價四個價格為主畫出的日線圖。
這個週期指的是 在多大的範圍內去判斷 高點、低點, 可以試想下,如果脫離這個條件去判斷是沒有意義的,因為之前的行情可能有最高 也可能沒有,或者 獲取不到 那麼久遠的資料,另外多高算是高點?可能之前有更高的,所以這些需要限定在一個週期內去判斷,比如 50個K線柱內或者20個K線柱內。
暫時想到這些,就把程式碼實現了一下,用 BotVS 畫圖 寫測試 程式非常方便,測試程式碼如下:
function FindLastHighestPoint(Records, NumOfBars){
var RecordsLen = Records。length
if(RecordsLen < 2){
return false
}
if(typeof(NumOfBars) == “undefined”){
NumOfBars = 0
}
var highPrice = TA。Highest(Records, NumOfBars, “High”)
// find the bar
var bar = null
for(var i = 0; i < RecordsLen; i++){
if(Records[i]。High == highPrice){
bar = {}
bar。record = Records[i]
bar。index = i
bar。range = NumOfBars
break
}
}
// compare current bar
if(bar && Records[RecordsLen - 1]。High >= bar。record。High){
bar。record = Records[RecordsLen - 1]
bar。index = RecordsLen - 1
bar。range = NumOfBars
}
if(!bar || !Records[bar。index - 1]){
return false
}
return bar
}
function FindLastLowestPoint(Records, NumOfBars){
var RecordsLen = Records。length
if(RecordsLen < 2){
return false
}
if(typeof(NumOfBars) == “undefined”){
NumOfBars = 0
}
var lowPrice = TA。Lowest(Records, NumOfBars, “Low”)
// find the bar
var bar = null
for(var i = 0; i < RecordsLen; i++){
if(Records[i]。Low == lowPrice){
bar = {}
bar。record = Records[i]
bar。index = i
bar。range = NumOfBars
break
}
}
// compare current bar
if(bar && Records[RecordsLen - 1]。Low <= bar。record。Low){
bar。record = Records[RecordsLen - 1]
bar。index = RecordsLen - 1
bar。range = NumOfBars
}
if(!bar || !Records[bar。index - 1]){
return false
}
return bar
}
function main(){
LogReset(1)
var chart_obj = Chart({})
chart_obj。reset()
while(true){
var records = exchange。GetRecords()
if(!records){
continue
}
var bar = FindLastHighestPoint(records)
var bar2 = FindLastLowestPoint(records)
$。PlotRecords(records)
if(bar){
$。PlotHLine(bar。record。High, “高點”, “red”)
}else{
Log(“K線資料不足,最高點為初始K線bar!”)
}
if(bar2){
$。PlotHLine(bar2。record。Low, “低點”, “green”)
}else{
Log(“K線資料不足,最低點為初始K線bar!”)
}
LogStatus(_D(), ‘\n’, bar, ‘\n’, bar2)
Sleep(1000)
}
}
程式碼比較簡單, FindLastHighestPoint 、FindLastLowestPoint 這兩個函式 ,就是把 API GetRecords 函式返回的 K線資料(Records) 進行處理 找出 給定K線數量(NumOfBars)內的 高低點,main 函式中 用畫圖函式畫圖(需要引用模板):
$。PlotRecords(records) // 畫出K線
$。PlotHLine(bar。record。High, “高點”, “red”) // 畫出水平線,此引數表示高點
程式會不停輪詢,不停更新 給定引數 週期 K線數 內的 高低點,並顯示為水平線。
在以上測試程式碼中 沒有 傳 NumOfBars 這個引數,不傳該引數則為判斷 獲取到的所有K線資料中的高低點。當然也可以指定 比如 20根K線 柱 範圍內,例如:
FindLastHighestPoint(records, 20)
程式碼地址:
https://www。
botvs。com/strategy/5817
9
簡單的測試了一下。
本帖旨在 用簡單的程式碼 方便新同學學習、測試!
如有不同見解、發現BUG、錯誤、提出建議 歡迎 老司機 留言 ^^,
我會及時修正。
由 發明者量化(FMZ。COM) (原BotVS)授權首發刊載