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
来源:雪球
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
风险提示:本文所提到的观点仅代表个人的意见,所涉及标的不作推荐,据此买卖,风险自负。