
import java.applet.*;
import java.awt.*;

public class SVPrice extends Applet {
  SVPriceFrame svpf;
  Button startASimu;
    public SVPrice() {
      setLayout(new GridLayout(1,1));
      add(startASimu = new Button("Compute Option Prices Now"));
      svpf = new SVPriceFrame();
      svpf.setTitle("Stochastic Volatility Option Pricing Simulation");
      svpf.pack();
      svpf.resize(500,400);}
    public boolean action(Event e, Object arg) {
      if(e.target == startASimu) {
        svpf.reset();
        return true;}
      return false;}}

class SVPriceFrame extends Frame {
  double[] initSigmas;
  Label[] opvals; 
  TextField r,sigmabar,kappa,sigmasigma,ttm,s0,strike,nsimu,nper;
  Button newRandomDraws,resetInputs;
  SVPriceEngine vroom;
  int i;
  public SVPriceFrame() {
    setLayout(new BorderLayout());
    Panel outputs = new Panel();
      outputs.setLayout(new GridLayout(6,2));
      outputs.add(new Label("Initial Sigma"));
      outputs.add(new Label("Call Price"));
      opvals = new Label[5];
      initSigmas = new double[5];
      for(i=0;i<5;i++) {
        initSigmas[i] = .3 + .05*((double) i);
        outputs.add(new Label(Double.toString(initSigmas[i])));
        outputs.add(opvals[i] = new Label("**********"));
        opvals[i].setForeground(Color.yellow);}
    add("North",outputs);
    Panel inputs = new Panel();
      inputs.setLayout(new GridLayout(8,3));
      inputs.add(new Label("stock price")); 
      inputs.add(new Label("strike price")); 
      inputs.add(new Label("number of simus"));   
      inputs.add(s0=new TextField("50",10));
      inputs.add(strike=new TextField("60",10));  
      inputs.add(nsimu=new TextField("100",10));
      inputs.add(new Label("interest (%/yr)"));
      inputs.add(new Label("avg sigma (%/yr)"));
      inputs.add(new Label("kappa (%/yr)"));
      inputs.add(r=new TextField("5",10));
      inputs.add(sigmabar=new TextField("40",10));
      inputs.add(kappa=new TextField("3.0",10));
      inputs.add(new Label("vol of vol (%/yr)"));
      inputs.add(new Label("time to mat (yr)"));
      inputs.add(new Label("# subperiods"));
      inputs.add(sigmasigma=new TextField("10",10));
      inputs.add(ttm=new TextField("5",10));
      inputs.add(nper=new TextField("25",10));
      inputs.add(newRandomDraws = new Button("Compute Prices"));
      inputs.add(new Label(""));
      inputs.add(new Label(""));
      inputs.add(resetInputs = new Button("Reset Parameters"));
    add("South",inputs);
    vroom = new SVPriceEngine();}
  public void startSimu() {
    newRandomDraws.setLabel("-- Computing --");
    newRandomDraws.setForeground(Color.red);
    for(i=0;i<5;i++) {
      opvals[i].setForeground(Color.yellow);}
    for(i=0;i<5;i++) {
      vroom.newPars(text2double(ttm),(int) text2double(nper),
        text2double(r)/100.0,initSigmas[i],text2double(sigmabar)/100.0,
        text2double(kappa)/100.0,text2double(sigmasigma)/100.0);
      opvals[i].setText(String.valueOf((float)
        vroom.eurCall(text2double(s0),text2double(strike),
          (long) text2double(nsimu))));
      opvals[i].setForeground(Color.black);}
    newRandomDraws.setLabel("Compute Prices");
    newRandomDraws.setForeground(Color.black);}
  public void reset() {
    r.setText("5");
    sigmabar.setText("40");
    kappa.setText("3.0");
    sigmasigma.setText("10");
    ttm.setText("5");
    nper.setText("25");
    s0.setText("50");
    strike.setText("60");
    nsimu.setText("100");
    show();}
  public boolean action(Event e, Object arg) {
    if(e.target == newRandomDraws) {
      startSimu();
      return true;}
    if(e.target == resetInputs) {
      reset();
      return true;}
    return false;}
  public boolean handleEvent(Event event) {
    if(event.id == Event.WINDOW_DESTROY) {
      dispose();}
    return super.handleEvent(event);}

  double text2double(TextField tf) {
    return Double.valueOf(tf.getText()).doubleValue();}}


