技术指标-KDJ

2020-08-30  本文已影响0人  昵称违法

一、通达信中KDJ的计算方法

通达信软件中的KDJ计算方式

二、LLV()、HHV()函数

通达信LLV,HHV函数与talib中的MIN,MAX的区别
根据原来官方文档,LLV和HHV函数在计算的时候,如果当前的移动窗口数据量不足N的时候,有几个取几个
而,ta.MIN和ta.MAX在计算的时候,当窗口数量不足N的时候,返回空值

#通达信版本LLV
function LLV(price,n)
    ary = ta.MIN(price,n)        
    #[1~n-1]前面的空值处理
    for i in 1:n-1
        ary[i] = minimum(@view price[1:i])
    end
    return ary
end

#通达信版本HHV
function HHV(price,n)
    ary = ta.MAX(price,n)        
    #[1~n-1]前面的空值处理
    for i in 1:n-1
        ary[i] = maximum(@view price[1:i])
    end
    return ary
end

function test()
    df = DataFrame()
    df.close = rand(30)
    df.min5 = ta.MIN(df.close,5) #talib版本的LLV    
    df.LLV5 = LLV(df.close,5)
    df.max5 = ta.MAX(df.close,5) #talib版本的HHV        
    df.HHV5 = HHV(df.close,5)
    df |> display    
end
test()

计算结果


talib和通达信HHV,LLV的区别

三、KDJ的计算(完整代码)

3.1 ====函数定义====

#通达信版本的LLV
function LLV(price,n)
    ary = ta.MIN(price,n)        
    #[1~n-1]前面的空值处理
    for i in 1:n-1
        ary[i] = minimum(@view price[1:i])
    end
    return ary
end

#通达信版本的HHV
function HHV(price,n)
    ary = ta.MAX(price,n)        
    #[1~n-1]前面的空值处理
    for i in 1:n-1
        ary[i] = maximum(@view price[1:i])
    end
    return ary
end

# 通达信版本的SMA函数
function SMA(X::Array{Float64,1},N::Int64,M::Int64)
    Y::Float64 = 0.0
    res = Array{Float64,1}(undef,length(X))
    for (i,x) in zip(1:length(X),X)
        Y = (M * x + (N-M) * Y) / N
        res[i] = Y
    end
    return res
end

#计算KDJ指标
function KDJ(CLOSE,LOW,HIGH;N=9,M1=3,M2=3) #注意分号
    RSV = (CLOSE .- LLV(LOW,N)) ./ (HHV(HIGH,N) .- LLV(LOW,N)) .* 100
    K = SMA(RSV,M1,1)
    D = SMA(K,M2,1)
    J = @.begin 3 * K - 2 * D end

    return(K=K,D=D,J=J)
end

3.2 ====读取k线计算指标====

function test()
    df = DataFrame(XLSX.readtable("D:/300589.xlsx", "300589")...)
    df |> names |> println
    col = [:day,:open,:high,:low,:close,:vol,:K1,:D1,:J1]
    rename!(df,col)

    df.day = df.day .|> day-> begin 
        replace(day,"/"=>"-") |>
        day -> replace(day," "=>"") |>
        Date
    end
   
    df.open = df.open .|> float
    df.high = df.high .|> float
    df.low = df.low .|> float
    df.close = df.close .|> float
    df.K1 = df.K1 .|> float
    df.D1 = df.D1 .|> float
    df.J1 = df.J1 .|> float    
    df |> display
            
    CLOSE = df.close
    LOW = df.low
    HIGH = df.high
    
    "======" |> display
    kdj = KDJ(CLOSE,LOW,HIGH)  #,N=9,M1=3,M2=3
    df.K = kdj.K
    df.D = kdj.D
    df.J = kdj.J
    
    df |> names |> println
    df |> display
    CSV.write("D:/D.csv",df)    
    df
end

计算的结果【(1)是通达信计算的数据,(2)是Julia计算的数据】

kdj计算结果

3.3 原有kdj和新计算的kdj进行画图对比

using Plots
gr()
function draw(df)
    df = @linq df |> where(Date("2017-01-15") .< :day .< Date("2017-06-01"))   

    x = df.day    
    plot(x,[df.K1,df.J1,df.D1])  #原有的KDJ数据   
    plot!(x,[df.K,df.J,df.D])    #新计算的KDJ数据  
end
draw(df)

3.4 对比的结果【第一部分计算有差别,第二部分没有差别,后期需要复勘】

画图对比结果
上一篇 下一篇

猜你喜欢

热点阅读