在OC中实现BOLL,RSI,WR算法

          在XCode里好像用不了TA-LIB库,所以原先用TA-LIB里的算法只好自己用OC写下,至于其他算法直接翻译Java的就可以了。

dataWrapper类如下:

@interface ChartDataWrapper : NSObject

@property (nonatomic, copy) NSMutableArray* close;  //  收盘价

@property (nonatomic, copy) NSMutableArray* high;  // 最高价

@property (nonatomic, copy) NSMutableArray* low;    // 最低价

@property (nonatomic, copy) NSMutableArray* open;   //开盘价

@property(nonatomic,assign) double preClose;  //昨日收盘价

@property (nonatomic, copy) NSMutableArray* volume;  //成交量

@end

1.BOLL

(1)计算MA
MA=N日内的收盘价之和÷N
(2)计算标准差MD
MD=平方根(N-1)日的(C-MA)的两次方之和除以N
(3)计算MB、UP、DN线
MB=(N-1)日的MA
UP=MB+k×MD
DN=MB-k×MD
(K为参数,可根据股票的特性来做相应的调整,一般默认为2)

【注】以上抄自从百度百科

代码如下:

-(void)setBOLLWithN:(int)n P:(int)p {
    if (nil ==dataWrapper) {
        return;
    }
    __block  double mid = 0;  //中轨线
    __block  double std = 0;  //标准差
    __block double closeSum =0;
    __block double diff = 0;
    __block double diffSum = 0;
    __block double lower =0;  //下轨线
    __block double upper =0;   //上轨线
    [dataWrapper.close enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        closeSum+=[obj doubleValue];
        if (idx>=n-1) {
            if (idx>=n) {
                closeSum-=[dataWrapper.close[idx-n] doubleValue];
            }
            mid = closeSum/n;
            for (NSUInteger i = (idx-n+1); i<=idx; i++) {
                diff = [dataWrapper.close[i] doubleValue]-mid;
                diff = diff*diff;
                diffSum += diff;
            }
            std = sqrt(diffSum/n);
            upper = mid+p*std;
            lower = mid-p*std;
            diffSum =0;
        }
    }];
}


2.RSI

RSI:= SMA(MAX(Close-LastClose,0),N,1)/SMA(ABS(Close-LastClose),N,1)*100

CLOSE:当天收盘价;LastClose:昨天收盘价

MAX(a,b):取a,b中较大的数;ABS(a):取a的绝对值

SMA(a,b,c):(a+(b-c)*preSMA)/ b;

代码如下:

-(void)setRSIWithPeriod:(int)period {
    if (nil == dataWrapper) {
        return;
    }
    __block double upValue = 0; //上涨值,没上涨则取0
    __block   double preSma = 0;
    __block double preSma2 = 0;
    __block  double temSma = 0;
    __block  double temSma2 = 0;
    __block double differ = 0; //今日收盘价与昨日收盘价的差
    __block double rsi;
    [dataWrapper.close enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if (idx>0) {
            differ = [obj doubleValue]-[dataWrapper.close[idx-1] doubleValue];
            
            upValue =0;
            if (differ>0) {
                upValue = differ;
            }
            temSma = (upValue+(period-1)*preSma)/period;
            temSma2 = (fabs(differ)+(period-1)*preSma2)/period;
            rsi = temSma/temSma2*100;
            
            preSma = temSma;
            preSma2 = temSma2;
        }
        
    }];
}

3.WR

WR(N) = 100 * [ HIGH(N)-C ] / [ HIGH(N)-LOW(N) ]
C:当日收盘价
HIGH(N):N日内的最高价
LOW(n):N日内的最低价

【注】以上抄自百度百科

代码如下:

-(void)setWRWithPeriod:(int)n{
    __block double highValue = [dataWrapper.high[0] doubleValue];
    __block double lowValue = [dataWrapper.low[0] doubleValue];
    __block NSUInteger highPosition = 0;  //记录当前最高价位置
    __block NSUInteger lowPosition = 0;   //记录当前最低价位置
    __block double wr = 0;
    [dataWrapper.close enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
        if (highValue<=[dataWrapper.high[idx] doubleValue]) {
            highValue = [dataWrapper.high[idx] doubleValue];
            highPosition = idx;
        }
        if (lowValue>=[dataWrapper.low[idx] doubleValue]) {
            lowValue = [dataWrapper.low[idx] doubleValue];
            lowPosition = idx;
        }
        if (idx>=n-1) {
            if (highValue>[dataWrapper.high[idx] doubleValue]) {
                if (highPosition<(idx-(n-1))) {
                    highValue = [dataWrapper.high[idx-(n-1)] doubleValue];
                    for (NSUInteger j = (idx-(n-2)); j<=idx; j++) {
                        if (highValue<=[dataWrapper.high[j] doubleValue]) {
                            highValue = [dataWrapper.high[j] doubleValue];
                            highPosition = j;
                        }
                    }
                }
            }
            if (lowValue<[dataWrapper.low[idx] doubleValue]) {
                if (lowPosition<idx-(n-1)) {
                    lowValue = [dataWrapper.low[idx-(n-1)] doubleValue];
                    for (NSUInteger k = idx-(n-2); k<=idx; k++) {
                        if (lowValue>=[dataWrapper.low[k] doubleValue]) {
                            lowValue = [dataWrapper.low[k] doubleValue];
                            lowPosition = k;
                        }
                    }
                }
            }
            if (highValue != lowValue) {
                wr = 100*(highValue-[obj doubleValue])/(highValue-lowValue);
            }
            
        }
    }];
    
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值