通达信zig方法的java实现

package util;

import com.alibaba.fastjson.JSONObject;
import main.original.YGFutureTechIndexKline;
import main.talib.YGFutureTechIndexTaLibSMA;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

public class YGFutureMaiToJava {
   /*
        首先从您第一根K线算起,看每根K线的最高价,和第一根K线的最高价相比是不是涨幅超过10%
    (这里假设第一根K线的最高价位置比较低,位置高的画线原理是一样的),把第一次涨幅超过10%
    的这个点成为上拐点,然后K线继续往后走,出现了一个最高点,然后开始下跌了,这个最高点我们记为A,
    然后K线往后走的跌幅是否超过10%,把第一次跌幅超过10%的K线记为下拐点,如果这个下拐点成立了,
    那么之前的A的这个位置就发生一次转向,就是我们看到的折线,如下图,最低点位置开始,上面一条横线就是上拐点位置,
    然后出现了最高点,再往下走,出现了下拐点,那么证明最高点处应该转折,之后都是按照这个原理画的。
    zig函数产生的连线是连接的最大值和最小值
    */
    //参数1周期长度,参数2百分比
    public static List<Double> getZigZag(List<Double> numbers, Double percentage){
        //     循环前的变量初始化
        //     端点 候选点 扫描点 端点列表 拐点线列表 趋势状态
        int ZIG_STATE_START = 0;
        int ZIG_STATE_RISE = 1;
        int ZIG_STATE_FALL = 2;
        int peer_i = 0;
        Integer candidate_i = 0;
        int scan_i = 0;
        List<Integer> peers = new ArrayList<>();
        List<Double> ziglst = new ArrayList<>();
        int state = ZIG_STATE_START;
        percentage = percentage/100;
        
        if(numbers.size()<2){
            return null;
        }
        while (true) {
            scan_i += 1;
            if (scan_i == numbers.size() - 1) {
                // 扫描到尾部
                if (candidate_i == null) {
                    peer_i = scan_i;
                    peers.add(peer_i);
                } else {
                    if (state == ZIG_STATE_RISE) {
                        if (numbers.get(scan_i) >= numbers.get(candidate_i)) {
                            peer_i = scan_i;
                            peers.add(peer_i);
                        } else {
                            peer_i = candidate_i;
                            peers.add(peer_i);
                            peer_i = scan_i;
                            peers.add(peer_i);
                        }
                    } else if (state == ZIG_STATE_FALL) {
                        if (numbers.get(scan_i) <= numbers.get(candidate_i)) {
                            peer_i = scan_i;
                            peers.add(peer_i);
                        } else {
                            peer_i = candidate_i;
                            peers.add(peer_i);
                            peer_i = scan_i;
                            peers.add(peer_i);
                        }
                    }
                }
                break;
            }

            ///
            if (state == ZIG_STATE_START) {
                if (numbers.get(scan_i) >= numbers.get(peer_i) * (1 + percentage)) {
                    candidate_i = scan_i;
                    state = ZIG_STATE_RISE;
                } else if (numbers.get(scan_i) <= numbers.get(peer_i) * (1 - percentage)) {
                    candidate_i = scan_i;
                    state = ZIG_STATE_FALL;
                }
                peers.add(peer_i);
            } else if (state == ZIG_STATE_RISE) {
                if (numbers.get(scan_i) >= numbers.get(candidate_i)) {
                    candidate_i = scan_i;
                } else if (numbers.get(scan_i) <= numbers.get(candidate_i) * (1 - percentage)) {
                    peer_i = candidate_i;
                    peers.add(peer_i);
                    state = ZIG_STATE_FALL;
                    candidate_i = scan_i;
                }
            } else if (state == ZIG_STATE_FALL) {
                if (numbers.get(scan_i) <= numbers.get(candidate_i)) {
                    candidate_i = scan_i;
                } else if (numbers.get(scan_i) >= numbers.get(candidate_i) * (1 + percentage)) {
                    peer_i = candidate_i;
                    peers.add(peer_i);
                    state = ZIG_STATE_RISE;
                    candidate_i = scan_i;
                }
            }
        }

        //线性插值, 计算出zig的值
        for(int i=1;i<peers.size();i++){

            int  peer_start_i = peers.get(i-1);
            int peer_end_i = peers.get(i);
            Double start_value = numbers.get(peer_start_i);
            Double end_value = numbers.get(peer_end_i);
            Double a = (end_value - start_value)/(peer_end_i - peer_start_i);// 斜率

            if(peer_start_i == 0){
                for(int j=0;j<(peer_end_i - peer_start_i +1);j++){
                    ziglst.add(start_value + a*j);
                }
            }else {
                for(int j=1;j<(peer_end_i - peer_start_i +1);j++){
                    ziglst.add(start_value + a*j);
                }
            }
        }
        return ziglst;
    }

    //本方法中troughPositionlst存储所有波谷的位置,peakPositionlst存储所有波峰的位置
    public static  List<Integer> getTROUGHBARS(List<Double> numbers, Double percentage) {
        int ZIG_STATE_START = 0;
        int ZIG_STATE_RISE = 1;
        int ZIG_STATE_FALL = 2;
        int state = ZIG_STATE_START;
        List<Double> troughBarslst = getZigZag(numbers, percentage);
        List<Integer> troughPositionlst = new ArrayList<>();
        List<Integer> peakPositionlst = new ArrayList<>();

        if (troughBarslst != null && troughBarslst.size() > 0) {
            for (int i = 1; i < troughBarslst.size(); i++) {
                if (i == troughBarslst.size() - 1) {
                    // 扫描到尾部
                    if (state == ZIG_STATE_RISE) {
                        if (troughBarslst.get(i) <= troughBarslst.get(i - 1)) {
                            troughPositionlst.add(i);
                            peakPositionlst.add(i - 1);
                        }
                    }
                     else if (state == ZIG_STATE_FALL) {
                            if (troughBarslst.get(i) >= troughBarslst.get(i - 1)) {
                                troughPositionlst.add(i - 1);
                                peakPositionlst.add(i);
                            }
                     }


                    break;
                }
   ///
                    if (state == ZIG_STATE_START) {
                        if (troughBarslst.get(i) >= troughBarslst.get(i - 1)) {
                            state = ZIG_STATE_RISE;
                            troughPositionlst.add(i - 1);
                        } else if (troughBarslst.get(i) <= troughBarslst.get(i - 1)) {
                            state = ZIG_STATE_FALL;
                            peakPositionlst.add(i - 1);
                        }
                    } else if (state == ZIG_STATE_RISE) {
                        if (troughBarslst.get(i) <= troughBarslst.get(i - 1)) {
                            state = ZIG_STATE_FALL;
                            peakPositionlst.add(i - 1);
                        }
                    } else if (state == ZIG_STATE_FALL) {
                        if (troughBarslst.get(i) >= troughBarslst.get(i - 1)) {
                            state = ZIG_STATE_RISE;
                            troughPositionlst.add(i - 1);
                        }
                    }
                }
            }
        else {
                return null;
        }
        return troughPositionlst;

    }
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值