never executed always true always false
    1 -- GENERATED by C->Haskell Compiler, version 0.28.8 Switcheroo, 25 November 2017 (Haskell)
    2 -- Edit the ORIGNAL .chs file instead!
    3 
    4 
    5 module QuantLib.Instrument
    6   (
    7     -- * Types
    8     -- ** Instrument hierarchy
    9     GenInstrument
   10   , Instrument
   11 
   12     -- ** Additional results
   13   , AdditionalResultVal(..)
   14 
   15     -- ** Exercises and callability
   16   , Exercise(..)
   17   , ExerciseType(..)
   18   , Callability(..)
   19   , CallabilityType(..)
   20 
   21     -- ** Conventions
   22   , PositionType(..)
   23   , SettlementType(..)
   24   , SettlementMethod(..)
   25   , OptionType(..)
   26   , BarrierType(..)
   27   , DoubleBarrierType(..)
   28   , PartialBarrierRange(..)
   29   , AverageType(..)
   30   , Seniority(..)
   31   , PricingModel(..)
   32   , PerpetualFuturesPayoffType(..)
   33   , PerpetualFuturesFundingType(..)
   34 
   35     -- * Constructors
   36   , asInstrument
   37   , perpetualFutures
   38   , composite
   39 
   40     -- * Mutators
   41   , setPricingEngine
   42 
   43     -- * Inspectors
   44   , npv
   45   , errorEstimate
   46   , isExpired
   47   , valuationDate
   48   , additionalResults
   49   ) where
   50 import qualified Foreign.C.Types as C2HSImp
   51 import qualified Foreign.ForeignPtr as C2HSImp
   52 import qualified Foreign.Marshal.Utils as C2HSImp
   53 import qualified Foreign.Ptr as C2HSImp
   54 
   55 
   56 import QuantLib.Internal
   57 import QuantLib.Internal.Type hiding(ptr)
   58 import QuantLib.Internal.Common
   59 
   60 
   61 
   62 
   63 
   64 
   65 
   66 
   67 
   68 
   69 
   70 
   71 
   72 
   73 
   74 
   75 
   76 
   77 data SettlementType = Physical
   78                     | Cash
   79   deriving (Enum,Show,Eq,Read)
   80 
   81 
   82 data SettlementMethod = PhysicalOTC
   83                       | PhysicalCleared
   84                       | CollateralizedCashPrice
   85                       | ParYieldCurve
   86   deriving (Enum,Show,Eq,Read)
   87 
   88 
   89 data BarrierType = DownIn
   90                  | UpIn
   91                  | DownOut
   92                  | UpOut
   93   deriving (Enum,Show,Eq,Read)
   94 
   95 
   96 data DoubleBarrierType = KnockIn
   97                        | KnockOut
   98                        | KIKO
   99                        | KOKI
  100   deriving (Enum,Show,Eq,Read)
  101 
  102 
  103 data PartialBarrierRange = Start
  104                          | EndB1
  105                          | EndB2
  106   deriving (Show,Eq,Read)
  107 instance Enum PartialBarrierRange where
  108   succ Start = EndB1
  109   succ EndB1 = EndB2
  110   succ EndB2 = error "PartialBarrierRange.succ: EndB2 has no successor"
  111 
  112   pred EndB1 = Start
  113   pred EndB2 = EndB1
  114   pred Start = error "PartialBarrierRange.pred: Start has no predecessor"
  115 
  116   enumFromTo from to = go from
  117     where
  118       end = fromEnum to
  119       go v = case compare (fromEnum v) end of
  120                  LT -> v : go (succ v)
  121                  EQ -> [v]
  122                  GT -> []
  123 
  124   enumFrom from = enumFromTo from EndB2
  125 
  126   fromEnum Start = 0
  127   fromEnum EndB1 = 2
  128   fromEnum EndB2 = 3
  129 
  130   toEnum 0 = Start
  131   toEnum 2 = EndB1
  132   toEnum 3 = EndB2
  133   toEnum unmatched = error ("PartialBarrierRange.toEnum: Cannot match " ++ show unmatched)
  134 
  135 
  136 data AverageType = Arithmetic
  137                  | Geometric
  138   deriving (Enum,Show,Eq,Read)
  139 
  140 
  141 data Seniority = SecDom
  142                | SeniorSec
  143                | SnrFor
  144                | SeniorUnSec
  145                | SubLT2
  146                | SubLoweTier2
  147                | JrSubT2
  148                | SubUpperTier2
  149                | PrefT1
  150                | SubTier1
  151                | NoSeniority
  152   deriving (Show,Eq,Read)
  153 instance Enum Seniority where
  154   succ SecDom = SnrFor
  155   succ SeniorSec = SnrFor
  156   succ SnrFor = SubLT2
  157   succ SeniorUnSec = SubLT2
  158   succ SubLT2 = JrSubT2
  159   succ SubLoweTier2 = JrSubT2
  160   succ JrSubT2 = PrefT1
  161   succ SubUpperTier2 = PrefT1
  162   succ PrefT1 = NoSeniority
  163   succ SubTier1 = NoSeniority
  164   succ NoSeniority = error "Seniority.succ: NoSeniority has no successor"
  165 
  166   pred SnrFor = SecDom
  167   pred SeniorUnSec = SecDom
  168   pred SubLT2 = SnrFor
  169   pred SubLoweTier2 = SnrFor
  170   pred JrSubT2 = SubLT2
  171   pred SubUpperTier2 = SubLT2
  172   pred PrefT1 = JrSubT2
  173   pred SubTier1 = JrSubT2
  174   pred NoSeniority = PrefT1
  175   pred SecDom = error "Seniority.pred: SecDom has no predecessor"
  176   pred SeniorSec = error "Seniority.pred: SeniorSec has no predecessor"
  177 
  178   enumFromTo from to = go from
  179     where
  180       end = fromEnum to
  181       go v = case compare (fromEnum v) end of
  182                  LT -> v : go (succ v)
  183                  EQ -> [v]
  184                  GT -> []
  185 
  186   enumFrom from = enumFromTo from NoSeniority
  187 
  188   fromEnum SecDom = 0
  189   fromEnum SeniorSec = 0
  190   fromEnum SnrFor = 1
  191   fromEnum SeniorUnSec = 1
  192   fromEnum SubLT2 = 2
  193   fromEnum SubLoweTier2 = 2
  194   fromEnum JrSubT2 = 3
  195   fromEnum SubUpperTier2 = 3
  196   fromEnum PrefT1 = 4
  197   fromEnum SubTier1 = 4
  198   fromEnum NoSeniority = 5
  199 
  200   toEnum 0 = SecDom
  201   toEnum 1 = SnrFor
  202   toEnum 2 = SubLT2
  203   toEnum 3 = JrSubT2
  204   toEnum 4 = PrefT1
  205   toEnum 5 = NoSeniority
  206   toEnum unmatched = error ("Seniority.toEnum: Cannot match " ++ show unmatched)
  207 
  208 
  209 data PricingModel = Midpoint
  210                   | ISDA
  211   deriving (Enum,Show,Eq,Read)
  212 
  213 
  214 data RestructuringType = NoRestructuring
  215                        | XR
  216                        | ModifiedRestructuring
  217                        | MR
  218                        | ModifiedModifiedRestructuring
  219                        | MM
  220                        | FullRestructuring
  221                        | CR
  222                        | AnyRestructuring
  223   deriving (Show,Eq,Read)
  224 instance Enum RestructuringType where
  225   succ NoRestructuring = ModifiedRestructuring
  226   succ XR = ModifiedRestructuring
  227   succ ModifiedRestructuring = ModifiedModifiedRestructuring
  228   succ MR = ModifiedModifiedRestructuring
  229   succ ModifiedModifiedRestructuring = FullRestructuring
  230   succ MM = FullRestructuring
  231   succ FullRestructuring = AnyRestructuring
  232   succ CR = AnyRestructuring
  233   succ AnyRestructuring = error "RestructuringType.succ: AnyRestructuring has no successor"
  234 
  235   pred ModifiedRestructuring = NoRestructuring
  236   pred MR = NoRestructuring
  237   pred ModifiedModifiedRestructuring = ModifiedRestructuring
  238   pred MM = ModifiedRestructuring
  239   pred FullRestructuring = ModifiedModifiedRestructuring
  240   pred CR = ModifiedModifiedRestructuring
  241   pred AnyRestructuring = FullRestructuring
  242   pred NoRestructuring = error "RestructuringType.pred: NoRestructuring has no predecessor"
  243   pred XR = error "RestructuringType.pred: XR has no predecessor"
  244 
  245   enumFromTo from to = go from
  246     where
  247       end = fromEnum to
  248       go v = case compare (fromEnum v) end of
  249                  LT -> v : go (succ v)
  250                  EQ -> [v]
  251                  GT -> []
  252 
  253   enumFrom from = enumFromTo from AnyRestructuring
  254 
  255   fromEnum NoRestructuring = 0
  256   fromEnum XR = 0
  257   fromEnum ModifiedRestructuring = 1
  258   fromEnum MR = 1
  259   fromEnum ModifiedModifiedRestructuring = 2
  260   fromEnum MM = 2
  261   fromEnum FullRestructuring = 3
  262   fromEnum CR = 3
  263   fromEnum AnyRestructuring = 4
  264 
  265   toEnum 0 = NoRestructuring
  266   toEnum 1 = ModifiedRestructuring
  267   toEnum 2 = ModifiedModifiedRestructuring
  268   toEnum 3 = FullRestructuring
  269   toEnum 4 = AnyRestructuring
  270   toEnum unmatched = error ("RestructuringType.toEnum: Cannot match " ++ show unmatched)
  271 
  272 
  273 data AtomicDefaultType = Restructuring
  274                        | Bankruptcy
  275                        | FailureToPay
  276                        | RepudiationMoratorium
  277                        | Acceleration
  278                        | ObligationAcceleration
  279                        | Default
  280                        | ObligationDefault
  281                        | CrossDefault
  282                        | Downgrade
  283                        | MergerEvent
  284   deriving (Show,Eq,Read)
  285 instance Enum AtomicDefaultType where
  286   succ Restructuring = Bankruptcy
  287   succ Bankruptcy = FailureToPay
  288   succ FailureToPay = RepudiationMoratorium
  289   succ RepudiationMoratorium = Acceleration
  290   succ Acceleration = Default
  291   succ ObligationAcceleration = Default
  292   succ Default = Downgrade
  293   succ ObligationDefault = Downgrade
  294   succ CrossDefault = Downgrade
  295   succ Downgrade = MergerEvent
  296   succ MergerEvent = error "AtomicDefaultType.succ: MergerEvent has no successor"
  297 
  298   pred Bankruptcy = Restructuring
  299   pred FailureToPay = Bankruptcy
  300   pred RepudiationMoratorium = FailureToPay
  301   pred Acceleration = RepudiationMoratorium
  302   pred ObligationAcceleration = RepudiationMoratorium
  303   pred Default = Acceleration
  304   pred ObligationDefault = Acceleration
  305   pred CrossDefault = Acceleration
  306   pred Downgrade = Default
  307   pred MergerEvent = Downgrade
  308   pred Restructuring = error "AtomicDefaultType.pred: Restructuring has no predecessor"
  309 
  310   enumFromTo from to = go from
  311     where
  312       end = fromEnum to
  313       go v = case compare (fromEnum v) end of
  314                  LT -> v : go (succ v)
  315                  EQ -> [v]
  316                  GT -> []
  317 
  318   enumFrom from = enumFromTo from MergerEvent
  319 
  320   fromEnum Restructuring = 0
  321   fromEnum Bankruptcy = 1
  322   fromEnum FailureToPay = 2
  323   fromEnum RepudiationMoratorium = 3
  324   fromEnum Acceleration = 4
  325   fromEnum ObligationAcceleration = 4
  326   fromEnum Default = 5
  327   fromEnum ObligationDefault = 5
  328   fromEnum CrossDefault = 5
  329   fromEnum Downgrade = 6
  330   fromEnum MergerEvent = 7
  331 
  332   toEnum 0 = Restructuring
  333   toEnum 1 = Bankruptcy
  334   toEnum 2 = FailureToPay
  335   toEnum 3 = RepudiationMoratorium
  336   toEnum 4 = Acceleration
  337   toEnum 5 = Default
  338   toEnum 6 = Downgrade
  339   toEnum 7 = MergerEvent
  340   toEnum unmatched = error ("AtomicDefaultType.toEnum: Cannot match " ++ show unmatched)
  341 
  342 
  343 data PerpetualFuturesPayoffType = PerpetualFuturesLinear
  344                                 | PerpetualFuturesInverse
  345                                 | PerpetualFuturesQuanto
  346   deriving (Show,Eq,Read)
  347 instance Enum PerpetualFuturesPayoffType where
  348   succ PerpetualFuturesLinear = PerpetualFuturesInverse
  349   succ PerpetualFuturesInverse = PerpetualFuturesQuanto
  350   succ PerpetualFuturesQuanto = error "PerpetualFuturesPayoffType.succ: PerpetualFuturesQuanto has no successor"
  351 
  352   pred PerpetualFuturesInverse = PerpetualFuturesLinear
  353   pred PerpetualFuturesQuanto = PerpetualFuturesInverse
  354   pred PerpetualFuturesLinear = error "PerpetualFuturesPayoffType.pred: PerpetualFuturesLinear has no predecessor"
  355 
  356   enumFromTo from to = go from
  357     where
  358       end = fromEnum to
  359       go v = case compare (fromEnum v) end of
  360                  LT -> v : go (succ v)
  361                  EQ -> [v]
  362                  GT -> []
  363 
  364   enumFrom from = enumFromTo from PerpetualFuturesQuanto
  365 
  366   fromEnum PerpetualFuturesLinear = 0
  367   fromEnum PerpetualFuturesInverse = 1
  368   fromEnum PerpetualFuturesQuanto = 2
  369 
  370   toEnum 0 = PerpetualFuturesLinear
  371   toEnum 1 = PerpetualFuturesInverse
  372   toEnum 2 = PerpetualFuturesQuanto
  373   toEnum unmatched = error ("PerpetualFuturesPayoffType.toEnum: Cannot match " ++ show unmatched)
  374 
  375 
  376 data PerpetualFuturesFundingType = PerpetualFuturesFundingWithPreviousSpot
  377                                  | PerpetualFuturesFundingWithCurrentSpot
  378   deriving (Show,Eq,Read)
  379 instance Enum PerpetualFuturesFundingType where
  380   succ PerpetualFuturesFundingWithPreviousSpot = PerpetualFuturesFundingWithCurrentSpot
  381   succ PerpetualFuturesFundingWithCurrentSpot = error "PerpetualFuturesFundingType.succ: PerpetualFuturesFundingWithCurrentSpot has no successor"
  382 
  383   pred PerpetualFuturesFundingWithCurrentSpot = PerpetualFuturesFundingWithPreviousSpot
  384   pred PerpetualFuturesFundingWithPreviousSpot = error "PerpetualFuturesFundingType.pred: PerpetualFuturesFundingWithPreviousSpot has no predecessor"
  385 
  386   enumFromTo from to = go from
  387     where
  388       end = fromEnum to
  389       go v = case compare (fromEnum v) end of
  390                  LT -> v : go (succ v)
  391                  EQ -> [v]
  392                  GT -> []
  393 
  394   enumFrom from = enumFromTo from PerpetualFuturesFundingWithCurrentSpot
  395 
  396   fromEnum PerpetualFuturesFundingWithPreviousSpot = 0
  397   fromEnum PerpetualFuturesFundingWithCurrentSpot = 1
  398 
  399   toEnum 0 = PerpetualFuturesFundingWithPreviousSpot
  400   toEnum 1 = PerpetualFuturesFundingWithCurrentSpot
  401   toEnum unmatched = error ("PerpetualFuturesFundingType.toEnum: Cannot match " ++ show unmatched)
  402 
  403 
  404 
  405 -- |Constructs a perpetual future. Linear contracts settle and margin in the
  406 -- domestic currency of the underlying FOR/DOM pair; Inverse contracts do so
  407 -- in the foreign currency; Quanto contracts use a separate quanto currency.
  408 -- A zero-length funding frequency selects continuous funding; otherwise
  409 -- funding is discrete at the supplied period.
  410 perpetualFutures :: (PerpetualFuturesPayoffType) -- ^payoffType
  411  -> (PerpetualFuturesFundingType) -- ^fundingType
  412  -> ((Int,TimeUnit)) -- ^fundingFrequency
  413  -> (Calendar) -- ^fundingCalendar
  414  -> (DayCounter) -- ^fundingDayCounter
  415  -> IO ((Instrument))
  416 perpetualFutures a1 a2 a3 a4 a5 =
  417   let {a1' = fromEnumC a1} in 
  418   let {a2' = fromEnumC a2} in 
  419   let {(a3'1, a3'2) = fromEnumQuantity a3} in 
  420   withCalendar a4 $ \a4' -> 
  421   withDayCounter a5 $ \a5' -> 
  422   preErrorCheck $ \a6' -> 
  423   perpetualFutures'_ a1' a2' a3'1  a3'2 a4' a5' a6' >>= \res ->
  424   peekInstrument res >>= \res' ->
  425   errorCheck  a6'>>
  426   return (res')
  427 
  428 
  429 
  430 -- |Returns the net present value of the given Instrument
  431 npv :: (GenInstrument i) -> IO ((Double))
  432 npv a1 =
  433   withInstrument a1 $ \a1' -> 
  434   preErrorCheck $ \a2' -> 
  435   npv'_ a1' a2' >>= \res ->
  436   let {res' = realToFrac res} in
  437   errorCheck  a2'>>
  438   return (res')
  439 
  440 
  441 
  442 -- |returns the error estimate on the NPV when available.
  443 errorEstimate :: (GenInstrument i) -> IO ((Double))
  444 errorEstimate a1 =
  445   withInstrument a1 $ \a1' -> 
  446   preErrorCheck $ \a2' -> 
  447   errorEstimate'_ a1' a2' >>= \res ->
  448   let {res' = realToFrac res} in
  449   errorCheck  a2'>>
  450   return (res')
  451 
  452 
  453 
  454 -- |returns whether the instrument might have value greater than zero.
  455 isExpired :: (GenInstrument i) -> IO ((Bool))
  456 isExpired a1 =
  457   withInstrument a1 $ \a1' -> 
  458   preErrorCheck $ \a2' -> 
  459   isExpired'_ a1' a2' >>= \res ->
  460   let {res' = C2HSImp.toBool res} in
  461   errorCheck  a2'>>
  462   return (res')
  463 
  464 
  465 
  466 -- |returns the date the net present value refers to.
  467 valuationDate :: (GenInstrument i) -> IO ((Day))
  468 valuationDate a1 =
  469   withInstrument a1 $ \a1' -> 
  470   preErrorCheck $ \a2' -> 
  471   valuationDate'_ a1' a2' >>= \res ->
  472   let {res' = toDay res} in
  473   errorCheck  a2'>>
  474   return (res')
  475 
  476 
  477 
  478 -- |Returns QuantLib's `additionalResults()` map for the given Instrument, as an association list
  479 -- keyed by the C++ result name. The map's values are populated by the pricing engine;
  480 -- `additionalResults()` calls `calculate()` internally, so this is safe and idempotent after
  481 -- pricing.
  482 additionalResults :: (GenInstrument i) -> IO (([(String, AdditionalResultVal)]))
  483 additionalResults a1 =
  484   withInstrument a1 $ \a1' -> 
  485   preAdditionalResults $ \(a2'1, a2'2) -> 
  486   preErrorCheck $ \a3' -> 
  487   additionalResults'_ a1' a2'1  a2'2 a3' >>
  488   peekAdditionalResults  a2'1  a2'2>>= \a2'' -> 
  489   errorCheck  a3'>>
  490   return (a2'')
  491 
  492 
  493 
  494 -- |Builds a composite instrument whose NPV is the sum of the given instruments' NPVs, each scaled by its paired multiplier.
  495 composite :: [(GenInstrument i, Double)] -> IO Instrument
  496 composite = (uncurry qlCompositeInstrument) . unzip
  497 
  498 qlCompositeInstrument :: ([GenInstrument i]) -- ^instruments
  499  -> ([Double]) -- ^multipliers
  500  -> IO ((Instrument))
  501 qlCompositeInstrument a1 a2 =
  502   withInstrumentArray a1 $ \(a1'1, a1'2) -> 
  503   withDoubleArray a2 $ \(a2'1, a2'2) -> 
  504   preErrorCheck $ \a3' -> 
  505   qlCompositeInstrument'_ a1'1  a1'2 a2'1  a2'2 a3' >>= \res ->
  506   peekInstrument res >>= \res' ->
  507   errorCheck  a3'>>
  508   return (res')
  509 
  510 
  511 
  512 -- |Sets the pricing engine used to compute the instrument's results.
  513 setPricingEngine :: (GenInstrument i) -> (GenPricingEngine pe) -> IO ()
  514 setPricingEngine a1 a2 =
  515   withInstrument a1 $ \a1' -> 
  516   withPricingEngine a2 $ \a2' -> 
  517   preErrorCheck $ \a3' -> 
  518   setPricingEngine'_ a1' a2' a3' >>
  519   errorCheck  a3'>>
  520   return ()
  521 
  522 
  523 
  524 -- vim: set ff=unix ts=8 sts=2 sw=2 et:
  525 
  526 foreign import ccall safe "QuantLib/Instrument.chs.h qlPerpetualFutures"
  527   perpetualFutures'_ :: (C2HSImp.CInt -> (C2HSImp.CInt -> (C2HSImp.CInt -> (C2HSImp.CInt -> ((C2HSImp.Ptr (CCalendar)) -> ((C2HSImp.Ptr (CDayCounter)) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (IO (C2HSImp.Ptr (CInstrument'))))))))))
  528 
  529 foreign import ccall safe "QuantLib/Instrument.chs.h qlInstrumentNPV"
  530   npv'_ :: ((C2HSImp.Ptr (CInstrument')) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (IO C2HSImp.CDouble)))
  531 
  532 foreign import ccall safe "QuantLib/Instrument.chs.h qlInstrumentErrorEstimate"
  533   errorEstimate'_ :: ((C2HSImp.Ptr (CInstrument')) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (IO C2HSImp.CDouble)))
  534 
  535 foreign import ccall safe "QuantLib/Instrument.chs.h qlInstrumentIsExpired"
  536   isExpired'_ :: ((C2HSImp.Ptr (CInstrument')) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (IO C2HSImp.CInt)))
  537 
  538 foreign import ccall safe "QuantLib/Instrument.chs.h qlInstrumentValuationDate"
  539   valuationDate'_ :: ((C2HSImp.Ptr (CInstrument')) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (IO C2HSImp.CInt)))
  540 
  541 foreign import ccall safe "QuantLib/Instrument.chs.h qlInstrumentAdditionalResults"
  542   additionalResults'_ :: ((C2HSImp.Ptr (CInstrument')) -> ((C2HSImp.Ptr C2HSImp.CUInt) -> ((C2HSImp.Ptr (RawResultPtr)) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (IO ())))))
  543 
  544 foreign import ccall safe "QuantLib/Instrument.chs.h qlCompositeInstrument"
  545   qlCompositeInstrument'_ :: (C2HSImp.CUInt -> ((C2HSImp.Ptr (C2HSImp.Ptr (CInstrument'))) -> (C2HSImp.CUInt -> ((C2HSImp.Ptr C2HSImp.CDouble) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (IO (C2HSImp.Ptr (CInstrument'))))))))
  546 
  547 foreign import ccall safe "QuantLib/Instrument.chs.h qlInstrumentSetPricingEngine"
  548   setPricingEngine'_ :: ((C2HSImp.Ptr (CInstrument')) -> ((C2HSImp.Ptr (CPricingEngine')) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (IO ()))))