packages feed

netrium-0.6.0: examples/DirtySparkSpreadOption.hs

module Main where

import Prelude hiding (and, or, min, max, abs, negate, not, read, until)

import DemoContractAST
import Contract (Obs, primVar)
import Common (atTimeOfDay, date, datetime, exchangeFee, (<>))
-- import Options (OptionDirection(CallOption))
import Calendar

import qualified Text.XML.HaXml.XmlContent as XML
import qualified Text.XML.HaXml.Pretty     as XML.PP
import qualified Text.PrettyPrint          as PP

-------------------------------------------------------------------------------
-- Contract template function itself
--

-- Daily exercise at 15:00 on the day preceding the supply day
-- (this is supposed to be on every fourth EEX business day but for now it does every fourth calendar day - to be updated when we have a proper calendar)

contract
  = namedContract "Commodity Spread Option" $ commoditySpreadOption legs
             (calendarDaysEarlier calendar 4 <> atTimeOfDay 07 00)
             (calendarDaysEarlier calendar 4 <> atTimeOfDay 15 00)
             CallOption
             strike
             (CashFlowType "initialMargin")
             premium
  where calendar = getBusinessDayCalendar "EEX Power"
        strike = (strikePrice, Currency "GBP")
        strikePrice = powerPrice * powerVol
        premium = (2, Currency "GBP")

coalVol :: Double
coalVol = 5000
coalPrice :: Double
coalPrice = 12
carbonVol :: Double
carbonVol = 100
carbonPrice :: Double
carbonPrice = 70
powerVol :: Double
powerVol = 50
powerPrice :: Double
powerPrice = 16

legs = [coalLeg, carbonLeg, electricityLeg]

-- API2 coal: monthly delivery (assumption is 1st of the month)
coalLeg =
    ( Market (Commodity "Coal") (Unit "MWh") (Location "ARA"), coalVol
    , coalPrice, (Currency "USD"), (CashFlowType "initialMargin")
    , [ schedule ]
    , exchangeFee  50
    )
 where
  schedule = deliverySchedule (date 2011 1 1) (date 2011 12 31)
             calendar deliverAtMidnight
  calendar = newCalendar "carbonCalendar" [(date 2011 m 1, BusinessDay) | m <- [1..12]]

-- Carbon: yearly certificates split into monthly deliveries at 12:00
carbonLeg =
    ( Market (Commodity "Carbon") (Unit "t") (Location "EU"), carbonVol
    , carbonPrice, (Currency "EUR"), (CashFlowType "initialMargin")
    , [ schedule ]
    , exchangeFee  75)
 where
  schedule = deliverySchedule (date 2011 1 1) (date 2011 12 31) 
             calendar deliverAtMidnight
  calendar = newCalendar "carbonCalendar" [(date 2011 m 1, BusinessDay) | m <- [1..12]]

-- CE Power: delivery every 15 minutes
electricityLeg =
    ( Market (Commodity "Electricity") (Unit "MWh") (Location "Amprion HVG"), powerVol
    , powerPrice, (Currency "GBP"), (CashFlowType "initialMargin")
    , [ schedule ]
    , exchangeFee 100 )
 where
  calendar = getBusinessDayCalendar "EEX Power"
  schedule = deliverySchedule (date 2011 1 1) (date 2011 12 31) 
             calendar shape
  shape = complexDeliveryShape [deliverAtTimeOfDay h m | h <- [0..23], m <- [0,15,30,45]]


-------------------------------------------------------------------------------
-- Template program main
--

main = do
  putStr (renderXml contract)
 where
  -- renderXml = show
  renderXml = PP.renderStyle PP.style { PP.mode = PP.OneLineMode }
            . XML.PP.document
            . toXml False