package com.cgs.test;
import com.cgs.test.model.DealHistoryItem;
import com.cgs.test.model.KDayItem;
import com.cgs.test.model.KMinItem;
import com.cgs.test.model.KdataItem;
import com.cgs.test.model.MarketValue;
import com.zebrafutures.commons.redis.RedisHelper;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import javax.annotation.PostConstruct;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class KService {
private String path = "C:\\market_price.csv";
private List<MarketValue> valueList = new ArrayList<>();
private Logger logger = LoggerFactory.getLogger(KService.class);
@Autowired
private RedisHelper redisHelper;
private String[] contractIds = {"300000040","260862601"};
private List<KDayItem> dayItemList = new ArrayList<>();
public void buildMinK(SimpleDateFormat simpleDateFormat){
Date date;
for (MarketValue marketValue : valueList){
for (int i=0; i<contractIds.length; i++){
KMinItem kMinItem = new KMinItem();
try {
date = simpleDateFormat.parse(marketValue.tradingDate + marketValue.tradingTime);
kMinItem.setTime(date.getTime());
kMinItem.setClose(marketValue.close);
kMinItem.setHigh(marketValue.high);
kMinItem.setContractId(contractIds[i]);
kMinItem.setLow(marketValue.low);
kMinItem.setOpen(marketValue.open);
kMinItem.setVolume(marketValue.volume);
redisHelper.lpushString(RedisKeys.K_MIN + contractIds[i],kMinItem.toRedisValue());
System.out.println(kMinItem.toRedisValue() + RedisKeys.K_MIN );
} catch (ParseException e) {
e.printStackTrace();
}
}
}
}
@PostConstruct
public void loadOnStartUp(){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmm");
try {
buildMarketValue();
//buildTick(simpleDateFormat);
buildMinK(simpleDateFormat);
buildFiveMinK(simpleDateFormat);
buildFiftenMINK(simpleDateFormat);
build30MinK(simpleDateFormat);
buildhourK(simpleDateFormat);
buildDayK(simpleDateFormat);
buildWeekK(simpleDateFormat);
buildMonthK(simpleDateFormat);
// buildTick(simpleDateFormat);
} catch (IOException e) {
e.printStackTrace();
}
}
public void buildFiveMinK(SimpleDateFormat simpleDateFormat){
doBuildMinK(simpleDateFormat,5 * 60 * 1000,RedisKeys.K_FIVEMIN);
}
public void buildFiftenMINK(SimpleDateFormat simpleDateFormat){
doBuildMinK(simpleDateFormat,15 * 60 * 1000,RedisKeys.K_FIFTEENMIN);
}
public void build30MinK(SimpleDateFormat simpleDateFormat){
doBuildMinK(simpleDateFormat,30 * 60 * 1000,RedisKeys.K_THIRTYMIN);
}
public void buildhourK(SimpleDateFormat simpleDateFormat){
doBuildMinK(simpleDateFormat,60 * 60 * 1000,RedisKeys.K_HOUR);
}
public void buildDayK(SimpleDateFormat simpleDateFormat){
doBuildDayK(simpleDateFormat,RedisKeys.K_DAY,"day");
}
public void buildWeekK(SimpleDateFormat simpleDateFormat){
doBuildDayK(simpleDateFormat,RedisKeys.K_WEEK,"week");
}
public void buildMonthK(SimpleDateFormat simpleDateFormat){
doBuildDayK(simpleDateFormat,RedisKeys.K_MONTH,"month");
}
// public void buildYearK(SimpleDateFormat simpleDateFormat){
// doBuildDayK(simpleDateFormat,RedisKeys.,"week");
// }
public void doBuildMinK(SimpleDateFormat simpleDateFormat,long timeperiod,String redisMinKey){
Map<String,KMinItem> minKMap = new HashMap<>();
Date date;
try {
for (MarketValue marketValue : valueList){
for (int i=0; i<contractIds.length; i++){
if (minKMap.get(contractIds[i]) == null){
date = simpleDateFormat.parse(marketValue.tradingDate + marketValue.tradingTime);
KMinItem kMinItem = new KMinItem();
kMinItem.setTime(date.getTime());
kMinItem.setClose(marketValue.close);
kMinItem.setHigh(marketValue.high);
kMinItem.setContractId(contractIds[i]);
kMinItem.setLow(marketValue.low);
kMinItem.setOpen(marketValue.open);
kMinItem.setVolume(marketValue.volume);
minKMap.put(contractIds[i],kMinItem);
}else{
date = simpleDateFormat.parse(marketValue.tradingDate + marketValue.tradingTime);
if((date.getTime() - minKMap.get(contractIds[i]).getTime())< timeperiod){
KMinItem finalItem = minKMap.get(contractIds[i]);
finalItem.setVolume(finalItem.getVolume() + marketValue.volume);
finalItem.setClose(marketValue.close);
finalItem.setHigh(finalItem.getHigh().compareTo(marketValue.high) == 1 ? finalItem.getHigh() : marketValue.high);
finalItem.setLow(finalItem.getLow().compareTo(marketValue.low) == -1 ? finalItem.getLow() : marketValue.low);
}else {
System.out.println(minKMap.get(contractIds[i]).toRedisValue());
redisHelper.lpushString(redisMinKey + contractIds[i],minKMap.get(contractIds[i]).toRedisValue());
minKMap.remove(contractIds[i]);
}
}
}
}
} catch (ParseException e) {
e.printStackTrace();
}
}
public List<KDayItem> doBuildDayK(SimpleDateFormat simpleDateFormat,String redisMinKey,String period){
Map<String,KDayItem> dayItemMap = new HashMap<>();
List<KDayItem> itemList = new ArrayList<>();
String lastKey = "";
Map<String,Long> lastTimeMap = new HashMap<>();
Date date;
try {
for (MarketValue marketValue : valueList){
for (int i=0; i<contractIds.length; i++){
String key = generateKeyByPeriod(period,contractIds[i],marketValue);
if (dayItemMap.get(key) == null){
date = simpleDateFormat.parse(marketValue.tradingDate + marketValue.tradingTime);
KDayItem kDayItem = new KDayItem();
kDayItem.setTime(date.getTime());
if (lastTimeMap.get(key) == null){
kDayItem.setLastTime(date.getTime());
}else if (lastTimeMap.get(key) != null){
kDayItem.setLastTime(lastTimeMap.get(key));
}
kDayItem.setClose(marketValue.close);
kDayItem.setHigh(marketValue.high);
kDayItem.setContractId(contractIds[i]);
kDayItem.setLow(marketValue.low);
kDayItem.setOpen(marketValue.open);
kDayItem.setVolume(marketValue.volume);
kDayItem.setSettlement(marketValue.close);
dayItemMap.put(key,kDayItem);
if (dayItemMap.get(lastKey) != null){
String value = dayItemMap.get(key).toRedisValue();
lastTimeMap.put(key,dayItemMap.get(key).getLastTime());
redisHelper.lpushString(redisMinKey + contractIds[i],value);
}
}else{
if(dayItemMap.containsKey(key)){
lastKey = key;
KDayItem finalItem = dayItemMap.get(key);
finalItem.setVolume(finalItem.getVolume() + marketValue.volume);
finalItem.setClose(marketValue.close);
finalItem.setHigh(finalItem.getHigh().compareTo(marketValue.high) == 1 ? finalItem.getHigh() : marketValue.high);
finalItem.setLow(finalItem.getLow().compareTo(marketValue.low) == -1 ? finalItem.getLow() : marketValue.low);
finalItem.setSettlement(marketValue.close);
}
}
}
}
} catch (ParseException e) {
e.printStackTrace();
}
return itemList;
}
public String generateKeyByPeriod(String period,String contractId,MarketValue marketValue)
throws ParseException {
switch (period){
case "day" :
return marketValue.tradingDate + "day" +contractId;
case "week":
SimpleDateFormat sdf= new SimpleDateFormat("yyyyMMdd");
Date date = sdf.parse(marketValue.tradingDate);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return "week" + String.valueOf(calendar.get(Calendar.WEEK_OF_YEAR)) +"week" + contractId;
case "month":
return "month" + marketValue.tradingDate.substring(4,6) + "month" + contractId;
case "year":
return "year" + marketValue.tradingDate.substring(0,3) + contractId;
default:
return "";
}
}
public void doBuildDayK(String redisKey){
for (MarketValue marketValue : valueList){
String tradingDate = marketValue.tradingDate;
String year = tradingDate.substring(0,3);
String month = tradingDate.substring(4,5);
String day = tradingDate.substring(6,7);
for (int i=0; i<contractIds.length; i++){
}
}
}
private void buildMarketValue() throws IOException {
File file = new File(path);
List<String> values = FileUtils.readLines(file);
Collections.reverse(values);
String[] array;
for (String value : values) {
logger.info(value);
array = value.split(",");
if (array[7].equals("0")){
continue;
}
MarketValue marketValue = new MarketValue();
marketValue.open = new BigDecimal(array[1]);
marketValue.high = new BigDecimal(array[2]);
marketValue.low = new BigDecimal(array[3]);
marketValue.close = new BigDecimal(array[4]);
marketValue.volume = Long.parseLong(array[7]);
String time = array[0];
String[] timeArray = time.split(" ");
marketValue.tradingDate = timeArray[0].replace("/","");
marketValue.tradingTime = timeArray[1].replace(":","");
valueList.add(marketValue);
}
}
public void buildTick(SimpleDateFormat simpleDateFormat){
try{
for (MarketValue marketValue : valueList){
for (int i=0; i<contractIds.length; i++) {
Date date = simpleDateFormat.parse(marketValue.tradingDate + marketValue.tradingTime);
DealHistoryItem dealHistoryItem = new DealHistoryItem();
dealHistoryItem.setVolume(marketValue.volume);
dealHistoryItem.setContractId(contractIds[i]);
dealHistoryItem.setPrice(marketValue.open);
dealHistoryItem.setTime(date.getTime());
redisHelper.lpushString(RedisKeys.DEAL_HISTORY + contractIds[i],dealHistoryItem.toRedisValue());
}
}
} catch (ParseException e) {
e.printStackTrace();
}
}
private String getTradeDate(String date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
return sdf.format(date);
}
private String getTradeTime(String time) {
SimpleDateFormat sdf = new SimpleDateFormat("HHmmss.SSS");
return sdf.format(time);
}
private String getRandom(){
StringBuilder sb = new StringBuilder();
Random random = new Random();
for (int i=0; i<3; i++){
sb.append(random.nextInt(10));
}
return sb.toString();
}
}
相关推荐
图表背后的秘密 | 追溯K线源头,K线的变种与数据来源
我们在交易的时候用的最多的就是K线,但是大家是否想过,K线是怎么来的? 是不是交易所就会提供K线数据给我们呢?
js股票K线图,比较专业的K线图插件
由於項目裏面要做個有關交易的平臺,其中要畫k線圖(蠟燭圖),在網上找了很多插件感覺都沒有專業的股票交易平臺弄的k線圖專業,因此為了趕進度,將就用了百度的echarts來做k線圖,結果發現如果點比較少的時候k線圖呈現的柱子很大,不好看,除非有幾百個點看著才比較和專業的k線圖很像,後來因為要把那個圖表換成像比特時代裏面的k線圖壹樣的,所以為了把圖做的更專業壹些,就只有借鑒壹下他們的插件,然後就把專業的...
IOS端K线系列之K线、OHLC线、分时线基础知识
本文主要介绍在IOS端开发K线框架时所需要的一些最基础的知识。包括对股票、现货的不同,对蜡烛(又称K线)、OHLC线、分时图的详细叙述。如有不足或者纰漏,可随时拍砖评论。如下分为6点进行介绍:1、股票 股票(stock)是股份公司发行的所有权凭证,是股份公司为筹集资金而发行给各个股东作为持股凭证并借以取得股息和红利的一种有价证券。每股股票都代表股东对企业拥有一个基本单位的所有权。每支股票背后都有
前端绘制k线图 -- 原生js canvas图表绘制
样式如下图 源码地址:https://github.com/sutianbinde/charts 演示地址:kchart.html 编写这个需要具备canvas基础,如果没有canvas基础可以学习我前面的cnavas基础博客。 具体步骤 创建html文件,然后我们在页面中写一个用于放图表的 div 然后在js中写入数据,和 绘制图表的方法 (数据是一个三维数...
Pandas - K线数据处理 - 数据聚合
目录 一、K线分析 二、pandas.DataFrame.resample - 内置聚合方法 2-0 测试数据初始化 2-1resample 的 3分钟聚合 2-2resample 的 30s 拆成 2-3 自定义聚合逻辑 - apply 2-4 DataFrame 对象的 resample 处理方式 三、K线聚合的业务实现 方式一、获取批量数据 + resample处理...
RiceQuant和 JoinQuant合成月k线、周k线的极简公式
米筐和聚宽没有直接可以获取月k线,周k线的函数,为此写了一个极简函数可以获取日k线,周k线,月k线,乃至分钟k线。如下: 聚宽: def get_period_price_wjlec(stock, rule='W', start_date=None, end_date=None, frequency='daily', fields=None, \ skip_paused=True, fq='pre', count=None): '''
php代码生成k线数据,K线数据 · API无忧接口文档 · 看云
# 行情_K线调用地址:http(s)://stock.api51.cn/kline# 请求参数|参数名|类型|必填|最大长度|默认值|中文名|描述|| --- | --- |--- | --- |--- | --- |--- | --- ||get_type|String|是|1||查找类别|offset 按偏移查找;range 按日期区间查找;必须输入其中一个值||prod_code|Stri...
OBD诊断(K线/CAN线)
OBD诊断(CAN线、K线、J1939)
js K线图 KLine js源码 与okex网站一致
js K线图,js股票交易K线图,交易分析,okex网站行情分析K线图。
BaoStock:深度解析A股K线
BaoStock是一家专注于金融数据服务的公司,其平台提供了丰富的中国A股市场数据。通过BaoStock,用户可以轻松获取到A股市场的股票、指数、基金等多种金融工具的K线数据,用于技术分析、趋势预测和量化研究。通过本文的深度解析,我们了解了BaoStock平台提供的A股K线数据的获取方式、数据的基本结构,以及如何通过技术分析和可视化分析来更好地理解市场。K线数据是投资决策和量化研究的基础,而BaoStock平台提供了强大的工具,使得用户能够轻松获取并应用这些关键数据。
JavaScript实现绘制K线图(附完整源码)
JavaScript实现绘制K线图(附完整源码)
Python 获取股票K线数据
玩过股票的几乎都知道,股票历史交易日的开盘价、收盘价、最高价、最低价等指标是选股的重要依据。虽然仅仅依靠它们无法在股市中盆满钵满,但是运用好它确实能在较大程度上提高我们的赚钱概率。当前的金融数据查看工具确实够多,例如东方财富、同花顺等知名财经网站。它们的数据很全,但是集成程度太高了,难以满足每个人的个性化需求。比如说我以A股的4000多只股票为研究对象,想研究它们的历史日k线数据,那么导出这么多数据无疑是一个巨大的工程。并且这些财经网站可能并不会给免费用户提供批量导出数据的功能。
Python实现生成股票K线历史数据
在股票交易领域,K线图是一种广泛应用的技术分析图表。可以通过Python程序模拟生成股票的K线历史数据,为投资者提供参考依据和决策支持。本文将介绍如何用Python实现生成股票K线历史数据,并附上相应的源代码。通过以上的代码,我们可以非常方便地模拟生成股票K线历史数据,并使用matplotlib库将其可视化展示出来。在开始模拟生成K线历史数据之前,我们需要准备一些必要的数据,包括开盘价、收盘价、最高价、最低价等。K线图中每个小块代表一天的股票交易情况,包括开盘价、收盘价、最高价、最低价等信息。
量化交易系列【5】:如何快速的将日K线数据转换为周K线及月K线数据,神奇的resample函数
量化交易:将日K线转换为周K及月K数据,resample函数的用法。
JavaScript实现K线图
使用js编写的K线图实现方式,使用H5canvas绘图方案。支持左右滑动,手势缩放,长按显示十字光标功能。对于移动端的手势触摸事件使用了Hammer.js库,对这个库的使用集中在kline.js底部的bindListener方法内,不熟悉这个库的可以替换相应事件。不需要任何配置,双击打开kline.html即可运行。
JS的K线图demo
专业的JS的K线图demo,多种浏览器兼容,直接打开可用,可自测。专业的JS的K线图demo,多种浏览器兼容,直接打开可用,可自测。
pandas - 股票K线数据重采样
1 股票K线图 K线图这种图表源处于日本德川幕府时代,被当时日本米市的商人用来记录米市的行情与价格波动,后因其细腻独到的标画方式而被引入到股市及期货市场。 1.1 K线图基本形态 1.2 K线图的计算周期 不同的时间间隔看待股票数据变化,会有不一样的发现! K线的计算周期可将其分为日K线,周K线,月K线,年K线 很多网站提供了日线、周K线、月K线等周期数据,但是最原始的只有日K...
基于STM32 FOC下桥三电阻采样方式的电机相电流重构方法
如何提高三电阻采样的调制率
2617



被折叠的 条评论
为什么被折叠?



