股票cci的计算方式(直接上代码,和通信达和东方财富的cci相同的值)

该博客介绍了如何在Java中计算股票的CCI(Commodity Channel Index),通过初始化数据、计算平均值和绝对差值来得到CCI值,代码适用于Webview环境。示例代码详细展示了对于指定股票历史数据的处理过程。
摘要由CSDN通过智能技术生成
package cn.tsxxdw.service.base;

import cn.tsxxdw.dto.SharesCciDto;
import cn.tsxxdw.dto.SharesQueryDto;
import cn.tsxxdw.entity.SharesCciEntity;
import cn.tsxxdw.entity.SharesEntity;
import cn.tsxxdw.mapper.SharesMapper;
import cn.tsxxdw.mybese.service.BaseService;
import cn.tsxxdw.other.Where;
import cn.tsxxdw.service.mydate.MyDateUtil;
import cn.tsxxdw.service.mylog.MyLogUtil;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.LinkedList;
import java.util.List;


@Slf4j
@Service
public class SharesCciService extends BaseService<SharesEntity, SharesMapper> {
    @Autowired
    private SharesService sharesService;
    private double calculationCoefficien = 0.015;// 计算系数
    private int calculationPeriod = 14;

    // 初始化数据
    public void initCciData() {
        try {
            initDataByCode("600238");
        } catch (Exception e) {
            MyLogUtil.logError(e);
            e.printStackTrace();
        }
    }

    private List<SharesEntity> getList(String code) throws Exception {
        SharesQueryDto sharesQueryDto = new SharesQueryDto();
        sharesQueryDto.setSharesCode(code);
        sharesQueryDto.setOrderByAsc("shares_date");
        List<SharesEntity> sharesEntityList = sharesService.queryList(sharesQueryDto,
                Where.useNullSafe(SharesEntity.class).ge("shares_date", "2022-04-01"), false).getData();
        return sharesEntityList;
    }

    private LinkedList<Double> addLink_14(LinkedList<Double> list, Double e) {
        if (list.size() == 14) {
            list.removeFirst();
        }
        list.add(e);
        return list;
    }

    //初始化某一只股票的数据
    private void initDataByCode(String code) throws Exception {
        LinkedList<Double> end_list = new LinkedList<>();// 收盘价
        LinkedList<Double> ma_list = new LinkedList<>();//ma
        LinkedList<Double> tp_list = new LinkedList<>();//tp
        List<SharesEntity> sharesEntityList = getList(code);// 1 获取某一只股票的历史数据 (2022-04-01 至 2022-06-02)
        // 2 for循环下,分别获取 每个日期下的  ma,md,tp,cci
        for (int i = 0; i < sharesEntityList.size(); i++) {
            SharesEntity sharesEntity = sharesEntityList.get(i);
            // 获取最小,最大,收盘 三个价格
            Double min = sharesEntity.getMinPrice(), max = sharesEntity.getMaxPrice(), end = sharesEntity.getEndPrice();
            // TP=(最高价+最低价+收盘价)÷3
            double tp = (min + max + end) / 3;
            addLink_14(tp_list,tp);
            // 存储最近14天的收盘价
            addLink_14(end_list, end);
            //MA=近N日收盘价的累计之和÷N
            if (tp_list.size() == 14) {
                double ma = tp_list.stream().mapToDouble(o -> o).average().getAsDouble();
                addLink_14(ma_list, ma);
                //MD=近N日(MA-tp(n))的绝对值累计之和÷N
                if (ma_list.size() == 14) {
                    double tempSum = 0;
                    for (int y = 0; y < 14; y++) {
                        double cj = ma - tp_list.get(y);
                        if (cj < 0) cj = -cj;
                        tempSum = tempSum + cj;
                    }
                    double md = tempSum / 14;
                    double cci = (tp - ma) / md / 0.015;  //CCI(N日)=(TP-MA)÷MD÷0.015
                    System.out.println(MyDateUtil.getDateString(sharesEntityList.get(i).getSharesDate()) + "," + cci);
                }
            }
        }
        System.out.println("cci执行完毕");
    }


}
Java实现cci计算可以通过以下步骤实现: 1. 首先,需要创建一个Java类来进行cci计算。可以命名为"CCICalculator"。 2. 在该类中,需要定义一个方法来计算cci。可以命名为"calculateCCI"。该方法需要接收一个包含历史价格的数组作为输入参数,并返回计算得到的cci。 3. 在calculateCCI方法中,需要进行以下几个步骤: a. 首先,计算每个价格与其相对应的简单移动平均(SMA)。可以通过循环遍历价格数组,使用公式SMA = (p1+p2+...+pn)/n来计算。 b. 然后,计算每个价格与其相对应的平均绝对偏差(MAD)。可以通过再次循环遍历价格数组,使用公式MAD = |p-SMA|来计算。 c. 接下来,计算每个价格的平均绝对偏差的简单移动平均(SMMA)。可以通过再次循环遍历平均绝对偏差数组,使用公式SMMA = (m1+m2+...+mn)/n来计算。 d. 最后,使用公式CCI = (p-SMMA)/(0.015*SMMA)来计算cci,其中p为最新价格。 4. 确保在calculateCCI方法中对边界条件进行处理,以避免可能的异常。 5. 在主程序中,可以使用CCICalculator类来计算cci。首先,创建一个CCICalculator对象,然后调用calculateCCI方法,并传递历史价格数组作为参数。 6. 最后,将计算得到的cci打印输出即可。 这样,就可以使用Java来实现cci计算了。可以根据需要进一步优化代码,添加适当的异常处理和边界条件判断等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值