MACD是查拉尔·阿佩尔(Geral Appel)于1979年提出的,由一快及一慢指数移动平均(EMA)之间的差计算出来。“快”指短时期的EMA,而“慢”则指长时期的EMA,最常用的是12及26日EMA;

一般MACD的值是12日的平均值与26日平均值的差;SIGNAL是MACD9日平均值;HISTOGRAM是MACD与SIGNAL的差。

公式如下:

MACD:EMA(C,12)-EMA(C,26);

Signal:EMA(MACD,9);

Histogram:MACD-Signal;

顶背离和底背离的概念:

MACD指标的背离就是指MACD指标的图形的走势正好和K线图的走势方向正好相反。MACD指标的背离有顶背离和底背离两种。

(1)顶背离

当股价K线图上的股票走势一峰比一峰高,股价一直在向上涨,而MACD指标图形上的由红柱构成的图形的走势是一峰比一峰低,即当股价的高点比前一次的高点高、而MACD指标的高点比指标的前一次高点低,这叫顶背离现象。顶背离现象一般是股价在高位即将反转转势的信号,表明股价短期内即将下跌,是卖出股票的信号。

(2)底背离

底背离一般出现在股价的低位区。当股价K线图上的股票走势,股价还在下跌,而MACD指标图形上的由绿柱构成的图形的走势是一底比一底高,即当股价的低点比前一次低点底,而指标的低点却比前一次的低点高,这叫底背离现象。底背离现象一般是预示股价在低位可能反转向上的信号,表明股价短期内可能反弹向上,是短期买入股票的信号。

在这里,我们忽略MACD指标的具体计算过程,直接谈一谈本次实验,小编给出策略思想并贴出两种策略分别的回溯效果。

实验采取的两种策略:

1.快线向上突破慢线时,表明股市处于一种强势之中,股价将再次上涨,我们选择买进股票,反之,当慢线向上突破快线时,表明股市处于可能跌入弱市的状态,我们选择卖出股票;

2.底背离买进,顶背离卖出。

第一种策略

代码如下:

class MyStrategy extends Strategy {

private double prevDelta = 0;

String stock1 = "sha-601318";

MACDFactor fMacd = new MACDFactor(12, 26, 9);

public void init(BackTestContext context) {

universe.add(stock1);

}

public void prepare(BackTestContext context) {

}

public void handleData(BackTestContext context, BarData data) throws Exception {

double macdOut = fMacd.get(stock1, MACDFactor.RET_MACD);

double macdSignal = fMacd.get(stock1, MACDFactor.RET_MACD_SIGNAL);

double delta = macdOut - macdSignal;

record("macd", macdOut);

record("macd_signal", macdSignal);

record("macd_hist",delta);

if (prevDelta > 0 && delta < 0) {

log.info("Sell at "+""+context.now+delta);

orderTargetPercent(stock1, 0, "Sell all.");

} else if (prevDelta < 0 && delta > 0) {

log.info("Buy at "+context.now+delta);

orderPercent(stock1, 80, "Buy in.");

}

prevDelta = delta;

}

}

回溯效果:

第二种策略

代码如下:

class MyStrategy extends Strategy {

private double prevDelta = 0;

private double prevClose = 0;

private double countA = 0;

private double countB = 0;

String stock1 = "sha-601318";

MACDFactor fMacd = new MACDFactor(12, 26, 9);

public void init(BackTestContext context) {

universe.add(stock1);

}

public void prepare(BackTestContext context) {

}

public void handleData(BackTestContext context, BarData data) throws Exception {

log.info("time: "+context.now);

double delta = fMacd.get(stock1, MACDFactor.RET_MACD_HIST);

record("macd_hist", delta);

if (delta < prevDelta && data.get(stock1).close > prevClose) {

countB = 0;

if(countA%5 == 0 && countA != 0 ){

log.info("Sell at "+context.now+" "+delta);

orderTargetPercent(stock1, 0, "Sell all.");

}

else{

countA += 1;

}

}else if (delta > prevDelta && data.get(stock1).close < prevClose){

countA = 0;

if(countB%5 == 0 && countB != 0 ){

log.info("Buy at "+context.now+" "+delta);

orderPercent(stock1, 80, "Buy in.");

}else{

countB += 1;

}

}

prevDelta = delta;

prevClose = data.get(stock1).close;

}

}

回溯效果:

相比之下MACD底背离、顶背离,这个逻辑还是蛮狠的。回撤也挺小。

