在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;
}
}];
}
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);
}
}
}];
}