教你如何用不到一百行代码找到kdj多周期共振点

kdj指标是超买超卖指标,通常情况下,当k值小于20,表示超卖,大于80表示超买。

我们知道,当多个分时周期的kdj都出现金叉时,往往可能是一轮反弹的开始点,由小分时周期带动大分时周期,那么如何捕捉到多个分时同时金叉的那个点呢?(以上只是用可能,这个概率有多大,无人知晓,一个策略是否成功,和非常多的因素有微妙关系,希望读者理性看待,本文只是举例获取kdj指标的多周期共振点)

可能很多人还不知道多周期共振是什么意思,举个例子,5分钟分时的kdj指标金叉了,但不代表什么(可能此时15分钟分时的kdj指标还是死叉),如果此时15分钟的kdj也金叉了,30分钟的kdj也金叉了...这时就会出现多周期共振的金叉点,往往两个周期同时金叉比较常见,下面就用代码举例捕获30分钟和60分钟两个周期同时金叉的股票。

以上所说的金叉具体点来说是kdj的k值与d值的金叉,也就是k值上穿d值,下面的例子的思路是:当k值和d值都处于20以下,也就是超卖区的时候,k值与d值的绝对值非常小时,我们认为kd即将可能发生金叉,以这个思路,捕获30分钟和60分钟的kd值即将金叉的股票。

以下代码需要借助ig507提供的接口库完成,示例如何使用接口库简单快速的完成策略。下面直接贴策略逻辑代码(java实现),你可从ig507-test开源项目中拉取完整的代码执行。

package com.ig507.test;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import org.jsoup.nodes.Document;

import com.ig507.constant.Ig507ErrorContent;
import com.ig507.model.GpListModel;
import com.ig507.model.Kdj;
import com.ig507.model.Realtime;
import com.ig507.util.Util;
import com.ig507.util.UtilFather;

/**
 * 寻找kdj共振点示例
 *
 */
public class TestKdjByIg507 extends UtilFather {

	public static void main(String[] args) {

		String licence = "你的licence";

		try {

			// 获取GP列表
			String gpListUrl = "http://ig507.com/data/base/gplist";
			Document doc = getIg507Page(gpListUrl);
			List<GpListModel> gplist = jsonMapper.jsonToList(doc.text(), GpListModel.class);

			int gpcount = 0;
			int licenceCount = 0;
			List<String> result = new ArrayList<String>();
			long s = System.currentTimeMillis();
			for (GpListModel gp : gplist) {

				/**
				 * 第一层过滤(过滤掉ST,债,B股等)
				 */
				String mc = gp.getMc();
				if (mc.contains("ST") || mc.contains("债") || mc.contains("B") || mc.contains("N")) {
					continue;
				}

				// 获取GP实时交易数据
				long start = System.currentTimeMillis();
				doc = getIg507Page(String.format("http://ig507.com/data/time/real/%s?licence=%s", gp.getDm(), licence));
				Realtime realTime = jsonMapper.fromJson(doc.text(), Realtime.class);
				if (doc.text().equals(Ig507ErrorContent.E_404)) {
					continue;
				}
				long end = System.currentTimeMillis();
				gpcount++;
				licenceCount++;
				System.out.println(String.format("count[%s] dm[%s] use[%s] realTime[%s]", gpcount, gp.getDm(),
						end - start, doc.text()));

				/**
				 * 第二层过滤(过滤掉换手率<3,并且成交额小于3亿的票)
				 */
				if (Util.isEmpty(realTime.getHs()) || realTime.getHs().doubleValue() < 3
						|| Util.isEmpty(realTime.getCje()) || realTime.getCje().doubleValue() < 300000000d) {
					continue;
				}

				// kd不能小于
				int kdmin = 2;
				// kd不能大于
				int kdmax = 20;
				// kd的绝对值不能大于
				int dlmax = 8;

				// 获取30分钟kdj
				doc = getIg507Page(
						String.format("http://ig507.com/data/time/real/kdj/%s/30?licence=%s", gp.getDm(), licence));
				licenceCount++;
				if (doc.text().equals(Ig507ErrorContent.E_404)) {
					continue;
				}
				Kdj kdj30 = jsonMapper.fromJson(doc.text(), Kdj.class);
				BigDecimal k30 = kdj30.getK();
				BigDecimal d30 = kdj30.getD();

				// 获取60分钟kdj
				doc = getIg507Page(
						String.format("http://ig507.com/data/time/real/kdj/%s/60?licence=%s", gp.getDm(), licence));
				licenceCount++;
				if (doc.text().equals(Ig507ErrorContent.E_404)) {
					continue;
				}
				Kdj kdj60 = jsonMapper.fromJson(doc.text(), Kdj.class);
				BigDecimal k60 = kdj60.getK();
				BigDecimal d60 = kdj60.getD();

				// 30分钟kd绝对值
				BigDecimal dl30 = k30.subtract(d30).abs();
				// 60分钟kd绝对值
				BigDecimal dl60 = k60.subtract(d60).abs();

				/**
				 * 第三层过滤,kd值不能小于2,kd值不能大于20,kd绝对值不能大于8
				 */
				if (k30.doubleValue() < kdmax && kdmin < k30.doubleValue() && d30.doubleValue() < kdmax
						&& kdmin < d30.doubleValue() && k60.doubleValue() < kdmax && kdmin < k60.doubleValue()
						&& d60.doubleValue() < kdmax && kdmin < d60.doubleValue() && dl30.doubleValue() < dlmax
						&& dl60.doubleValue() < dlmax) {
					result.add(String.format("得到GP [%s]: kdj30 [%s], dl30 [%s], kdj60 [%s], dl60 [%s]. ", gp.getDm(),
							jsonMapper.toJson(kdj30), dl30, jsonMapper.toJson(kdj60), dl60));
				}

			}
			long e = System.currentTimeMillis();

			System.err.println("结果:");
			System.err.println(Util.join(result, "\r\n"));
			System.err.println(String.format("策略耗时 [%s] 毫秒,消耗licence [%s] 次", e - s, licenceCount));

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

运行结果(为了避免荐股嫌疑,我隐去跑出来的结果,有兴趣的人可以自己去拉代码):



作者:IG507
链接:https://xueqiu.com/1480435944/163870887
来源:雪球
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
风险提示:本文所提到的观点仅代表个人的意见,所涉及标的不作推荐,据此买卖,风险自负。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值