股票K线图指标之KDJ程序开发–C#源码示例

在进行C# csharp K线图程序开发之前先了解一下KDJ指标的算法

KDJ指标的计算方法

指标KDJ的计算比较复杂,首先要计算周期(n日、n周等)的RSV值,即未成熟随机指标值,然后再计算K值、D值、J值等。以日KDJ数值的计算为例,其计算公式为
n日RSV=(Cn-Ln)÷(Hn-Ln)×100
式中,Cn为第n日收盘价;Ln为n日内的最低价;Hn为n日内的最高价。RSV值始终在1—100间波动。
其次,计算K值与D值:
当日K值=2/3×前一日K值+1/3×当日RSV
当日D值=2/3×前一日D值+1/3×当日K值
若无前一日K 值与D值,则可分别用50来代替。
以9日为周期的KD线为例。首先须计算出最近9日的RSV值,即未成熟随机值,计算公式为
9日RSV=(C-L9)÷(H9-L9)×100
式中,C为第9日的收盘价;L9为9日内的最低价;H9为9日内的最高价。
K值=2/3×前一日 K值+1/3×当日RSV
D值=2/3×前一日K值+1/3×当日RSV
若无前一日K值与D值,则可以分别用50代替。
需要说明的是,式中的平滑因子1/3和2/3是可以人为选定的,不过目前已经约定俗成,固定为1/3和2/3。在大多数股市分析软件中,平滑因子已经被设定为1/3和2/3,不需要作改动。另外,一般在介绍KD时,往往还附带一个J指标。
J指标的计算公式为:
J=3D—2K
实际上,J的实质是反映K值和D值的乖离程度,从而领先KD值找出头部或底部。J值范围可超过100。
J指标是个辅助指标,最早的KDJ指标只有两条线,即K线和D线,指标也被称为KD指标,随着股市分析技术的发展,KD指标逐渐演变成KDJ指标,从而提高了KDJ指标分析行情的能力。另外,在一些股市重要的分析软件上,KDJ指标的K、D、J参数已经被简化成仅仅一个,即周期数(如日、周、月等),而且,随着股市软件分析技术的发展,投资者只需掌握KDJ形成的基本原理和计算方法,无须去计算K、D、J的值,更为重要的是利用KDJ指标去分析、研判股票行情。
和其他指标的计算一样,由于选用的计算周期的不同,KDJ指标也包括日KDJ指标、周KDJ指标、月KDJ指标年KDJ指标以及分钟KDJ指标等各种类型。经常被用于股市研判的是日KDJ指标和周KDJ指标。虽然它们的计算时的取值有所不同,但基本的计算方法一样。

KDJ指标 C# 代码示例

/// <summary> 
 /// KDJ算法 
 /// </summary> 
 /// <param name="N">9</param> 
 /// <param name="M1">3</param> 
 /// <param name="M2">3</param> 
 /// <param name="KLStocklist">K线数据</param> 
 /// <returns></returns> 
 public static List<KLinfo> ComputationKJD(int N, int M1, int M2, List<KLinfo> KLStocklist) 
 { 
 
 for (int i = 0; i < KLStocklist.Count; i++) 
 { 
 double RSV = 0; 
 double a = 0; 
 double b = 0; 
 double e = 0; 
 
 GetMinMaxPirce(i + 1, N, KLStocklist); 
 
 if (KLStocklist[i].KID == 1) 
 { 
 RSV = (KLStocklist[i].ClosePrice - KLStocklist[i].MinPrice) / (KLStocklist[i].MaxPrice - KLStocklist[i].MinPrice) * 100; 
 a = (1 * RSV + (M1 - 1) * 0) / 1; 
 b = (1 * a + (M2 - 1) * 0) / 1; 
 e = 3 * a - 2 * b; 
 
 } 
 else 
 { 
 RSV = (KLStocklist[i].ClosePrice - KLStocklist[i].MinPrice) / (KLStocklist[i].MaxPrice - KLStocklist[i].MinPrice) * 100; 
 a = (1 * RSV + (M1 - 1) * KLStocklist[i - 1].Kvalue) / M1; 
 b = (1 * a + (M2 - 1) * KLStocklist[i - 1].Dvalue) / M2; 
 e = 3 * a - 2 * b; 
 } 
 
 KLStocklist[i].RSV = RSV; 
 KLStocklist[i].Kvalue = a; 
 KLStocklist[i].Dvalue = b; 
 KLStocklist[i].Jvalue = e; 
 
 if (a < 0) KLStocklist[i].Kvalue = 0; 
 if (a > 100) KLStocklist[i].Kvalue = 100; 
 if (b < 0) KLStocklist[i].Dvalue = 0; 
 if (b > 100) KLStocklist[i].Dvalue = 100; 
 if (e < 0) KLStocklist[i].Jvalue = 0; 
 if (e > 100) KLStocklist[i].Jvalue = 100; 
 } 
 
 
 
 return null; 
 
 } 
 
 /// <summary> 
 /// 获取区间最大最小 
 /// </summary> 
 /// <param name="Index">当日K线</param> 
 /// <param name="N">9</param> 
 /// <param name="KLStocklist">K线数据</param> 
 /// <returns></returns> 
 public static void GetMinMaxPirce(int Index, int N, List<KLinfo> KLStocklist) 
 { 
 
 var MinPirce = from n in KLStocklist where n.KID <= Index && n.KID > ((Index - N) < 0 ? 0 : (Index - N)) select n; 
 
 if (MinPirce.Count() != 0) 
 { 
 KLStocklist[Index-1].MinPrice = MinPirce.Select(n => n.LowPrice).Min(); 
 KLStocklist[Index-1].MaxPrice = MinPirce.Select(n => n.HighPrice).Max(); 
 } 
 
 
 }
分享到:

评论已关闭