1.生成K线的开盘时间,收盘时间
1.0品种的交易时间
public class ProductTradeTime{
private String id;
/**品种id*/
private String productId;
/**上午第一节开始*/
private String moringFirstStart;
/**上午第一节停止*/
private String moringFirstStop;
/**上午第二节开始*/
private String moringSecondStart;
/**上午第二节停止*/
private String moringSecondStop;
/**下午开始*/
private String afternoonStart;
/**下午停止*/
private String afternoonStop;
/**有无夜盘*/
private Boolean isNightTrade;
/**夜盘开始*/
private String nightStart;
/**夜盘停止*/
private String nightStop;
/**创建日期*/
private Date createTime;
}
交易时间:http://www.qhsxf.com/期货交易时间.html
计算localtime的时间差
//总是用晚的减早的
public long getLocalTimeDiff(LocalTime localTime1, LocalTime localTime2){
long diff = 0;
Date dateTime1 = null;
Date dateTime2 = null;
//不跨天
if(localTime1.compareTo(localTime2)>=0){
String dateStr = DateTimeUntil.dateToString(new Date(),"yyyy-MM-dd");
dateTime1 = DateTimeUntil.StringToDate(dateStr+" "+localTime1.toString(),"yyyy-MM-dd HH:mm");
dateTime2 = DateTimeUntil.StringToDate(dateStr+" "+localTime2.toString(),"yyyy-MM-dd HH:mm");
}
//跨天时的计算
else if(localTime1.compareTo(localTime2)<0){
Calendar calendar = Calendar.getInstance();
String dateStr1 = DateTimeUntil.dateToString(calendar.getTime(),"yyyy-MM-dd");
calendar.add(Calendar.DAY_OF_YEAR,-1);
String dateStr2 = DateTimeUntil.dateToString(calendar.getTime(),"yyyy-MM-dd");
dateTime1 = DateTimeUntil.StringToDate(dateStr1+" "+localTime1.toString(),"yyyy-MM-dd HH:mm");
dateTime2 = DateTimeUntil.StringToDate(dateStr2+" "+localTime2.toString(),"yyyy-MM-dd HH:mm");
}
diff = dateTime1.getTime()- dateTime2.getTime();
return diff;
}
1.1分钟线
无夜盘分钟线
public void produceKlineIndexNoNightMin(ProductTradeTime TradeTime,int nTimeLen){
this.m_lst_klineCycleIndex.clear();
LocalTime starttime = LocalTime.parse(TradeTime.getMoringFirstStart()); //晚上21:00:00
LocalTime endtime = TechIndexDateUtils.addSecsLocalTime(starttime, nTimeLen*60);
LocalTime restMarketEnd0 = LocalTime.parse(TradeTime.getMoringFirstStart());
LocalTime restMarketStart1 = LocalTime.parse(TradeTime.getMoringFirstStop());
LocalTime restMarketEnd1 = LocalTime.parse(TradeTime.getMoringSecondStart());
LocalTime restMarketStart2 = LocalTime.parse(TradeTime.getMoringSecondStop());
LocalTime restMarketEnd2 = LocalTime.parse(TradeTime.getAfternoonStart());
LocalTime restMarketEnd3 = LocalTime.parse(TradeTime.getAfternoonStop());
do{
TechIndexKlineCycleIndex kLineCycleIndex = new TechIndexKlineCycleIndex();
Date start = DateTimeUntil.StringToDate(starttime.toString(),"HH:mm");
Date end = DateTimeUntil.StringToDate(endtime.toString(),"HH:mm");
kLineCycleIndex.setTime_open(start);
//当前K线周期包含10:15-10:30
if(starttime.compareTo(restMarketStart1)<=0 && endtime.compareTo(restMarketEnd1)>=0){
long diff = getLocalTimeDiff(restMarketEnd1,restMarketStart1)/1000;
endtime = TechIndexDateUtils.addSecsLocalTime(endtime,(int)diff);//15*60
}
//当前K线end==10:15
else if(endtime.compareTo(restMarketStart1)==0){
endtime = restMarketEnd1;//15*60
}
//当前K线end在10:15-10:30之间
else if(endtime.compareTo(restMarketStart1)>0 && endtime.compareTo(restMarketEnd1)<0){
long diff = getLocalTimeDiff(endtime,restMarketStart1)/1000;
endtime = TechIndexDateUtils.addSecsLocalTime(restMarketEnd1,(int)diff);//15*60
}
//当前K线周期的endtime>==11:30
if(endtime.compareTo(restMarketStart2)>=0 && endtime.compareTo(restMarketEnd2)<0){
Date date = DateTimeUntil.StringToDate(endtime.toString(),"HH:mm");
Date date1 = DateTimeUntil.StringToDate(restMarketStart2.toString(),"HH:mm");
int diffmin = (int) ((date.getTime()-date1.getTime())/(1000*60));
endtime = TechIndexDateUtils.addSecsLocalTime(restMarketEnd2,diffmin*60);
}
//当前K线周期的endtime>=15:00 && starttime<15:00
if(endtime.compareTo(restMarketEnd3)>=0 && starttime.compareTo(restMarketEnd3)<0){
endtime = restMarketEnd3;
}
end = DateTimeUntil.StringToDate(endtime.toString(),"HH:mm");
kLineCycleIndex.setTime_close(end);
this.m_lst_klineCycleIndex.add(kLineCycleIndex);
starttime = endtime;
endtime = TechIndexDateUtils.addSecsLocalTime(starttime, nTimeLen*60);
}while(starttime.compareTo(restMarketEnd3) != 0);
System.out.println("zxc");
}
有夜盘分钟线
public void produceKlineIndexForNightMin(ProductTradeTime TradeTime,int nTimeLen){
this.m_lst_klineCycleIndex.clear();
LocalTime starttime = LocalTime.parse(TradeTime.getNightStart()); //晚上21:00:00
LocalTime endtime = TechIndexDateUtils.addSecsLocalTime(starttime, nTimeLen*60);
LocalTime restMarketStart0 = LocalTime.parse(TradeTime.getNightStop());
LocalTime restMarketEnd0 = LocalTime.parse(TradeTime.getMoringFirstStart());
LocalTime restMarketStart1 = LocalTime.parse(TradeTime.getMoringFirstStop());
LocalTime restMarketEnd1 = LocalTime.parse(TradeTime.getMoringSecondStart());
LocalTime restMarketStart2 = LocalTime.parse(TradeTime.getMoringSecondStop());
LocalTime restMarketEnd2 = LocalTime.parse(TradeTime.getAfternoonStart());
LocalTime restMarketEnd3 = LocalTime.parse(TradeTime.getAfternoonStop());
if(endtime.compareTo(restMarketStart0)==0){
endtime = restMarketEnd0;
}
do{
TechIndexKlineCycleIndex kLineCycleIndex = new TechIndexKlineCycleIndex();
Date start = DateTimeUntil.StringToDate(starttime.toString(),"HH:mm");
Date end = DateTimeUntil.StringToDate(endtime.toString(),"HH:mm");
kLineCycleIndex.setTime_open(start);
kLineCycleIndex.setTime_close(end);
this.m_lst_klineCycleIndex.add(kLineCycleIndex);
starttime = endtime;
endtime = TechIndexDateUtils.addSecsLocalTime(starttime, nTimeLen*60);
//当前K线周期的endtime落在02:30-09:00内
//跨天
if(restMarketStart0.compareTo(restMarketEnd0)<0){
//有夜盘跨天(0点后收盘)则将在收盘时间外的时间算到第二天开盘
if(endtime.compareTo(restMarketStart0)>=0 && endtime.compareTo(restMarketEnd0)<=0){
Date date = DateTimeUntil.StringToDate(endtime.toString(),"HH:mm");
Date date1 = DateTimeUntil.StringToDate(restMarketStart0.toString(),"HH:mm");
int diffmin = (int)(date.getTime()-date1.getTime())/(1000*60);
endtime = TechIndexDateUtils.addSecsLocalTime(restMarketEnd0,diffmin*60);
}
}
//没有跨天
if(restMarketStart0.compareTo(restMarketEnd0)>0){
//有夜盘没有跨天(0点前收盘)则将在收盘时间外的时间算到第二天开盘
if(endtime.compareTo(restMarketStart0)>=0 || endtime.compareTo(restMarketEnd0)<=0){
Date date = DateTimeUntil.StringToDate(endtime.toString(),"HH:mm");
Date date1 = DateTimeUntil.StringToDate(restMarketStart0.toString(),"HH:mm");
int diffmin = (int)(date.getTime()-date1.getTime())/(1000*60);
endtime = TechIndexDateUtils.addSecsLocalTime(restMarketEnd0,diffmin*60);
}
}
//当前K线周期包含10:15-10:30
if(starttime.compareTo(restMarketStart1)<=0 && endtime.compareTo(restMarketEnd1)>=0){
endtime = TechIndexDateUtils.addSecsLocalTime(endtime,15*60);
}
//当前K线end==10:15
else if(endtime.compareTo(restMarketStart1)==0){
endtime = restMarketEnd1;//15*60
}
//当前K线end在10:15-10:30之间
else if(endtime.compareTo(restMarketStart1)>0 && endtime.compareTo(restMarketEnd1)<0){
long diff = getLocalTimeDiff(endtime,restMarketStart1)/1000;
endtime = TechIndexDateUtils.addSecsLocalTime(restMarketEnd1,(int)diff);//15*60
}
//当前K线周期的endtime>==11:30
if(endtime.compareTo(restMarketStart2)>=0 && endtime.compareTo(restMarketEnd2)<0){
Date date = DateTimeUntil.StringToDate(endtime.toString(),"HH:mm");
Date date1 = DateTimeUntil.StringToDate(restMarketStart2.toString(),"HH:mm");
int diffmin = (int) ((date.getTime()-date1.getTime())/(1000*60));
endtime = TechIndexDateUtils.addSecsLocalTime(restMarketEnd2,diffmin*60);
}
//当前K线周期的endtime>=15:00 && starttime<15:00
if(endtime.compareTo(restMarketEnd3)>=0 && starttime.compareTo(restMarketEnd3)<0){
endtime = restMarketEnd3;
}
}while(starttime.compareTo(restMarketEnd3) != 0);
System.out.println("zxc");
}
1.2小时线
无夜盘小时线
public void produceKlineIndexNoNightHour(ProductTradeTime TradeTime,int nTimeLen){
this.m_lst_klineCycleIndex.clear();
LocalTime starttime = LocalTime.parse(TradeTime.getMoringFirstStart()); //晚上21:00:00
LocalTime endtime = TechIndexDateUtils.addSecsLocalTime(starttime, nTimeLen * 60*60);
LocalTime restMarketEnd0 = LocalTime.parse(TradeTime.getMoringFirstStart());
LocalTime restMarketStart1 = LocalTime.parse(TradeTime.getMoringFirstStop());
LocalTime restMarketEnd1 = LocalTime.parse(TradeTime.getMoringSecondStart());
LocalTime restMarketStart2 = LocalTime.parse(TradeTime.getMoringSecondStop());
LocalTime restMarketEnd2 = LocalTime.parse(TradeTime.getAfternoonStart());
LocalTime restMarketEnd3 = LocalTime.parse(TradeTime.getAfternoonStop());
do{
TechIndexKlineCycleIndex kLineCycleIndex = new TechIndexKlineCycleIndex();
Date start = DateTimeUntil.StringToDate(starttime.toString(),"HH:mm");
Date end = DateTimeUntil.StringToDate(endtime.toString(),"HH:mm");
kLineCycleIndex.setTime_open(start);
//当前K线周期包含10:15-10:30
if(starttime.compareTo(restMarketStart1)<=0 && endtime.compareTo(restMarketEnd1)>=0){
long diff = getLocalTimeDiff(restMarketEnd1,restMarketStart1)/1000;
endtime = TechIndexDateUtils.addSecsLocalTime(endtime,(int)diff);//15*60
}
//当前K线周期的endtime>==11:30
if(endtime.compareTo(restMarketStart2)>=0 && endtime.compareTo(restMarketEnd2)<0){
Date date = DateTimeUntil.StringToDate(endtime.toString(),"HH:mm");
Date date1 = DateTimeUntil.StringToDate(restMarketStart2.toString(),"HH:mm");
int diffmin = (int) ((date.getTime()-date1.getTime())/(1000*60));
endtime = TechIndexDateUtils.addSecsLocalTime(restMarketEnd2,diffmin*60);
}
//当前K线周期的endtime>=15:00 && starttime<15:00
if(endtime.compareTo(restMarketEnd3)>=0 && starttime.compareTo(restMarketEnd3)<0){
endtime = restMarketEnd3;
}
end = DateTimeUntil.StringToDate(endtime.toString(),"HH:mm");
kLineCycleIndex.setTime_close(end);
this.m_lst_klineCycleIndex.add(kLineCycleIndex);
starttime = endtime;
endtime = TechIndexDateUtils.addSecsLocalTime(starttime, nTimeLen * 60*60);
}while(starttime.compareTo(restMarketEnd3) != 0);
System.out.println("zxc");
}
有夜盘小时线
public void produceKlineIndexForNightHour(ProductTradeTime TradeTime,int nTimeLen){
this.m_lst_klineCycleIndex.clear();
LocalTime starttime = LocalTime.parse(TradeTime.getNightStart()); //晚上21:00:00
LocalTime endtime = TechIndexDateUtils.addSecsLocalTime(starttime, nTimeLen * 60*60);
LocalTime restMarketStart0 = LocalTime.parse(TradeTime.getNightStop());
LocalTime restMarketEnd0 = LocalTime.parse(TradeTime.getMoringFirstStart());
LocalTime restMarketStart1 = LocalTime.parse(TradeTime.getMoringFirstStop());
LocalTime restMarketEnd1 = LocalTime.parse(TradeTime.getMoringSecondStart());
LocalTime restMarketStart2 = LocalTime.parse(TradeTime.getMoringSecondStop());
LocalTime restMarketEnd2 = LocalTime.parse(TradeTime.getAfternoonStart());
LocalTime restMarketEnd3 = LocalTime.parse(TradeTime.getAfternoonStop());
if(endtime.compareTo(restMarketStart0)==0){
endtime = restMarketEnd0;
}
do{
TechIndexKlineCycleIndex kLineCycleIndex = new TechIndexKlineCycleIndex();
Date start = DateTimeUntil.StringToDate(starttime.toString(),"HH:mm");
Date end = DateTimeUntil.StringToDate(endtime.toString(),"HH:mm");
kLineCycleIndex.setTime_open(start);
kLineCycleIndex.setTime_close(end);
this.m_lst_klineCycleIndex.add(kLineCycleIndex);
starttime = endtime;
endtime = TechIndexDateUtils.addSecsLocalTime(starttime, nTimeLen * 60*60);
//当前K线周期的endtime落在02:30-09:00内
//跨天
if(restMarketStart0.compareTo(restMarketEnd0)<0){
if(endtime.compareTo(restMarketStart0)>=0 && endtime.compareTo(restMarketEnd0)<=0){
Date date = DateTimeUntil.StringToDate(endtime.toString(),"HH:mm");
Date date1 = DateTimeUntil.StringToDate(restMarketStart0.toString(),"HH:mm");
int diffmin = (int)(date.getTime()-date1.getTime())/(1000*60);
endtime = TechIndexDateUtils.addSecsLocalTime(restMarketEnd0,diffmin*60);
}
}
//没有跨天
if(restMarketStart0.compareTo(restMarketEnd0)>0){
if(endtime.compareTo(restMarketStart0)>=0 || endtime.compareTo(restMarketEnd0)<=0){
Date date = DateTimeUntil.StringToDate(endtime.toString(),"HH:mm");
Date date1 = DateTimeUntil.StringToDate(restMarketStart0.toString(),"HH:mm");
int diffmin = (int)(date.getTime()-date1.getTime())/(1000*60);
endtime = TechIndexDateUtils.addSecsLocalTime(restMarketEnd0,diffmin*60);
}
}
//当前K线周期包含10:15-10:30
if(starttime.compareTo(restMarketStart1)<=0 && endtime.compareTo(restMarketEnd1)>=0){
endtime = TechIndexDateUtils.addSecsLocalTime(endtime,15*60);
}
//当前K线周期的endtime>==11:30
if(endtime.compareTo(restMarketStart2)>=0 && endtime.compareTo(restMarketEnd2)<0){
Date date = DateTimeUntil.StringToDate(endtime.toString(),"HH:mm");
Date date1 = DateTimeUntil.StringToDate(restMarketStart2.toString(),"HH:mm");
int diffmin = (int) ((date.getTime()-date1.getTime())/(1000*60));
endtime = TechIndexDateUtils.addSecsLocalTime(restMarketEnd2,diffmin*60);
}
//当前K线周期的endtime>=15:00 && starttime<15:00
if(endtime.compareTo(restMarketEnd3)>=0 && starttime.compareTo(restMarketEnd3)<0){
endtime = restMarketEnd3;
}
}while(starttime.compareTo(restMarketEnd3) != 0);
System.out.println("zxc");
}