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 PositionType(..)
8 , SettlementType(..)
9 , SettlementMethod(..)
10 , CallabilityType(..)
11 , OptionType(..)
12 , BarrierType(..)
13 , DoubleBarrierType(..)
14 , PartialBarrierRange(..)
15 , AverageType(..)
16 , Seniority(..)
17 , PricingModel(..)
18
19 , Instrument
20 , asInstrument
21 , Callability(..)
22
23 , Exercise(..)
24 , ExerciseType(..)
25
26 , AdditionalResultVal(..)
27 , npv
28 , errorEstimate
29 , isExpired
30 , valuationDate
31 , composite
32 , additionalResults
33 , setPricingEngine
34 ) where
35 import qualified Foreign.C.Types as C2HSImp
36 import qualified Foreign.ForeignPtr as C2HSImp
37 import qualified Foreign.Marshal.Utils as C2HSImp
38 import qualified Foreign.Ptr as C2HSImp
39
40
41 import QuantLib.Internal
42 import QuantLib.Internal.Type hiding(ptr)
43 import QuantLib.Internal.Common
44
45
46
47
48
49
50 data SettlementType = Physical
51 | Cash
52 deriving (Enum,Show,Eq,Read)
53
54
55 data SettlementMethod = PhysicalOTC
56 | PhysicalCleared
57 | CollateralizedCashPrice
58 | ParYieldCurve
59 deriving (Enum,Show,Eq,Read)
60
61
62 data BarrierType = DownIn
63 | UpIn
64 | DownOut
65 | UpOut
66 deriving (Enum,Show,Eq,Read)
67
68
69 data DoubleBarrierType = KnockIn
70 | KnockOut
71 | KIKO
72 | KOKI
73 deriving (Enum,Show,Eq,Read)
74
75
76 data PartialBarrierRange = Start
77 | EndB1
78 | EndB2
79 deriving (Show,Eq,Read)
80 instance Enum PartialBarrierRange where
81 succ Start = EndB1
82 succ EndB1 = EndB2
83 succ EndB2 = error "PartialBarrierRange.succ: EndB2 has no successor"
84
85 pred EndB1 = Start
86 pred EndB2 = EndB1
87 pred Start = error "PartialBarrierRange.pred: Start has no predecessor"
88
89 enumFromTo from to = go from
90 where
91 end = fromEnum to
92 go v = case compare (fromEnum v) end of
93 LT -> v : go (succ v)
94 EQ -> [v]
95 GT -> []
96
97 enumFrom from = enumFromTo from EndB2
98
99 fromEnum Start = 0
100 fromEnum EndB1 = 2
101 fromEnum EndB2 = 3
102
103 toEnum 0 = Start
104 toEnum 2 = EndB1
105 toEnum 3 = EndB2
106 toEnum unmatched = error ("PartialBarrierRange.toEnum: Cannot match " ++ show unmatched)
107
108
109 data AverageType = Arithmetic
110 | Geometric
111 deriving (Enum,Show,Eq,Read)
112
113
114 data Seniority = SecDom
115 | SeniorSec
116 | SnrFor
117 | SeniorUnSec
118 | SubLT2
119 | SubLoweTier2
120 | JrSubT2
121 | SubUpperTier2
122 | PrefT1
123 | SubTier1
124 | NoSeniority
125 deriving (Show,Eq,Read)
126 instance Enum Seniority where
127 succ SecDom = SnrFor
128 succ SeniorSec = SnrFor
129 succ SnrFor = SubLT2
130 succ SeniorUnSec = SubLT2
131 succ SubLT2 = JrSubT2
132 succ SubLoweTier2 = JrSubT2
133 succ JrSubT2 = PrefT1
134 succ SubUpperTier2 = PrefT1
135 succ PrefT1 = NoSeniority
136 succ SubTier1 = NoSeniority
137 succ NoSeniority = error "Seniority.succ: NoSeniority has no successor"
138
139 pred SnrFor = SecDom
140 pred SeniorUnSec = SecDom
141 pred SubLT2 = SnrFor
142 pred SubLoweTier2 = SnrFor
143 pred JrSubT2 = SubLT2
144 pred SubUpperTier2 = SubLT2
145 pred PrefT1 = JrSubT2
146 pred SubTier1 = JrSubT2
147 pred NoSeniority = PrefT1
148 pred SecDom = error "Seniority.pred: SecDom has no predecessor"
149 pred SeniorSec = error "Seniority.pred: SeniorSec has no predecessor"
150
151 enumFromTo from to = go from
152 where
153 end = fromEnum to
154 go v = case compare (fromEnum v) end of
155 LT -> v : go (succ v)
156 EQ -> [v]
157 GT -> []
158
159 enumFrom from = enumFromTo from NoSeniority
160
161 fromEnum SecDom = 0
162 fromEnum SeniorSec = 0
163 fromEnum SnrFor = 1
164 fromEnum SeniorUnSec = 1
165 fromEnum SubLT2 = 2
166 fromEnum SubLoweTier2 = 2
167 fromEnum JrSubT2 = 3
168 fromEnum SubUpperTier2 = 3
169 fromEnum PrefT1 = 4
170 fromEnum SubTier1 = 4
171 fromEnum NoSeniority = 5
172
173 toEnum 0 = SecDom
174 toEnum 1 = SnrFor
175 toEnum 2 = SubLT2
176 toEnum 3 = JrSubT2
177 toEnum 4 = PrefT1
178 toEnum 5 = NoSeniority
179 toEnum unmatched = error ("Seniority.toEnum: Cannot match " ++ show unmatched)
180
181
182 data PricingModel = Midpoint
183 | ISDA
184 deriving (Enum,Show,Eq,Read)
185
186
187 data RestructuringType = NoRestructuring
188 | XR
189 | ModifiedRestructuring
190 | MR
191 | ModifiedModifiedRestructuring
192 | MM
193 | FullRestructuring
194 | CR
195 | AnyRestructuring
196 deriving (Show,Eq,Read)
197 instance Enum RestructuringType where
198 succ NoRestructuring = ModifiedRestructuring
199 succ XR = ModifiedRestructuring
200 succ ModifiedRestructuring = ModifiedModifiedRestructuring
201 succ MR = ModifiedModifiedRestructuring
202 succ ModifiedModifiedRestructuring = FullRestructuring
203 succ MM = FullRestructuring
204 succ FullRestructuring = AnyRestructuring
205 succ CR = AnyRestructuring
206 succ AnyRestructuring = error "RestructuringType.succ: AnyRestructuring has no successor"
207
208 pred ModifiedRestructuring = NoRestructuring
209 pred MR = NoRestructuring
210 pred ModifiedModifiedRestructuring = ModifiedRestructuring
211 pred MM = ModifiedRestructuring
212 pred FullRestructuring = ModifiedModifiedRestructuring
213 pred CR = ModifiedModifiedRestructuring
214 pred AnyRestructuring = FullRestructuring
215 pred NoRestructuring = error "RestructuringType.pred: NoRestructuring has no predecessor"
216 pred XR = error "RestructuringType.pred: XR has no predecessor"
217
218 enumFromTo from to = go from
219 where
220 end = fromEnum to
221 go v = case compare (fromEnum v) end of
222 LT -> v : go (succ v)
223 EQ -> [v]
224 GT -> []
225
226 enumFrom from = enumFromTo from AnyRestructuring
227
228 fromEnum NoRestructuring = 0
229 fromEnum XR = 0
230 fromEnum ModifiedRestructuring = 1
231 fromEnum MR = 1
232 fromEnum ModifiedModifiedRestructuring = 2
233 fromEnum MM = 2
234 fromEnum FullRestructuring = 3
235 fromEnum CR = 3
236 fromEnum AnyRestructuring = 4
237
238 toEnum 0 = NoRestructuring
239 toEnum 1 = ModifiedRestructuring
240 toEnum 2 = ModifiedModifiedRestructuring
241 toEnum 3 = FullRestructuring
242 toEnum 4 = AnyRestructuring
243 toEnum unmatched = error ("RestructuringType.toEnum: Cannot match " ++ show unmatched)
244
245
246 data AtomicDefaultType = Restructuring
247 | Bankruptcy
248 | FailureToPay
249 | RepudiationMoratorium
250 | Acceleration
251 | ObligationAcceleration
252 | Default
253 | ObligationDefault
254 | CrossDefault
255 | Downgrade
256 | MergerEvent
257 deriving (Show,Eq,Read)
258 instance Enum AtomicDefaultType where
259 succ Restructuring = Bankruptcy
260 succ Bankruptcy = FailureToPay
261 succ FailureToPay = RepudiationMoratorium
262 succ RepudiationMoratorium = Acceleration
263 succ Acceleration = Default
264 succ ObligationAcceleration = Default
265 succ Default = Downgrade
266 succ ObligationDefault = Downgrade
267 succ CrossDefault = Downgrade
268 succ Downgrade = MergerEvent
269 succ MergerEvent = error "AtomicDefaultType.succ: MergerEvent has no successor"
270
271 pred Bankruptcy = Restructuring
272 pred FailureToPay = Bankruptcy
273 pred RepudiationMoratorium = FailureToPay
274 pred Acceleration = RepudiationMoratorium
275 pred ObligationAcceleration = RepudiationMoratorium
276 pred Default = Acceleration
277 pred ObligationDefault = Acceleration
278 pred CrossDefault = Acceleration
279 pred Downgrade = Default
280 pred MergerEvent = Downgrade
281 pred Restructuring = error "AtomicDefaultType.pred: Restructuring has no predecessor"
282
283 enumFromTo from to = go from
284 where
285 end = fromEnum to
286 go v = case compare (fromEnum v) end of
287 LT -> v : go (succ v)
288 EQ -> [v]
289 GT -> []
290
291 enumFrom from = enumFromTo from MergerEvent
292
293 fromEnum Restructuring = 0
294 fromEnum Bankruptcy = 1
295 fromEnum FailureToPay = 2
296 fromEnum RepudiationMoratorium = 3
297 fromEnum Acceleration = 4
298 fromEnum ObligationAcceleration = 4
299 fromEnum Default = 5
300 fromEnum ObligationDefault = 5
301 fromEnum CrossDefault = 5
302 fromEnum Downgrade = 6
303 fromEnum MergerEvent = 7
304
305 toEnum 0 = Restructuring
306 toEnum 1 = Bankruptcy
307 toEnum 2 = FailureToPay
308 toEnum 3 = RepudiationMoratorium
309 toEnum 4 = Acceleration
310 toEnum 5 = Default
311 toEnum 6 = Downgrade
312 toEnum 7 = MergerEvent
313 toEnum unmatched = error ("AtomicDefaultType.toEnum: Cannot match " ++ show unmatched)
314
315
316
317
318
319
320
321
322 -- |Returns the net present value of the given Instrument
323 npv :: (GenInstrument i) -> IO ((Double))
324 npv a1 =
325 withInstrument a1 $ \a1' ->
326 preErrorCheck $ \a2' ->
327 npv'_ a1' a2' >>= \res ->
328 let {res' = realToFrac res} in
329 errorCheck a2'>>
330 return (res')
331
332
333
334 -- |returns the error estimate on the NPV when available.
335 errorEstimate :: (GenInstrument i) -> IO ((Double))
336 errorEstimate a1 =
337 withInstrument a1 $ \a1' ->
338 preErrorCheck $ \a2' ->
339 errorEstimate'_ a1' a2' >>= \res ->
340 let {res' = realToFrac res} in
341 errorCheck a2'>>
342 return (res')
343
344
345
346 -- |returns whether the instrument might have value greater than zero.
347 isExpired :: (GenInstrument i) -> IO ((Bool))
348 isExpired a1 =
349 withInstrument a1 $ \a1' ->
350 preErrorCheck $ \a2' ->
351 isExpired'_ a1' a2' >>= \res ->
352 let {res' = C2HSImp.toBool res} in
353 errorCheck a2'>>
354 return (res')
355
356
357
358 -- |returns the date the net present value refers to.
359 valuationDate :: (GenInstrument i) -> IO ((Day))
360 valuationDate a1 =
361 withInstrument a1 $ \a1' ->
362 preErrorCheck $ \a2' ->
363 valuationDate'_ a1' a2' >>= \res ->
364 let {res' = toDay res} in
365 errorCheck a2'>>
366 return (res')
367
368
369
370 -- |Re-registers `struct QlAdditionalResult*` with c2hs as `RawResultPtr` (the type is defined in
371 -- `QuantLib.Internal.Common`, `nocode` here too) -- c2hs's pointer-type table is per-file, so
372 -- without this the `{#fun#}` below infers the out-parameter as the opaque `Ptr (Ptr ())` instead
373 -- of `Ptr RawResultPtr`, which fails to typecheck against `peekAdditionalResults`'s signature.
374
375
376
377 -- |Returns QuantLib's `additionalResults()` map for the given Instrument, as an association list
378 -- keyed by the C++ result name. The map's values are populated by the pricing engine;
379 -- `additionalResults()` calls `calculate()` internally, so this is safe and idempotent after
380 -- pricing.
381 additionalResults :: (GenInstrument i) -> IO (([(String, AdditionalResultVal)]))
382 additionalResults a1 =
383 withInstrument a1 $ \a1' ->
384 preArray $ \(a2'1, a2'2) ->
385 preErrorCheck $ \a3' ->
386 additionalResults'_ a1' a2'1 a2'2 a3' >>
387 peekAdditionalResults a2'1 a2'2>>= \a2'' ->
388 errorCheck a3'>>
389 return (a2'')
390
391
392
393 composite :: [(Instrument, Double)] -> IO Instrument
394 composite = (uncurry qlCompositeInstrument) . unzip
395 -- |Builds a composite instrument whose NPV is the sum of the given instruments' NPVs, each scaled by its paired multiplier.
396 qlCompositeInstrument :: ([GenInstrument i]) -- ^instruments
397 -> ([Double]) -- ^multipliers
398 -> IO ((Instrument))
399 qlCompositeInstrument a1 a2 =
400 withInstrumentArray a1 $ \(a1'1, a1'2) ->
401 withDoubleArray a2 $ \(a2'1, a2'2) ->
402 preErrorCheck $ \a3' ->
403 qlCompositeInstrument'_ a1'1 a1'2 a2'1 a2'2 a3' >>= \res ->
404 peekInstrument res >>= \res' ->
405 errorCheck a3'>>
406 return (res')
407
408
409
410 -- |Sets the pricing engine used to compute the instrument's results.
411 setPricingEngine :: (GenInstrument i) -> (PricingEngine) -> IO ()
412 setPricingEngine a1 a2 =
413 withInstrument a1 $ \a1' ->
414 withPricingEngine a2 $ \a2' ->
415 preErrorCheck $ \a3' ->
416 setPricingEngine'_ a1' a2' a3' >>
417 errorCheck a3'>>
418 return ()
419
420
421
422 -- vim: set ff=unix ts=8 sts=2 sw=2 et:
423
424 foreign import ccall safe "QuantLib/Instrument.chs.h qlInstrumentNPV"
425 npv'_ :: ((C2HSImp.Ptr (CInstrument')) -> ((C2HSImp.Ptr (C2HSImp.Ptr C2HSImp.CChar)) -> (IO C2HSImp.CDouble)))
426
427 foreign import ccall safe "QuantLib/Instrument.chs.h qlInstrumentErrorEstimate"
428 errorEstimate'_ :: ((C2HSImp.Ptr (CInstrument')) -> ((C2HSImp.Ptr (C2HSImp.Ptr C2HSImp.CChar)) -> (IO C2HSImp.CDouble)))
429
430 foreign import ccall safe "QuantLib/Instrument.chs.h qlInstrumentIsExpired"
431 isExpired'_ :: ((C2HSImp.Ptr (CInstrument')) -> ((C2HSImp.Ptr (C2HSImp.Ptr C2HSImp.CChar)) -> (IO C2HSImp.CInt)))
432
433 foreign import ccall safe "QuantLib/Instrument.chs.h qlInstrumentValuationDate"
434 valuationDate'_ :: ((C2HSImp.Ptr (CInstrument')) -> ((C2HSImp.Ptr (C2HSImp.Ptr C2HSImp.CChar)) -> (IO C2HSImp.CInt)))
435
436 foreign import ccall safe "QuantLib/Instrument.chs.h qlInstrumentAdditionalResults"
437 additionalResults'_ :: ((C2HSImp.Ptr (CInstrument')) -> ((C2HSImp.Ptr C2HSImp.CUInt) -> ((C2HSImp.Ptr (RawResultPtr)) -> ((C2HSImp.Ptr (C2HSImp.Ptr C2HSImp.CChar)) -> (IO ())))))
438
439 foreign import ccall safe "QuantLib/Instrument.chs.h qlCompositeInstrument"
440 qlCompositeInstrument'_ :: (C2HSImp.CUInt -> ((C2HSImp.Ptr (C2HSImp.Ptr (CInstrument'))) -> (C2HSImp.CUInt -> ((C2HSImp.Ptr C2HSImp.CDouble) -> ((C2HSImp.Ptr (C2HSImp.Ptr C2HSImp.CChar)) -> (IO (C2HSImp.Ptr (CInstrument'))))))))
441
442 foreign import ccall safe "QuantLib/Instrument.chs.h qlInstrumentSetPricingEngine"
443 setPricingEngine'_ :: ((C2HSImp.Ptr (CInstrument')) -> ((C2HSImp.Ptr (CPricingEngine)) -> ((C2HSImp.Ptr (C2HSImp.Ptr C2HSImp.CChar)) -> (IO ()))))