* Demo : http://chart.n2nconnect.com/FAChart/NNSP.jsp
Requirements: JRE 1.4.2_04 and above and set Timezone to GMT+8:00
Sorry due to time constraint, I only able to do a simple solution(demo) for
Non-Trading Day Exclusion (Holiday, suspend-day, Saturday, Sunday)
Anyone who interested can plug in this two class (JHistoricalCSChart & ConfigSegmentedTimeline) and u guys & girls can find the keyword
'ziwei', theres the place I had edited.
However if anyone using Apache Http Server or Tomcat Web Server and willing to direct plug in in Web-INF > classes. U may request from me, and I email whole package source for you, jar also can.
* Version : jfreechart-1.0.0-rc1.jar
My email address is wzwei28@yahoo.com (any comments and query are welcomed).
hope can contribute little effort in open source application.
ConfigSegmentedTimeline.java
------------------------------------
Code: Select all
/*
* (C) Copyright 2000-2006, by Wong Zi Wei.
*
*
* Original Author : Wong Zi Wei(WZW);
* Contributor(s) : -;
*
* Email : wzwei28@yahoo.com
*
* Version 1.0.1 : 21/07/2006(WZW) Store and calculate the SegmentedTimeline
*
* Error Code : 001
* 002
* 003
*
*
*/
package cfg;
import java.util.Date;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
//---segmentedTimeline---
import java.util.Calendar;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.text.SimpleDateFormat;
import java.util.SimpleTimeZone;
import java.util.TimeZone;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.axis.SegmentedTimeline;
public class ConfigSegmentedTimeline{
private static long m_lFirstMonday = 0;
private static ArrayList m_alHDate = new ArrayList();
private static SegmentedTimeline m_segmentedTimeline = null;
private static JFreeChart m_chart = null;
private static Date m_aTrdDate[] = new Date[1];
private static Date m_dtDateInit = null;
public void configSegmentedTimeline(){
}
public static void run(){
//@@ Segmented Timeline - Exclude Non-Trading Day, Suspended date, Saturday & Sunday
Date dtInit = getDateInit();
JFreeChart chart = getChart();
DateAxis axis = (DateAxis) chart.getXYPlot().getDomainAxis();
//SegmentedTimeline segmentedTimeline = SegmentedTimeline.newMondayThroughFridayTimeline();
SegmentedTimeline segmentedTimeline = new SegmentedTimeline(SegmentedTimeline.DAY_SEGMENT_SIZE, 5, 2);
if(dtInit!=null){
SimpleDateFormat sdfYC = new SimpleDateFormat("yyyy");
SimpleDateFormat sdfMC = new SimpleDateFormat("MM");
SimpleDateFormat sdfDC = new SimpleDateFormat("dd");
int iYC = Integer.parseInt(sdfYC.format(dtInit));
int iMC = Integer.parseInt(sdfMC.format(dtInit));
int iDC = Integer.parseInt(sdfDC.format(dtInit));
//-Select your Timezone-
GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT+8")); //use standard GMT + 0
//calendar.set(2006, Calendar.MARCH, 25, 12, 0, 0);
Date d1 = calendar.getTime();
//GregorianCalendar calendar = new GregorianCalendar();
ArrayList alHDate = new ArrayList(); //HDate-Hide Date
Date aTrdDate[] = getTrdDate();
Date dtDate = calendar.getTime();
int iTrdDateLast = aTrdDate.length-1;
int iIndex = 0;
if(aTrdDate.length>0){
Date aTrdDateInit = aTrdDate[0];
Date aTrdDateLast = aTrdDate[iTrdDateLast];
calendar.setTime(aTrdDateInit); //set init date
double dDays = (aTrdDateLast.getTime()-aTrdDateInit.getTime())/1000/60/60/24; //60 minutes, 60 seconds, 24 hour.
for(int i=0; i<=dDays; i++){
dtDate = calendar.getTime();
if(dtDate.equals(aTrdDate[iIndex])){
iIndex++;
}else{
alHDate.add(dtDate);
}
calendar.add(Calendar.DATE, 1);//increment 1 day
}
}
int offset = TimeZone.getDefault().getRawOffset();
TimeZone NO_DST_TIME_ZONE = new SimpleTimeZone(offset, "UTC-" + offset);
Calendar cal = new GregorianCalendar(NO_DST_TIME_ZONE);
cal.set(iYC, 0, 1, 0, 0, 0); //can't use iMC and iDC, because the crosshair have bugs in locking data
cal.set(Calendar.MILLISECOND, 0);
while (cal.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
cal.add(Calendar.DATE, 1);
}
long lFirstMonday = cal.getTime().getTime();
//Store parameter
setFirstMonday(lFirstMonday);
setHDate(alHDate);
setSegmentedTimeline(segmentedTimeline);
}
}
private static void setFirstMonday(long vs_lFirstMonday){ m_lFirstMonday = vs_lFirstMonday; }
private static void setHDate(ArrayList vs_alHDate){ m_alHDate = vs_alHDate; }
private static void setSegmentedTimeline(SegmentedTimeline vs_segmentedTimeline){ m_segmentedTimeline = vs_segmentedTimeline; }
public static void setChart(JFreeChart vs_chart){ m_chart = vs_chart; }
public static void setTrdDate(Date[] vs_aTrdDate){ m_aTrdDate = vs_aTrdDate; }
public static void setDateInit(Date vs_dtDateInit){ m_dtDateInit = vs_dtDateInit; }
public static long getFirstMonday(){ return m_lFirstMonday; }
public static ArrayList getHDate(){ return m_alHDate; }
public static SegmentedTimeline getSegmentedTimeline(){ return m_segmentedTimeline; }
public static JFreeChart getChart(){ return m_chart; }
public static Date[] getTrdDate(){ return m_aTrdDate; }
public static Date getDateInit(){ return m_dtDateInit; }
public static void main(String[] args){
}
}
JHistoricalCSChart------------------------
Code: Select all
package demo;
import java.awt.Dimension;
import java.util.Date;
import javax.swing.JPanel;
import org.jfree.chart.*;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.DefaultHighLowDataset;
import org.jfree.data.xy.OHLCDataset;
import org.jfree.date.DateUtilities;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.axis.NumberAxis;
//-ziwei import-
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import org.jfree.chart.axis.DateTickMarkPosition;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.SegmentedTimeline;
public class JHistoricalCSChart extends ApplicationFrame{
//-ziwei import-
private static cfg.ConfigSegmentedTimeline m_CST;
public JHistoricalCSChart(String s)
{
super(s);
OHLCDataset ohlcdataset = createDataset();
JFreeChart jfreechart = createChart(ohlcdataset);
jfreechart.getXYPlot().setOrientation(PlotOrientation.VERTICAL);
ChartPanel chartpanel = new ChartPanel(jfreechart);
chartpanel.setRangeZoomable(false);
chartpanel.setPreferredSize(new Dimension(500, 270));
setContentPane(chartpanel);
}
private static JFreeChart createChart(OHLCDataset ohlcdataset)
{
JFreeChart jfreechart = ChartFactory.createCandlestickChart("Historical Non-Trading Day Exclusion", "Time", "Value", ohlcdataset, true);
jfreechart.setAntiAlias(false);
XYPlot xyplot = jfreechart.getXYPlot();
//@@ edit: solution is to se the autoRangeIncludesZero to false, so that no more return to 0 for candlestick.
NumberAxis numberAxis = (NumberAxis) xyplot.getRangeAxis();
numberAxis.setAutoRangeIncludesZero(false); //exclude 0;
xyplot.setRangeAxis(numberAxis);
//@@ edit: when zooming in & out, u will notice the range had move back to 0,
//@@ edit: set Margin of range(highest & lowest margin)
ValueAxis rangeAxis = (ValueAxis) xyplot.getRangeAxis();
rangeAxis.setAutoRange(false); //no use, because in ValueAxis:In resizeRange(% > 0.0)->setAutoRange(true)->autoAdjustRange() still run it
//rangeAxis.setRangeWithMargins(20,100);
rangeAxis.setRange(20,100);
xyplot.setRangeAxis(rangeAxis);
//-ziwei Edit(Optional)-
DateAxis domainAxis = (DateAxis) xyplot.getDomainAxis();
domainAxis.setVerticalTickLabels(true);
domainAxis.setDateFormatOverride(new SimpleDateFormat("dd-MM-yy"));
//---Set bar chart to middle---
domainAxis.setTickMarkPosition(DateTickMarkPosition.MIDDLE);
//==================================================================================
//@@ Segmented Timeline - Exclude Holiday, Non-Trading Day, Suspended date, Saturday & Sunday
m_CST.setChart(jfreechart);
m_CST.run();
SegmentedTimeline segmentedTimeline = m_CST.getSegmentedTimeline();
long lFirstMonday = m_CST.getFirstMonday();
ArrayList alHDate = m_CST.getHDate();
segmentedTimeline.setStartTime(lFirstMonday); //Must remake the calendar segment to avoid overlapping (Monday-Friday)
segmentedTimeline.addExceptions(alHDate); //Exclude non-trading day
DateAxis axis = (DateAxis) jfreechart.getXYPlot().getDomainAxis();
axis.setTimeline(segmentedTimeline);
return jfreechart;
}
public static OHLCDataset createDataset()
{
Date aDate[] = new Date[9]; //(11-2=9),47
double ad[] = new double[9];
double ad1[] = new double[9];
double ad2[] = new double[9];
double ad3[] = new double[9];
double ad4[] = new double[9];
int i = 1;
byte byte0 = 2;
//-------------------------
//ziwei edit
//-1st week(monday-friday)-
aDate[0] = DateUtilities.createDate(2007, 12, 24, 12, 0);
ad[0] = 47D;
ad1[0] = 33D;
ad2[0] = 35D;
ad3[0] = 33D;
ad4[0] = 100D;
//-Holiday Christmas-
/*
aDate[1] = DateUtilities.createDate(2007, 12, 25, 12, 0);
ad[1] = 47D;
ad1[1] = 32D;
ad2[1] = 41D;
ad3[1] = 37D;
ad4[1] = 150D;
*/
aDate[1] = DateUtilities.createDate(2007, 12, 26, 12, 0);
ad[1] = 49D;
ad1[1] = 43D;
ad2[1] = 46D;
ad3[1] = 48D;
ad4[1] = 70D;
aDate[2] = DateUtilities.createDate(2007, 12, 27, 12, 0);
ad[2] = 51D;
ad1[2] = 39D;
ad2[2] = 40D;
ad3[2] = 47D;
ad4[2] = 200D;
aDate[3] = DateUtilities.createDate(2007, 12, 28, 12, 0);
ad[3] = 60D;
ad1[3] = 40D;
ad2[3] = 46D;
ad3[3] = 53D;
ad4[3] = 120D;
//-------------------------
//-2nd week(monday-friday)-
aDate[4] = DateUtilities.createDate(2007, 12, 31, 12, 0);
ad[4] = 62D;
ad1[4] = 55D;
ad2[4] = 57D;
ad3[4] = 61D;
ad4[4] = 110D;
//-New Year Holiday-
/*
aDate[6] = DateUtilities.createDate(2008, 1, 1, 12, 0);
ad[6] = 65D;
ad1[6] = 56D;
ad2[6] = 62D;
ad3[6] = 59D;
ad4[6] = 70D;
*/
aDate[5] = DateUtilities.createDate(2008, 1, 2, 12, 0);
ad[5] = 55D;
ad1[5] = 43D;
ad2[5] = 45D;
ad3[5] = 47D;
ad4[5] = 20D;
aDate[6] = DateUtilities.createDate(2008, 1, 3, 12, 0);
ad[6] = 54D;
ad1[6] = 33D;
ad2[6] = 40D;
ad3[6] = 51D;
ad4[6] = 30D;
aDate[7] = DateUtilities.createDate(2008, 1, 4, 12, 0);
ad[7] = 47D;
ad1[7] = 33D;
ad2[7] = 35D;
ad3[7] = 33D;
ad4[7] = 100D;
//-------------------------
//-3rd week(monday-friday)-
aDate[8] = DateUtilities.createDate(2008, 1, 7, 12, 0);
ad[8] = 54D;
ad1[8] = 38D;
ad2[8] = 43D;
ad3[8] = 52D;
ad4[8] = 50D;
//-------------------------
//---------------------------------------------------
//@@ SegmentedTimeline - Exclude Holiday, Non-Trading Day, Suspended date, Saturday & Sunday
m_CST.setDateInit(aDate[0]);
m_CST.setTrdDate(aDate);
return new DefaultHighLowDataset("Series 1", aDate, ad, ad1, ad2, ad3, ad4);
}
public static JPanel createDemoPanel()
{
JFreeChart jfreechart = createChart(createDataset());
return new ChartPanel(jfreechart);
}
public static void main(String args[])
{
JHistoricalCSChart JHistoricalCSChart = new JHistoricalCSChart("Historical Non-Trading Day Exclusion");
JHistoricalCSChart.pack();
RefineryUtilities.centerFrameOnScreen(JHistoricalCSChart);
JHistoricalCSChart.setVisible(true);
}
}
* Well now I am still solving bugs in overlapping and Exclusion of intraday gap (hour. i.e. 08:45-12:45 , rest, 14:30-17:15) and I want to exclude the gap in the rest session and also market close hour(17:15-08:45 another morning) for historical movement chart).
* If anyone have some solution, please email to me
wzwei28@yahoo.com, and I help to publish to everyone. Thanks!