股票学习网

股票入门基础知识和炒股入门知识 - - 股票学习网!

dde指标详解(dde指标源码)

2023-08-08 09:00分类:江恩理论 阅读:

大盘和个股没有顶和底

绝大多数来A股玩的人,都在极尽自己所能去干一件事,预测。所以各种技术类书籍层出不穷,其本质都是利用了大家想预测股票的心态。

 

集合竞价主要关注成交量、高开幅度和竞价分时;盘中观察量能是否放大、分时形态以及市场承接。

如下的案例康强电子,从DDE指标来看,2月24日至3月3日是放量建仓的波段,DDXDDY红柱都非常明显,成交量也很大。之后连续缩量洗盘,至3月16日时成交量已经缩小到了极限,说明已经没有短线筹码愿意卖出,短线筹码清理非常充分。而10元的价格位置是主力资金2月24日开始建仓时的最低成本。显然已经到了极限低点。

D.吸引新的散户入场。

买点:参与集合竞价,一定要在9:24分左右下单,迟了的话追涨成本会比较高,太早的话容易出现变故,所以在时间的把握上要精准一些。

B、原则:短期趋势服从于中期趋势,中期趋势服从于长期趋势。趋势周期的标准:短期4周以内,中期的标准:4—13周,长期的标准:1年以上。

根据多密集峰的形态种类又可分为下跌多峰和上涨多峰。

 

Lombok 之 @Builder 注解与 JSON 反序列化的冲突

 

@Builder
@Data
public class ItemData {
/**
* 商品id
*/

public Long itemId;

/**
* 商品标题
*/

public String itemTitle;

}

ItemData itemData = ItemData.builder()
.itemId(123456L)
.itemTitle("闲小鱼")
.build();

ItemData itemData = ItemData.builder()
.itemId(123456L)
.itemTitle("闲小鱼")
.build();
//fastjson序列化
String itemString = JSONObject.toJSONString(itemData);
//fastjson反序列化
ItemData deserializeItem = JSON.parseObject(itemString, ItemData.class);

 

 

通过源码分析得知,fastjson 实例化对象优先使用无参构造函数,其次再使用 public 修饰的带参构造函数。因此反编译看下 @Builder 注解帮我们生成的代码,可以看到只有一个带全部参数的构造函数供 Builder 类内部类使用,并且该构造函数没有被 public 修饰,因此反序列化时 fastjon 无法进行实例化对象。

 

 

 

@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ItemData {
/**
* 商品id
*/

public Long itemId;

/**
* 商品标题
*/

public String itemTitle;

}

如何动态设置日志输出级别

 

对于单台机器,可以使用arthas(阿里巴巴开源的超实用JAVA监控诊断工具)来快速的查看和重置指定Logger的日志打印级别。输入命令logger,查看当前机器上所有Logger的相关信息。

 

 

 

 

 

 

那么对于线上机器集群,如何实现日志级别动态调整呢?答:通过配置中心 + LoggingSystem(org.springframework.boot.logging.LoggingSystem)来实现。LoggingSystem会帮我们屏蔽掉底层具体的日志框架,实现统一的日志操作。这里,笔者为大家提供一个工具类。

@Service
public class LoggerLevelAdjustService {

@Autowired
private LoggingSystem loggingSystem;

/**
* 设置主日志(ROOT Logger)的日志输出级别
* @param newLevel 要设置到的日志输出级别
* @return void
*/

public void setRootLoggerLevel(String newLevel){
setLoggerLevel(ROOT_LOGGER_NAME, newLevel);
}

/**
*
* @param loggerName logger name
* @param newLevel 要设置到的日志输出级别
* @return void
*/

public void setLoggerLevel(String loggerName, String newLevel){
if (StringUtils.isEmpty(newLevel)) {
return;
}
for (LogLevel level : LogLevel.values()) {
if (level.name().equals(newLevel)) {
loggingSystem.setLogLevel(loggerName, level);
}
}
}
}

 

JWT的生成原理和误区

 

 

 

 

 

 

 

在最终的JWT令牌中,Header和Payload会使用Base64Url算法编码为最终传输信息的前二部分。为了防止信息交换的过程中被篡改,JWT设计了第三部分Signature。Signature通过将Header和Payload的信息进行加密的方式生成,常见支持的加密算法有HS256(一种引入密钥的摘要算法),非对称加密RS256等。若我们采用HS256,则Signature的生成公式为:Signature = HS256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) 在设定HS256特定密钥后,我们可以得到Signature为zYAABCrTH4trLliHsSbmCA3Rrn0Fym5aZ5MgrlnkW9Y。最终将编码后的Header、Payload和生成的Signature使用“.”连接起来,便得到了JWT令牌(红色部分为Header,紫色为Payload,蓝色为Signature)。

 

 

 

显然,若在传输过程中Payload被进行了篡改,接收方使用预先定义的密钥便会生成截然不同的Signature。因此,JWT可以实现信息传输过程中的防篡改。此外,因为Payload部分仅仅是进行了编码(而非加密),所以在接收方或者第三方可以被解码为明文userId。因此,切记不能使用Payload传输密码等敏感信息。

 

Java 8 parallelStream 避坑指南

 

 

  • 1. 并行流与串行流的执行结果可能会不一致

    IntStream.of(1, 2, 3).reduce(4, Integer::sum); 这是一段简单的数组元素相加,得到执行结果为 10,符合预期。 IntStream.of(1, 2, 3).parallel().reduce(4, Integer::sum);
    接下来我们将这段代码改写为使用并行流来处理,在其他条件都不变的基础上,得到结果为 18,与预期结果不一致。造成这种差异的原因主要是 Stream 的并行流底层采用的是 ForkJoinPool 来执行,其线程数为运行机器的 cpu 核数-1(因此cpu核数会影响执行结果),其主要原理是把任务分成多个部分,每个部分进行独立计算最后合并。复原一下上面的例子,如下图所示:

     

     
    1. 2. 串行流并不是在所有场景下都可以带来性能提升

       

      1. 3. 长耗时任务需要单独指定处理任务的线程池

        parallel stream 默认使用的执行线程池为 ForkJoinPool 内部的静态 commonPool,主要用于处理没有为其单独分配线程池的任务。该线程池的大小默认为 cpu 核数-1,因此如果在其中运行长耗时的任务,极有可能造成线程池阻塞,影响当前业务甚至其他用了 parallel stream 的业务。此时更建议手动开启一个新的线程池进行任务处理,或者为 parallel stream 单独指定一个专用线程池,如下所示:

        ForkJoinPool businessPool = new ForkJoinPool(4);
        int sum = businessPool.submit(
        () -> IntStream.of(1, 2, 3).parallel().reduce(0, Integer::sum)).get();
        businessPool.shutdown();

        引用

         

https://www.haobaihe.com

上一篇:600857(600327大东方)

下一篇:北向资金流向(002041登海种业)

相关推荐

返回顶部