Java tutorial
/* Copyright (C) 2001-2012, Joao Medeiros, Paulo Vilela (grafix2.com) Este arquivo parte do programa Grafix2.com Grafix2.com um software livre; voc pode redistribui-lo e/ou modifica-lo dentro dos termos da Licena Pblica Geral GNU como publicada pela Fundao do Software Livre (FSF); na verso 2 da Licena. Este programa distribuido na esperana que possa ser til, mas SEM NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAO a qualquer MERCADO ou APLICAO EM PARTICULAR. Veja a Licena Pblica Geral GNU para maiores detalhes. Voc deve ter recebido uma cpia da Licena Pblica Geral GNU junto com este programa, se no, veja uma cpia em <http://www.gnu.org/licenses/> */ package grafix.graficos.indices; import grafix.principal.*; import grafix.telas.JanelaGraficos; import java.awt.BasicStroke; import java.awt.Color; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYDifferenceRenderer; public class IndiceBollinger extends Indice { public IndiceBollinger() { this(null, 2, false, 5, 2, 0); } public IndiceBollinger(Color cor, int espessura, boolean f, int p1, int p2, int p3) { super(ConstrutorDeIndices.INDICE_BOLLINGER, "Bollinger", cor, espessura, f, p1, p2, p3); criarParam1("Perodo", p1); criarParam2("Desvios", p2); // "Desvios ????" } protected void configurarIndice() { this.setNomeIndice("Bandas de Bollinger"); } @Override public void plotar(final XYPlot plot, final JanelaGraficos janela, final int contador) { float[] color = getCor().getComponents(null); XYDifferenceRenderer r = new XYDifferenceRenderer(new Color(color[0], color[1], color[2], .1f), Color.red, false); r.setStroke(new BasicStroke(.75f)); r.setPaint(getCor()); plot.setRenderer(contador, r); plot.setDataset(contador, getDataSet(janela)); } protected void calcularValoresIndice(Acao acao) { int N = acao.getNumeroRegistros(); int periodo = getParam1(); int desvios = getParam2(); double[] mm = IndiceMM.calcularMM(acao, periodo); double[] desvPad = calcularDesvioPadrao(acao, mm, periodo); double[] bandaSuperior = new double[N]; double[] bandaInferior = new double[N]; if (periodo >= N) { setValores(new ValoresIndice(this, acao, dadosZerados(N), dadosZerados(N))); return; } for (int i = 0; i < periodo; i++) { bandaSuperior[i] = ValoresIndice.SEM_VALOR; bandaInferior[i] = ValoresIndice.SEM_VALOR; } for (int i = periodo; i < N; i++) { if (acao.getRegistro(i).getClose() == 0) { bandaSuperior[i] = ValoresIndice.SEM_VALOR; bandaInferior[i] = ValoresIndice.SEM_VALOR; } else { bandaSuperior[i] = mm[i] + (desvPad[i] * desvios); bandaInferior[i] = mm[i] - (desvPad[i] * desvios); } } setValores(new ValoresIndice(this, acao, bandaSuperior, bandaInferior)); } static public double[] calcularDesvioPadrao(final Acao acao, final double[] mm, final int periodo) { double[] desv = new double[mm.length]; for (int i = periodo; i < mm.length; i++) { double soma = 0; for (int j = 0; j < periodo; j++) { soma += Math.pow(mm[i] - acao.getRegistro(i - j).getClose(), 2); } desv[i] = Math.sqrt(soma / periodo); } return desv; } }