/* * ------------------------------------------------------------------------- * $Id: ChartPanel.java,v 1.10 2004/05/26 18:03:06 estewart Exp $ * ------------------------------------------------------------------------- * Copyright (c) 1999 Visual Numerics Inc. All Rights Reserved. * * This software is confidential information which is proprietary to * and a trade secret of Visual Numerics, Inc. Use, duplication or * disclosure is subject to the terms of an appropriate license * agreement. * * VISUAL NUMERICS MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE * SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. VISUAL * NUMERICS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR * ITS DERIVATIVES. *-------------------------------------------------------------------------- */ package com.imsl.demo.BondChart; import com.imsl.finance.*; import com.imsl.chart.*; import java.awt.*; import java.text.*; import java.util.*; import java.io.*; /** * * @author brophy * @created September 21, 2001 */ public class ChartPanel extends JPanelChart { static final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US); static final NumberFormat percentFormat = new DecimalFormat("0.00'%'"); static private DayCountBasis basis = DayCountBasis.BasisActualActual; static private double par = 100.; static private int freq = Bond.SEMIANNUAL; private GregorianCalendar settlement; private double coupon[]; private GregorianCalendar maturity[]; private AxisXY axis; /** * Table of data curves. * Keys are the index number of the bond. * Values are Data objects. * Entries are made into this table only when a curve is needed. * When the curve is removed, its paint attribute is set to false. */ private Hashtable hashCurve; /** Creates new form ChartPanel */ public ChartPanel(DialogSelect ds) { initComponents(); Dimension ss = getToolkit().getScreenSize(); setPreferredSize(new Dimension(ss.width/2, (int)(ss.width/2/1.25))); settlement = new GregorianCalendar(); settlement.add(GregorianCalendar.DATE, 7); try { readData(); } catch (Exception e) { e.printStackTrace(); } chart = new Chart(this); chart.getChartTitle().setFontSize(20); chart.getBackground().setFillColor("lightYellow"); axis = new AxisXY(chart); axis.getAxisX().setTextFormat(new java.text.DecimalFormat("0'%'")); axis.getLegend().setPaint(true); axis.getLegend().setViewport(0.7, 1.0, 0.1, 0.9); axis.getAxisX().setWindow(0.0, 20); axis.getAxisY().setWindow(0, 1000.0); chart.getChartTitle().setTitle("Sensitivity of Bond Prices"); axis.getAxisX().getAxisTitle().setTitle("Market Rate"); axis.getAxisY().getAxisTitle().setTitle("Bond Price"); repaint(); ds.setChartPanel(this); hashCurve = new Hashtable(); for (int iBond = 0; iBond < coupon.length; iBond++) { ds.addBond(iBond, maturity[iBond], coupon[iBond]); } ds.pack(); ds.show(); } private void readData() throws IOException, java.text.ParseException { InputStream is = getClass().getResourceAsStream("TBondData.csv"); Reader fr = new InputStreamReader(is); LineNumberReader lnr = new LineNumberReader(fr); long now = new Date().getTime(); ArrayList listCoupon = new ArrayList(); ArrayList listMaturity = new ArrayList(); while (true) { String line = lnr.readLine(); if (line == null) break; StringTokenizer st = new StringTokenizer(line,","); Double coupon = Double.valueOf(st.nextToken()); Date maturity = dateFormat.parse(st.nextToken()); if (maturity.getTime() < now) continue; listCoupon.add(coupon); listMaturity.add(maturity); } // first element may yeild a "maturity is not after settlement" // exception, so just remove it now. //listCoupon.remove(0); //listMaturity.remove(0); Iterator iterCoupon = listCoupon.iterator(); Iterator iterMaturity = listMaturity.iterator(); int n = listCoupon.size(); coupon = new double[n]; maturity = new GregorianCalendar[n]; for (int k = 0; k < n; k++) { coupon[k] = ((Double)listCoupon.get(k)).doubleValue(); GregorianCalendar g = new GregorianCalendar(); g.setTime((Date)listMaturity.get(k)); maturity[k] = g; } } private Data createLine(int iBond) { int n = 101; double x[] = new double[n]; double y[] = new double[n]; for (int k = 0; k < n; k++) { x[k] = 20.0*k/(n-1); y[k] = Bond.price(settlement, maturity[iBond], 0.01*coupon[iBond], 0.01*x[k], par, freq, basis); } Color color = nextColor(); Data data = new Data(axis, x, y); data.setDataType(Data.DATA_TYPE_LINE); data.setLineColor(color); Object arg[] = new Object[2]; arg[0] = dateFormat.format(maturity[iBond].getTime()); arg[1] = percentFormat.format(coupon[iBond]); data.setTitle(arg[0]+" @ "+arg[1]); //new ToolTip(data); return data; } void showCurve(int iBond, boolean visible) { Integer IBond = new Integer(iBond); Data data = (Data)hashCurve.get(IBond); if (visible) { if (data == null) { data = createLine(iBond); hashCurve.put(IBond, data); } } if (data != null) data.setPaint(visible); repaint(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ private void initComponents() {//GEN-BEGIN:initComponents setLayout(new java.awt.BorderLayout()); }//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables // End of variables declaration//GEN-END:variables static private Color colorList[] = {Color.red, Color.blue, Color.black, Color.magenta, Color.yellow, Color.cyan}; private int nextColor = 0; private Color nextColor() { Color c = colorList[nextColor++]; if (nextColor == colorList.length) nextColor = 0; return c; } }