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

在进行IOSK线图程序开发之前首先得熟悉下MACD算法:

MACD指标的计算方法

MACD在应用上,首先计算出快速移动平均线(即EMA1)和慢速移动平均线(即EMA2),以此两个数值,来作为测量两者(快慢速线)间的离差值(DIF)的依据,然后再求DIF的N周期的平滑移动平均线DEA(也叫MACD、DEM)线。
以EMA1的参数为12日,EMA2的参数为26日,DIF的参数为9日为例来看看MACD的计算过程

1、计算移动平均值(EMA)
12日EMA的算式为
EMA(12)=前一日EMA(12)×11/13+今日收盘价×2/13
26日EMA的算式为
EMA(26)=前一日EMA(26)×25/27+今日收盘价×2/27

2、计算离差值(DIF)
DIF=今日EMA(12)-今日EMA(26)

3、计算DIF的9日EMA
根据离差值计算其9日的EMA,即离差平均值,是所求的MACD值。为了不与指标原名相混淆,此值又名DEA或DEM。
今日DEA(MACD)=前一日DEA×8/10+今日DIF×2/10

MACD 通达信同花顺类软件的算法源码

DIFF : EMA(CLOSE,SHORT) - EMA(CLOSE,LONG);
DEA  : EMA(DIFF,M);
MACD : 2*(DIFF-DEA);
Zero : 0;

MACD IOS代码示例

/**
 *  计算EMA值
 *  公式:EMAn=2/(n+1)*(本周期收盘价-上一周期EMAn)+上一周期EMAn
 *
 *  @param list   本周期数据和上一周期数据
 *  @param number N值
 *
 *  @return EMA
 */
+(float)getEMA:(NSMutableArray*)list Number:(int)number{
    // 开始计算EMA值,
    // 昨日EMA 第一天取收盘价
    FMStockDaysModel *ym = (FMStockDaysModel*)[list firstObject];
    double ema = [ym.EMA floatValue];// 昨天ema
    
    if (ema<=0) {
        ema = [ym.closePrice floatValue]; // 如果无昨日ema则等于当天收盘价 这个一般是开盘第一天的ema值
        if (ema<=0) {
            return 0;
        }
    }
    ym = nil;
    
    FMStockDaysModel *m = (FMStockDaysModel*)[list lastObject];
    
    // EMAn=2/(n+1)*(本周期收盘价-上一周期EMAn)+上一周期EMAn
    ema = (2*[m.closePrice floatValue] + (number-1)*ema)/(number+1);
    m.EMA = [NSString stringWithFormat:@"%f",ema];
    // ema = (2/(number+1)) * ([m.closePrice floatValue]-ema) + ema;
    m = nil;
    return ema;
}


/**
 * 计算MACD值
 *
 * @param list          N日收盘价集合
 * @param shortPeriod   短期.
 * @param longPeriod    长期.
 * @param midPeriod     M.参数:SHORT(短期)、LONG(长期)、M天数,一般为12、26、9
 * @return 返回第N日的 MACD值
 */
+(void)getMACD:(NSMutableArray*)list days:(int)day DhortPeriod:(int)shortPeriod LongPeriod:(int)longPeriod MidPeriod:(int)midPeriod
{
//    if (list.count<shortPeriod || list.count<longPeriod || list.count<midPeriod) {
//        return;
//    }
    NSMutableArray *diffList = [[NSMutableArray alloc] init];
    double shortEMA = 0.0;
    double longEMA = 0.0;
    double dif = 0.0;
    double dea = 0.0;
    double macd = 0.0;
    FMStockDaysModel *dic = (FMStockDaysModel*)[list objectAtIndex:day];
    if (day>=1) {
        int startIndex = day - 1;
        if(startIndex<0)startIndex = 0;
        if (list.count<startIndex+2) {
            return;
        }
        
        NSMutableArray *sublist = [NSMutableArray arrayWithArray:[list subarrayWithRange:NSMakeRange(startIndex, 2)]];
        shortEMA = [self getEXPMA:sublist Number:shortPeriod];
        longEMA = [self getEXPMA:sublist Number:longPeriod];
        // 每日的DIF值 收盘价短期、长期指数平滑移动平均线间的差   DIF=EMAx-EMAy
        // 首个DEA=最近z个周期的DIF的移动平均
        // 此后DEA=(前个DEA*(z-1)/(z+1)+本周期DIF*2/(z+1)
        dif = shortEMA - longEMA;
        sublist = nil;
        // 前一个DEA
        FMStockDaysModel *lastM = (FMStockDaysModel*)[list objectAtIndex:day-1];
        dea = [lastM.MACD_DEA doubleValue];
        // 此后DEA=(前个DEA*(z-1)/(z+1)+本周期DIF*2/(z+1)
        dea = dea*(midPeriod-1)/(midPeriod+1)+dif*2/(midPeriod+1);
        
        macd = 2*(dif-dea);
    }
    dic.MACD_DIF = [NSString stringWithFormat:@"%f",dif];
    dic.MACD_DEA = [NSString stringWithFormat:@"%f",dea];
    dic.MACD_M = [NSString stringWithFormat:@"%f",macd];
    diffList = nil;
    dic = nil;
}

MACD IOS代码应用示例:

for (FMStockDaysModel *item in model.prices) {
        
        // 计算每天的MACD值
        [FMStockIndexAlgorithm getMACD:model.prices
                                  days:i
                           DhortPeriod:MACD_N1
                            LongPeriod:MACD_N2
                             MidPeriod:MACD_P];
}

 

线上的案例请下载大师兄选股查看

分享到:

评论已关闭