java 实现macd算法_java尝试编写macd,试验顶背离底背离相关推荐

  1. 聚宽macd底背离_老股民技巧一招鲜:MACD顶、底背离图解及近期实战应用,字字斗金...

    macd指标参数最佳设置. 1. MACD指标参数如何设置 对于MACD指标参数,大多数分析软件会将其参数设置为12,26,9,即快速EMA参数设为12.慢速EMV指标设为26.DIF参数设为9. 从 ...

  2. java尝试编写macd,试验顶背离底背离

    MACD是查拉尔·阿佩尔(Geral Appel)于1979年提出的,由一快及一慢指数移动平均(EMA)之间的差计算出来."快"指短时期的EMA,而"慢"则指长 ...

  3. java hilbert空间算法_Java中空间填充Hilbert曲线的递推算法

    我正在学习用 Java编写代码,我已经学习了java编程的递归部分.我理解了递归方法的基础知识,并且我正在尝试编写填充希尔伯特曲线(和Levy C曲线)的空间,到目前为止,一切都顺利进行,直到实际的递 ...

  4. java 求交集 算法_Java计算交集,差集,并集的方法示例

    Java计算交集,差集,并集的方法示例 发布时间:2020-10-07 10:37:46 来源:脚本之家 阅读:106 作者:benbenkui 本文实例讲述了Java计算交集,差集,并集的方法.分享 ...

  5. java密码学原型算法_java密码学原型算法实现——双线性对.pdf

    java密码学原型算法实现--双线性对 Java 密码学原型算法实现--双线性对 1.背景介绍 如何使用jPBC 库进行双线性群初始化,包括: (1)质数阶双线性群(Prime-Order Bilin ...

  6. java快速查找算法_Java实现的快速查找算法示例

    本文实例讲述了Java实现的快速查找算法.分享给大家供大家参考,具体如下: 快速查找算法,可以根据想要找的是第几个大的数,每次循环都能固定下来一个数在数组完整排完序之后的位置,每次循环都能定一个数的位 ...

  7. java常见的算法_Java常用算法总结(转)

    交换排序 冒泡排序 将最后一个元素与倒数第二个元素对比,如果最后一个元素比倒数第二个小,则交换两个元素的位置,再用倒数第二个元素与倒数第三个元数对比,直到比到第一个元素,这样经过第一趟排序后得到第一个 ...

  8. java统计词频算法_java实现的统计字符算法示例

    本文实例讲述了java实现的统计字符算法.分享给大家供大家参考,具体如下: 统计字符: 概述:给定字符串,将它们进行分类,分别的去统计它们的个数及其字符 分类的有:字母 数字 中文 空格 等等 算法思 ...

  9. java克鲁斯卡尔算法_Java语言基于无向有权图实现克鲁斯卡尔算法代码示例

    所谓有权图,就是图中的每一条边上都会有相应的一个或一组值.通常情况下,这个值只是一个数字 如:在交通运输网中,边上的权值可能表示的是路程,也可能表示的是运输费用(显然二者都是数字).不过,边上的权值也 ...

最新文章

  1. AVR开发 Arduino方法(附四) 参考文献与网址
  2. Ambari在离线环境中安装Hadoop集群
  3. 2.Spring初学
  4. 高动态范围图像-单图
  5. js:封装获取当前元素的所有的哥哥元素节点
  6. gcp devops_将GCP AI平台笔记本用作可重现的数据科学环境
  7. C# WinForm 中Label自动换行 解决方法
  8. PostgreSQL查看版本信息
  9. UE4 iOS游戏开发
  10. NYOJ1 - A+B Problem
  11. 5.4(将英里转化位千米)
  12. 操作系统原理(七)文件系统
  13. 发生内部错误。请与 microsoft 支持部门联系。_设计变更、工程签证、确认单、工程洽商、联系单、会签的区别,一文搞懂...
  14. DWM1000模块简介
  15. 小米8se怎么解屏幕锁_黔隆科技刷机教程小米5SPLUS忘记密码刷机解锁降级救砖解屏幕锁账户锁教程...
  16. Java实现 蓝桥杯VIP 算法训练 调和数列
  17. Ubuntu下的onnxruntime(c++)编译
  18. 2022年自考专业(工商企业管理)生产与作业管理练习题
  19. 使用BS4爬取智联招聘
  20. CAD、3dmax等Autodesk系列软件安装报错1603解决办法

热门文章

  1. [MyBatis] 通过代码配置+XML文件构建SqlSessionFactory
  2. 【OpenCV】01-OpenCV的数据类型
  3. 学生选课系统---数据库课程设计SQL Server
  4. wpsppt插入html,WPS的做好的一个PPT 怎么插入到另一个PPT?
  5. Storm学习(一)Storm介绍
  6. 时空复杂度之珠心算测验
  7. 邓迪大学信息无障碍典型文献技术剖析
  8. 不间断电源 (UPS)全国产化电子元件推荐方案
  9. java命令行打包war_命令行打包 war文件
  10. 【转】在win10接双显示器(扩展模式)怎么把鼠标游标切换到第二台显示器上?