public void BarrierFacts() { var t = 1.0; var k = 100; var b = 0.0; var f = 100; var vol = 0.32; var rf = 0.05; var cp = OptionType.C; //zero barrier knock-in down is worthless var PV = BlackFunctions.BarrierOptionPV(f, k, rf, t, vol, cp, b, BarrierType.KI, BarrierSide.Down); Assert.Equal(0.0, PV, 10); //zero barrier knock-in up is worth vanilla var vanillaPV = BlackFunctions.BlackPV(f, k, rf, t, vol, cp); PV = BlackFunctions.BarrierOptionPV(f, k, rf, t, vol, cp, b, BarrierType.KI, BarrierSide.Up); Assert.Equal(vanillaPV, PV, 10); //ki forward is worth same as fwd b = 100; k = 110; var PVc = BlackFunctions.BarrierOptionPV(f, k, rf, t, vol, OptionType.C, b, BarrierType.KI, BarrierSide.Down); var PVp = BlackFunctions.BarrierOptionPV(f, k, rf, t, vol, OptionType.P, b, BarrierType.KI, BarrierSide.Down); var df = Exp(-rf * t); var fwdPV = (f - k) * df; Assert.Equal(fwdPV, PVc - PVp, 10); }