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 ()))))