zoukankan      html  css  js  c++  java
  • K线指标线计算方法

    指标线计算方法

    l   dataDR = Kdata(原始数据)/dr(除权)  //除权数据等于原始数据除以DR(除权) 其中,日K数据 需要本地进行除权处理。周K和月K的旧数据部分由服务器进行处理,新数据部分是需要本地进行处理的。使用DR数据时需要检查是否需要去掉预先给的DR数据。

    l   K线MA5 : 5天收盘价平均值

    l   K线MA10: 10天收盘价平均值

    l   K线MA20: 20天收盘价平均值

    l   K线MA60: 60天收盘价平均值

    l   成交量MA5 : 5天成交量平均值

    l   成交量MA10: 10天成交量平均值

    l   成交量MA20: 20天成交量平均值

    l   成交量MA60: 60天成交量平均值

    l   MACD: 需要使用数据:dataDR

    定义参数:SHORT = 12, MID = 9, LONG = 26;

       MACD_LARGER = 100;  // 缩放因子

    变量:DI, EMA_DI_SHORT, EMA_DI_LONG, DEA

    len = KData.length //数据的长度

            计算:                                               

    //计算每个数据的DIF,DEA,BAR三条线的数值

    for(int i= 0 ;i<len;i++) 

    {

       DI = MACD_LARGER * (dataDR[high]+ dataDR[low]+ dataDR[close]*2*0.25);

          If(i==0)

    {

    EMA_DI_SHORT = DI;

    EMA_DI_LONG = DI;

    }

                                Else

    {

           EMA_DI_SHORT = EMA_DI_SHORT + (DI - EMA_DI_SHORT) * shortRate;

                  EMA_DI_LONG = EMA_DI_LONG + (DI - EMA_DI_LONG) * longRate;

    }

    DIF值= ((EMA_DI_SHORT - EMA_DI_LONG) / EMA_DI_LONG) * MACD_LARGER;

    if (i == 0) {

      DEA值 =DIF值;

        } else {

      DEA 值= DEA值 + (DIF值- DEA值) * (2.0 / MID);

      }

    BAR值= DIF值-DEA值;

    }

    l   KDJ: 需要使用数据:dataDR  KData (原始数据)

       定义参数:RSVCyc = 9, KCyc = 3, DCyc = 3;

                       highWindow 数组, lowWindow 数组;

                        maxValue, minValue;

                        RSV, K, KB, D, DB, J, JB;

    curClosePrice;

    len = KData.length //数据的长度

       计算://计算每个数据K 、D、 J值

                        //初始化

           for (int i = 0; i < RSVCyc; i++) {

            highWindow[i] = data[high] [0](第0个元素);

            lowWindow[i] = data [low][0] (第0个元素);

                    }

                KB = 50;

             DB = 50;

                      JB = 50;

                        //计算

                        for(int i= 1;i< len;i++)

    {

           curClosePrice = dataDR [close];

           if(curClosePrice<=0)

    {

          K值=50;

    D 值= 50;

    J值=50;

    }

    else

    {

         highWindow[i % RSVCyc] = dataDR [high];

        lowWindow[i % RSVCyc] = dataDR [low];

           maxValue = highWindow中最大值;

    minValue = lowWindow 中最小值;

    if(maxValue> minValue)

    {

           RSV = (curClosePrice - minValue) / (maxValue - minValue) * 100.0;

         K值 = KB * (KCyc - 1) / KCyc + RSV / KCyc;

      D 值= DB * (DCyc - 1) / DCyc + K / DCyc;

       J 值= K * DCyc - D * (DCyc - 1);

           KB= K值;

    DB= D值;

    JB= J值;

    }

    else

    {

         K值 =50;

      D 值=50;                                                       

       J 值=50;

    }

    }

    }

    l   RSI: 需要使用数据:dataDR

    定义参数:closeArray数组 = dataDR[close];

                         cyc(取值6和12 : 6天或者12天);

    curClosePrice, lastClosePrice;

    RA, DA, RD;

    len = KData.length //数据的长度

    计算://计算出一条RSI线的各个数据值

                  RSI值 = 50 //初始化

          RA = 0.1;

           DA = 0.1;

                 for (int i = 1; i < len; i++) {

                curClosePrice = closeArray[i];

                lastClosePrice = closeArray[i - 1];

                if (curClosePrice <= 0) {

                    RSI值 = 50;

                } else {

                    if (curClosePrice > lastClosePrice) {

                        RD = curClosePrice / lastClosePrice - 1.0;

                        RA = RA * (cyc - 1.0) / cyc + RD / cyc;

                        DA = DA * (cyc - 1.0) / cyc;

                    } else {

                        RD = 1.0 - curClosePrice / lastClosePrice;

                        RA = RA * (cyc - 1.0) / cyc;

                        DA = DA * (cyc - 1.0) / cyc + RD / cyc;

                    }

                    RSI值= RA / (RA + DA) * 100.0;

                }

            }

    l   BIAS: 需要使用数据:dataDR

    定义参数:closeArray数组 = dataDR[close];

                         cyc(取值5/10/20 :三条线);

    closeMaArray;

    len = KData.length //数据的长度

    计算://计算一条bias线的各个值

                  closeMaArray = closeArray的每cyc个数据的平均值构成的数组;

                 for (i = 0; i < len; i++) {

               bias值 =  (closeArray[i] - closeMaArray[i]) / closeMaArray[i] * 100.0;

            }

    l   CCI: 需要使用数据:dataDR

    定义参数:Cyc = 14;

    len = KData.length //数据的长度

    TYPArray, maTYPArray, aveDevArray

    计算:

          for (int  i = 0; i < len; i++) {

                 TYPArray [i] = (dataDR[high] + dataDR [low]+ dataDR[close]) / 3.0

                   }

                  maTYPArray = TYPArray的每cyc个数据的平均值构成的数组;

                  aveDevArray = 先求TYPArray和maTYPArray的每个数据之差的绝对值,然后每cyc个绝对值的平均值构成的数组。

          for (int i = 1; i < len; i++) {

            CCI值= (TYPArray [i] - maTYPArray [i]) / (0.015 * aveDevArray [i]);

                }

    l   ROC: 需要使用数据:dataDR

    定义参数:closeArray数组 = dataDR[close];

                         cyc1=12,cyc2 =6; (两条线);

    rocArray(第一条线值的数组)

    len = KData.length //数据的长度

    计算:

                  第一条线:

                         rocArray前cyc1个数据赋值为0;

                 for (int i=cyc1; i < len; i++) {

                rocArray[i] = ((closeArray[i] - closeArray[i – cyc1]) / closeArray[i – cyc1] * 100);

                   }

                  第二条线:

               rocMArray = rocArray的每cyc2个数据的平均值构成的数组;

    l   ASI: 需要使用数据:dataDR

    定义参数:lastClosePrice;

                         AA, BB, CC, DD, R, X, SI;

    • openArr, highArr, lowArr, closeArr

                         len = KData.length //数据的长度

    计算:

           openArr = dataDR[open]数据构成的数组

           highArr = dataDR[high]数据构成的数组

    lowArr = dataDR[low]数据构成的数组

    closeArr = dataDR[close]数据构成的数组

    ASI值[0] = 0;

    for (int i = 1; i < len; i++) {

                lastClosePrice = closeArr[i - 1];

                AA = (highArr[i] - lastClosePrice)的绝对值;

                BB = (lowArr[i] - lastClosePrice) 的绝对值;

                CC = (highArr[i] - lowArr[i - 1]) 的绝对值;

                DD = (lastClosePrice - openArr[i - 1]) 的绝对值;

                R = (AA > BB && AA > CC) ? (AA + BB / 2 + DD / 4) : (BB > CC && BB > AA ? (BB + AA / 2 + DD / 4) : (CC + DD / 4));

                X = closeArr[i] + (closeArr[i] - openArr[i]) / 2 - openArr[i - 1];

                if (R == 0.0) {

                    SI[i]=0;

                } else {

                    SI[i]=(16 * X / R * max(AA, BB));

                }

                ASI值 = ASI值[i-1]+ SI[i];

            }

    l   PSY: 需要使用数据:dataDR

    定义参数:cyc = 12;

                         closeArr = dataDR[close]数据构成的数组

                         count

    len = KData.length //数据的长度

    计算:

                 for (int  i = 1; i < cyc && i < len; i++) {

                if (closeArr[i] > closeArr[i - 1]) {

                    count++;

                }

                PSY值= count / cyc * 100.0;

            }

            for (int i=cyc; i < len; i++) {

                if (closeArr[i - cyc] > closeArr[i - cyc - 1]) {

                    count--;

                }

                if (closeArr[i] > closeArr[i - 1]) {

                    count++;

                }

                PSY值= count / cyc * 100.0;

            }

    #import "EzMakeLineData.h"
    
    @implementation EzMakeLineData
    
    
    +(NSMutableArray *)getLineData:(NSMutableArray *)data type:(int)type
    {
        NSMutableArray *lineDataArr = nil;
        switch (type) {
            case 0:
                lineDataArr = [self getVolData:data];
                break;
            case 1:
                lineDataArr = [self getMACDData:data];
                break;
            case 2:
                lineDataArr = [self getKDJData:data];
                break;
            case 3:
                lineDataArr = [self getRSIData:data];
                break;
            case 4:
                lineDataArr = [self getBIASData:data];
                break;
            case 5:
                lineDataArr = [self getCCIData:data];
                break;
            case 6:
                lineDataArr = [self getROCData:data];
                break;
            case 7:
                lineDataArr = [self getASIData:data];
                break;
            case 8:
                lineDataArr = [self getPSYData:data];
                break;
            default:
                break;
        }
        return lineDataArr;
    }
    
    #pragma mark - 成交量
    +(NSMutableArray *)getVolData:(NSMutableArray *)data
    {
        return data;
    }
    
    
    #pragma mark - MACD
    +(NSMutableArray *)getMACDData:(NSMutableArray *)data
    {
        //定义参数
        CGFloat SHORT = 12;
        CGFloat MID = 9;
        CGFloat LONG = 26;
        CGFloat MACD_LARGER = 100;   //缩放因子
        CGFloat DI;
        CGFloat EMA_DI_SHORT = 0.0;
        CGFloat EMA_DI_LONG = 0.0;
        CGFloat DEA = 0.0;
        CGFloat DIF;
        CGFloat BAR;
        CGFloat shortRate;
        CGFloat longRate;
    
        NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:0];
        if (SHORT == 12) {
            shortRate = 0.1538;
        } else {
            shortRate = 2.0 / (SHORT + 1);
        }
    
        if (LONG == 26) {
            longRate = 0.0741;
        } else {
            longRate = 2.0 / (LONG + 1);
        }
        //计算每个数据的DIF,DEA,BAR三条线的数值
        for(int i= 0 ;i<data.count;i++)
        {
            NSMutableArray *subArr = data[i];
    
            DI = MACD_LARGER * ([subArr[1] floatValue]+ [subArr[2] floatValue]+ [subArr[3] floatValue]*2)*0.25;
            if(i==0)
            {
                EMA_DI_SHORT = DI;
                EMA_DI_LONG = DI;
            }
            else
            {
                EMA_DI_SHORT = EMA_DI_SHORT + (DI - EMA_DI_SHORT) * shortRate;
                EMA_DI_LONG = EMA_DI_LONG + (DI - EMA_DI_LONG) * longRate;
            }
            DIF= ((EMA_DI_SHORT - EMA_DI_LONG) / EMA_DI_LONG) * MACD_LARGER;
            if (i == 0) {
                DEA =DIF;
            } else {
                DEA= DEA + (DIF- DEA) * (2.0 / MID);
            }
            BAR= DIF-DEA;
    
            [subArr addObject:[NSNumber numberWithDouble:DIF]];
            [subArr addObject:[NSNumber numberWithDouble:DEA]];
            [subArr addObject:[NSNumber numberWithDouble:BAR]];
    
            [arr addObject:subArr];
        } 
        return arr;
    }
    
    #pragma mark - KDJ
    +(NSMutableArray *)getKDJData:(NSMutableArray *)data
    {
        //定义参数
        CGFloat RSVCyc = 9;
        CGFloat KCyc = 3;
        CGFloat DCyc  = 3;
        NSMutableArray *highWindow;
        NSMutableArray *lowWindow ;
        CGFloat maxValue;
        CGFloat minValue;
        CGFloat RSV, K, KB, D, DB, J, JB;
        CGFloat curClosePrice;
    
        NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:0];
    
        //计算每个数据K 、D、 J值
        //初始化
        highWindow = [[NSMutableArray alloc] initWithCapacity:0];
        lowWindow = [[NSMutableArray alloc] initWithCapacity:0];
        if (data.count>0) {
    
            for (int i = 0; i < RSVCyc; i++) {
                highWindow[i] = [data[0] objectAtIndex:1]; //第0个元素的high
                lowWindow[i] = [data[0] objectAtIndex:2];  //第0个元素的low
            }
            KB = 50;
            DB = 50;
            JB = 50;
    
            NSMutableArray *subArr = data[0];
            [subArr addObject:[NSNumber numberWithDouble:50]];
            [subArr addObject:[NSNumber numberWithDouble:50]];
            [subArr addObject:[NSNumber numberWithDouble:50]];
    
            [arr addObject:subArr];
            if (data.count>1) {
                //计算
                for(int i= 1;i<data.count;i++)
                {
                    subArr = data[i];
                    curClosePrice = [subArr[3] floatValue];
                    if(curClosePrice<=0)
                    {
                        K=50;
                        D= 50;
                        J=50;
                    }
                    else
                    {
                        highWindow[(int)fmod(i, RSVCyc)] = subArr[1];
                        lowWindow[(int)fmod(i, RSVCyc)] = subArr[2];
    
                        maxValue = [[highWindow valueForKeyPath:@"@max.floatValue"] floatValue];
                        minValue = [[lowWindow valueForKeyPath:@"@min.floatValue"] floatValue];
                        if(maxValue> minValue)
                        {
                            RSV = (curClosePrice - minValue) / (maxValue - minValue) * 100.0;
                            K = KB * (KCyc - 1) / KCyc + RSV / KCyc;
                            D = DB * (DCyc - 1) / DCyc + K / DCyc;
                            J = K * DCyc - D * (DCyc - 1);
                            KB= K;
                            DB= D;
                            JB= J;
                        }
                        else
                        {
                            K =50;
                            D =50;
                            J =50;
    
                        }
                    }
                    [subArr addObject:[NSNumber numberWithDouble:K]];
                    [subArr addObject:[NSNumber numberWithDouble:D]];
                    [subArr addObject:[NSNumber numberWithDouble:J]];
                    
                    [arr addObject:subArr];
                }
    
            }
        }
    
        return arr;
    }
    
    #pragma mark - RSI
    +(NSMutableArray *)getRSIData:(NSMutableArray *)data
    {
        //定义参数
        NSMutableArray *closeArray;
        CGFloat cyc6 = 6;
        CGFloat cyc12 = 12;
    
        //计算出一条RSI线的各个数据值
        closeArray = [[NSMutableArray alloc] initWithCapacity:0];
        for(int i = 0; i < data.count; i++) {
             [closeArray addObject:[data[i] objectAtIndex:3]] ;//第i个元素的close
        }
    
        //RSI6
        NSMutableArray *arr = [self makeRSI:data closeArray:closeArray cyc:cyc6];
        //RSI12
        arr = [self makeRSI:arr closeArray:closeArray cyc:cyc12];
        return arr;
    }
    +(NSMutableArray *)makeRSI:(NSMutableArray *)data closeArray:(NSMutableArray *)closeArray cyc:(CGFloat)cyc
    {
        CGFloat curClosePrice;
        CGFloat lastClosePrice;
        CGFloat RA,DA,RD,RSI;
        RSI = 50;
        RA = 0.1;
        DA = 0.1;
    
    
        NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:0];
        if (data.count>0) {
            NSMutableArray *subArr = data[0];
            [subArr addObject:[NSNumber numberWithDouble:RSI]];
            [arr addObject:subArr];
    
            for(int i = 1;i<data.count;i++) {
                subArr = data[i];
                curClosePrice = [closeArray[i] floatValue];
                lastClosePrice = [closeArray[i - 1] floatValue];
    
                if (curClosePrice <= 0) {
                    RSI = 50;
                } else {
                    if (curClosePrice > lastClosePrice) {
                        RD = curClosePrice / lastClosePrice - 1.0;
                        RA = RA * (cyc - 1.0) / cyc + RD / cyc;
                        DA = DA * (cyc - 1.0) / cyc;
                    } else {
                        RD = 1.0 - curClosePrice / lastClosePrice;
                        RA = RA * (cyc - 1.0) / cyc;
                        DA = DA * (cyc - 1.0) / cyc + RD / cyc;
                    }
                    RSI= RA / (RA + DA) * 100.0;
                }
                [subArr addObject:[NSNumber numberWithDouble:RSI]];
                [arr addObject:subArr];
            }
    
        }
        return arr;
    }
    
    
    
    #pragma mark - BIAS
    +(NSMutableArray *)getBIASData:(NSMutableArray *)data
    {
    
        //定义参数
        NSMutableArray *closeArray;
        CGFloat cyc5 = 5;
        CGFloat cyc10 = 10;
        CGFloat cyc20 = 20;
        closeArray = [[NSMutableArray alloc] initWithCapacity:0];
        for(int i = 0; i < data.count; i++) {
             [closeArray addObject:[data[i] objectAtIndex:3]] ; //第i个元素的close
        }
    
        //5
        NSMutableArray *arr = [self makeBIAS:data closeArray:closeArray cyc:cyc5];
        //10
        arr = [self makeBIAS:arr closeArray:closeArray cyc:cyc10];
        //20
        arr = [self makeBIAS:arr closeArray:closeArray cyc:cyc20];
        return arr;
    }
    +(NSMutableArray *)makeBIAS:(NSMutableArray *)data closeArray:(NSMutableArray *)closeArray cyc:(CGFloat)cyc
    {
        NSMutableArray *closeMaArray;
        //计算一条bias线的各个值
         closeMaArray = [self moveAvgArr:closeArray cyc:cyc];
    
         NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:0];
        for (int i = 0; i < data.count;i++) {
            NSMutableArray *subArr = data[i];
             CGFloat bias =  ([closeArray[i] floatValue]-[closeMaArray[i] floatValue]) / [closeMaArray[i] floatValue] * 100.0;
            [subArr addObject:[NSNumber numberWithDouble:bias]];
             [arr addObject:subArr];
        }
    
        return arr;
    }
    
    //计算滑动平均值
    +(NSMutableArray *)moveAvgArr:(NSMutableArray *)Array cyc:(CGFloat)cyc
    {
        NSMutableArray *AvgArray;
        NSMutableArray *littleArr;
        //计算一条bias线的各个值
        AvgArray = [[NSMutableArray alloc] initWithCapacity:0];
        littleArr = [[NSMutableArray alloc] initWithCapacity:0];
    
        //计算获取滑动平均值数组
        int  num=0;
        for (int  i = 0; i<Array.count; i++) {
            if (i<=cyc-1) {
                num++;
                [littleArr addObject:Array[i]];
                CGFloat avg = [[littleArr valueForKeyPath:@"@sum.floatValue"] floatValue]/num;
                [AvgArray addObject:[NSNumber numberWithFloat:avg]];
    
            }
            else
            {
                 [littleArr removeObjectAtIndex:0];
                [littleArr addObject:Array[i]];
                CGFloat avg = [[littleArr valueForKeyPath:@"@sum.floatValue"] floatValue]/num;
                [AvgArray addObject:[NSNumber numberWithFloat:avg]];
            }
        }
    
        return AvgArray;
    }
    
    #pragma mark - CCI
    +(NSMutableArray *)getCCIData:(NSMutableArray *)data
    {
        //定义参数
        NSMutableArray *TYPArray,*maTYPArray,*aveDevArray;
        CGFloat cyc14 = 14;
    
        NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:0];
        TYPArray = [[NSMutableArray alloc] initWithCapacity:0];
        maTYPArray = [[NSMutableArray alloc] initWithCapacity:0];
        aveDevArray = [[NSMutableArray alloc] initWithCapacity:0];
        for (int  i = 0; i < data.count; i++) {
            CGFloat typ =([[data[i] objectAtIndex:1] floatValue] + [[data[i] objectAtIndex:2] floatValue]+ [[data[i] objectAtIndex:3] floatValue])/3.0;
               [TYPArray addObject:[NSNumber numberWithFloat:typ]];
        }
        maTYPArray = [self moveAvgArr:TYPArray cyc:cyc14];
    
    
        aveDevArray = [self aveDevArr:TYPArray arr2:maTYPArray cyc:cyc14];
    
        if (data.count>0) {
            NSMutableArray *subArr = data[0];
            [subArr addObject:[NSNumber numberWithDouble:0]];
            [arr addObject:subArr];
            if (data.count>1) {
                for (int i = 1; i < data.count; i++) {
                    subArr = data[i];
                    CGFloat CCI= ([TYPArray [i] floatValue] - [maTYPArray [i] floatValue]) / (0.015 * [aveDevArray [i] floatValue]);
                    [subArr addObject:[NSNumber numberWithDouble:CCI]];
                    [arr addObject:subArr];
                }
            }
    
    
        }
    
           return arr;
    }
    
    //Make aveDevArray
    +(NSMutableArray *)aveDevArr:(NSMutableArray *)Array  arr2:(NSMutableArray *)arr2 cyc:(CGFloat)cyc
    {
        NSMutableArray *AvgArray;
        CGFloat windowSum;
        int j;
        AvgArray = [[NSMutableArray alloc] initWithCapacity:0];
    
        for (int i = 0; i< Array.count; i++) {
            windowSum =0;
            for (j=i; j>i-cyc&&j>0; j--) {
                windowSum = windowSum+ fabs([Array[j] floatValue]-[arr2[i] floatValue]);
            }
            if (j==i-cyc) {
                [AvgArray addObject:[NSNumber numberWithFloat:(windowSum/cyc)]];
            }
            else
            {
                [AvgArray addObject:[NSNumber numberWithFloat:(windowSum/(i-j+1))]];
            }
    
        }
    
        return AvgArray;
    
    }
    
    
    #pragma mark - ROC
    +(NSMutableArray *)getROCData:(NSMutableArray *)data
    {
        //定义参数
        NSMutableArray *closeArray;
        int cyc6 = 6;
        int cyc12 = 12;
    
        closeArray = [[NSMutableArray alloc] initWithCapacity:0];
        for(int i = 0; i < data.count; i++) {
            [closeArray addObject:[data[i] objectAtIndex:3]] ; //第i个元素的close
        }
        NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:0];
         NSMutableArray *subArr;
         NSMutableArray *ROCarr = [[NSMutableArray alloc] initWithCapacity:0];
        if (data.count<cyc12) {
            cyc12= (int)data.count;
        }
        //12
        for (int i = 0; i<cyc12; i++) {
            subArr = data[i];
            [subArr addObject:[NSNumber numberWithDouble:0]];
            [ROCarr  addObject:[NSNumber numberWithDouble:0]];
        }
        for (int i= cyc12; i<data.count; i++) {
            subArr = data[i];
            CGFloat ROC = ([closeArray[i] floatValue] - [closeArray[i-cyc12] floatValue])/[closeArray[i-cyc12] floatValue]*100;
            [subArr addObject:[NSNumber numberWithDouble:ROC]];
            [ROCarr  addObject:[NSNumber numberWithDouble:ROC]];
        }
        //6
        ROCarr = [self moveAvgArr:ROCarr cyc:cyc6];
        for (int i = 0 ; i<data.count; i++) {
            subArr = data[i];
            [subArr addObject:[NSNumber numberWithDouble:[ROCarr[i] floatValue]]];
            [arr addObject:subArr];
        }
        return arr;
    }
    
    #pragma mark - ASI
    +(NSMutableArray *)getASIData:(NSMutableArray *)data
    {
        //定义参数
        NSMutableArray *openArr, *highArr, *lowArr, *closeArr,*SI;
        CGFloat lastClosePrice;
        CGFloat AA, BB, CC, DD, R, X;
    
    
        openArr = [[NSMutableArray alloc] initWithCapacity:0];
        highArr = [[NSMutableArray alloc] initWithCapacity:0];
        lowArr = [[NSMutableArray alloc] initWithCapacity:0];
        closeArr = [[NSMutableArray alloc] initWithCapacity:0];
        SI = [[NSMutableArray alloc] initWithCapacity:0];
        for(int i = 0; i < data.count; i++) {
            [openArr addObject:[data[i] objectAtIndex:0]];
            [highArr addObject:[data[i] objectAtIndex:1]];
            [lowArr addObject:[data[i] objectAtIndex:2]];
            [closeArr addObject:[data[i] objectAtIndex:3]]; //第i个元素的close
        }
    
        NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:0];
        NSMutableArray *subArr;
        if (data.count>0) {
            subArr=data[0];
            [subArr addObject:[NSNumber numberWithFloat:0]];
            [arr addObject:subArr];
            [SI addObject:[NSNumber numberWithFloat:0]];
            if (data.count>1) {
                for (int i = 1; i < data.count; i++) {
                    subArr = data[i];
                    lastClosePrice = [closeArr[i - 1] floatValue];
    
                    AA = fabs([highArr[i] floatValue] - lastClosePrice);
                    BB = fabs([lowArr[i] floatValue] - lastClosePrice);
                    CC = fabs([highArr[i] floatValue] - [lowArr[i - 1] floatValue]);
                    DD = fabs(lastClosePrice - [openArr[i - 1] floatValue]);
    
                    R = (AA > BB && AA > CC) ? (AA + BB / 2 + DD / 4) : (BB > CC && BB > AA ? (BB + AA / 2 + DD / 4) : (CC + DD / 4));
                    X = [closeArr[i] floatValue] + ([closeArr[i] floatValue] - [openArr[i] floatValue]) / 2 - [openArr[i - 1] floatValue];
                    if (R == 0) {
                        [SI addObject:[NSNumber numberWithFloat:0]];
                    } else {
                        [SI addObject:[NSNumber numberWithFloat:(16 * X / R * (AA>BB?AA:BB))]];
                    }
                    NSMutableArray *subArr11;
                    subArr11 = data[i-1];
                    CGFloat ASI= [[subArr11 lastObject] floatValue]+ [SI[i] floatValue];
                    [subArr addObject:[NSNumber numberWithFloat:ASI]];
                    [arr addObject:subArr];
                }
    
            }
    
        }
           return arr;
    }
    #pragma mark - PSY
    +(NSMutableArray *)getPSYData:(NSMutableArray *)data
    {
        //定义参数
        NSMutableArray *closeArr;
        int cyc12=12;
        CGFloat  count = 0;
         closeArr = [[NSMutableArray alloc] initWithCapacity:0];
        for(int i = 0; i < data.count; i++) {
            [closeArr addObject:[data[i] objectAtIndex:3]]; //第i个元素的close
        }
    
        NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:0];
        if (data.count>0) {
            NSMutableArray *subArr;
            subArr = data[0];
            [subArr addObject:[NSNumber numberWithFloat:100]];
            [arr addObject:subArr];
            if (data.count>1) {
                if (data.count<cyc12) {
                    cyc12= (int)data.count;
                }
                for (int  i = 1; i < cyc12 && i < data.count; i++) {
                    subArr = data[i];
                    if ([closeArr[i] floatValue] > [closeArr[i-1] floatValue]) {
                        count++;
                    }
    
                    CGFloat PSY= count / cyc12 * 100.0;
                    [subArr addObject:[NSNumber numberWithFloat:PSY]];
                    [arr addObject:subArr];
                }
    
                for (int i=cyc12; i < data.count; i++) {
                    subArr = data[i];
                    if (i==cyc12) {
                    }
                    else
                    {
                        if ([closeArr[i - cyc12] floatValue] > [closeArr[i - cyc12 - 1] floatValue]) {
                            count--;
                        }
                    }
    
                    if ([closeArr[i] floatValue] > [closeArr[i-1] floatValue]) {
                        count++;
                    }
    
                    CGFloat PSY= count / cyc12 * 100.0;
                    [subArr addObject:[NSNumber numberWithFloat:PSY]];
                    [arr addObject:subArr];
                }
    
            }
    
        }
           return arr;
    }
    
    
    @end
  • 相关阅读:
    bzoj 4008 亚瑟王 期望概率dp
    t[..., 1, tf.newaxis]
    Keras learning_phase()和learning_phase_scope()
    Keras Sequential模型和add()
    Keras克隆层
    Keras搭建一个Wide & Deep 神经网络
    1 链表的数据结构
    海康威视2017软件精英挑战赛初赛题目
    2016年倒计时两天
    可自定义片头的腾讯视频无广告可全屏调用代码
  • 原文地址:https://www.cnblogs.com/Ganggang888/p/5253363.html
Copyright © 2011-2022 走看看