代码生成k线数据

代码生成k线数据

https://blog.csdn.net/hanmuling/article/details/70312671

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();
  }
 
}

如何生成3分钟,5分钟,n分钟K线数据

这里讨论的不是如何画k线,而是如何生成特定周期k线的最高价,最低价,开盘价,收盘价。
在vnpy的vn.trader的ctaDemo中,群主大人给出了生成1分钟K线的数据的方法:只要tick.datetime.minute不同就是一条新的K线。
但怎么生成3分钟,5分钟,10分钟,15分钟的k线呢?
从群里的讨论,目前有两种方式:

1、利用tick.datetime.minute, 如果 tick.datetime.minute 能被3,5,10,15整除(也就是余数为0),那么就可以是一条新k线。
tickMinute % 3 == 0
tickMinute % 5 == 0
tickMinute % 10 == 0
tickMinute % 15 == 0
对于期货来说,这种方法到15分钟就为止了,因为期货有中间休盘时间,上午的10:15-10:30。所以15分钟以上的时间周期,要看你的策略需要的是什么样的K线。

2、利用pandas.resample
既然已经知道1分钟的k线了,那可不可以在1分钟的基础上来计算出其他时间k线呢?当然可以,请使用较新版本的pandas:
假设df为:

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值