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

在进行IOSK线图程序开发之前首先得熟悉下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指标 IOS 代码示例

/**
 *  KDJ算法
 *  计算公式:rsv =(收盘价– n日内最低价最低值)/(n日内最高价最高值– n日内最低价最低值)×100
   K = rsv的m天移动平均值
   D = K的m1天的移动平均值
   J = 3K - 2D
   rsv:未成熟随机值
    rsv天数默认值:9,K默认值:3,D默认值:3。
 **/
+(NSMutableDictionary*)getKDJMap:(NSArray*)list N:(int)n{
    // 默认随机值
    int m_iParam[] = {n, 3, 3};
    int n1 = m_iParam[0];
    int n2 = m_iParam[1];
    int n3 = m_iParam[2];
    if(list == nil || n1 > list.count || n1 < 1)
        return nil;
    // 初始化数组
    NSMutableArray *kvalue = [[NSMutableArray alloc] init];
    NSMutableArray *dvalue = [[NSMutableArray alloc] init];
    NSMutableArray *jvalue = [[NSMutableArray alloc] init];
    // 给初值
    for (id item in list) {
        [kvalue addObject:[NSNumber numberWithInt:0]];
        [dvalue addObject:[NSNumber numberWithInt:0]];
        [jvalue addObject:[NSNumber numberWithInt:0]];
    }
    n2 = n2 > 0 ? n2 : 3;
    n3 = n3 > 0 ? n3 : 3;
    // 第九天的k线图数据单例
    FMStockDaysModel *model = (FMStockDaysModel*)[list objectAtIndex:(n1-1)];
    // 计算N日内的最低最高价
    float maxhigh = [model.heightPrice floatValue]; // 最高价
    float minlow = [model.lowPrice floatValue]; // 最低价
    for(int j = n1 - 1; j >= 0; j--) {
        FMStockDaysModel *m = (FMStockDaysModel*)[list objectAtIndex:(j)];
        if(maxhigh < [m.heightPrice floatValue])
            maxhigh = [m.heightPrice floatValue];
        if(minlow > [m.lowPrice floatValue])
            minlow = [m.lowPrice floatValue];
        m = nil;
    }
    // 计算RSV值
    float rsv;
    if(maxhigh <= minlow)
        rsv = 50.0f;
    else
        rsv = (([model.closePrice floatValue] - minlow) / (maxhigh - minlow)) * 100.0f;
    float prersv;
    prersv = rsv;
    [jvalue replaceObjectAtIndex:(n1 - 1) withObject:[NSNumber numberWithFloat:prersv]];
    [dvalue replaceObjectAtIndex:(n1 - 1) withObject:[NSNumber numberWithFloat:prersv]];
    [kvalue replaceObjectAtIndex:(n1 - 1) withObject:[NSNumber numberWithFloat:prersv]];
    for(int i = 0; i < n1; i++) {
        [jvalue replaceObjectAtIndex:(i) withObject:[NSNumber numberWithFloat:0]];
        [dvalue replaceObjectAtIndex:(i) withObject:[NSNumber numberWithFloat:0]];
        [kvalue replaceObjectAtIndex:(i) withObject:[NSNumber numberWithFloat:0]];
    }
    
    for(int i = n1-1; i < list.count; i++) {
        FMStockDaysModel *m = (FMStockDaysModel*)[list objectAtIndex:i];
        maxhigh = [m.heightPrice floatValue];
        minlow = [m.lowPrice floatValue];
        for(int j = i; j > i - n1; j--) {
            FMStockDaysModel *mm = (FMStockDaysModel*)[list objectAtIndex:j];
            if(maxhigh < [mm.heightPrice floatValue])
                maxhigh = [mm.heightPrice floatValue];
            if(minlow > [mm.lowPrice floatValue])
                minlow = [mm.lowPrice floatValue];
            mm = nil;
        }
        
        if(maxhigh <= minlow) {
            rsv = prersv;
        } else {
            prersv = rsv;
            rsv = (([m.closePrice floatValue] - minlow) / (maxhigh - minlow)) * 100.0f;
        }
        // 计算K值
        CGFloat newK = ([[kvalue objectAtIndex:i-1] floatValue] * (float)(n2 - 1)) / (float)n2 + rsv / (float)n2;
        if (newK<=0) {
            newK = 0;
        }
        [kvalue replaceObjectAtIndex:(i) withObject:[NSNumber numberWithFloat:newK]];
        // 计算D值
        CGFloat newD = [[kvalue objectAtIndex:i] floatValue] / (float)n3 + ([[dvalue objectAtIndex:i-1] floatValue] * (float)(n3 - 1)) / (float)n3;
        if (newD<=0) {
            newD = 0;
        }
        [dvalue replaceObjectAtIndex:(i) withObject:[NSNumber numberWithFloat:newD]];
        // 计算J值
        CGFloat newJ = [[kvalue objectAtIndex:i] floatValue] * 3.0f - 2.0f*[[dvalue objectAtIndex:i] floatValue];
        if (newJ<=0) {
            newJ = 0;
        }
        [jvalue replaceObjectAtIndex:(i) withObject:[NSNumber numberWithFloat:newJ]];
        m = nil;
        
    }
    model = nil;
    // 封装好返回
    NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
    [dic setObject:kvalue forKey:@"K"];
    [dic setObject:dvalue forKey:@"D"];
    [dic setObject:jvalue forKey:@"J"];
    return dic;
}


KDJ IOS代码应用示例:

// 计算KDJ
// 返回每周期的KDJ值,属于一次性计算完所有K线
    NSMutableDictionary *KDJ = [FMStockIndexAlgorithm getKDJMap:model.prices N:KDJ_N];
//


分享到:

评论已关闭