content: {-# LANGUAGE BangPatterns #-}
  module QuantLib.Methods.Pricer
        ( MaxMinClosePricer (..)
        , LastPointPricer (..)
        , LogLastPointPricer (..)
        ) where
  
  import           QuantLib.Methods.MonteCarlo (PathPricer (..))
  import           QuantLib.Stochastic.Process (Dot (..))
  
  data MaxMinClosePricer = MMCP {
          mmcpHigh  :: Double,
          mmcpLow   :: Double,
          mmcpClose :: Double
          } deriving (Show)
  
  instance PathPricer MaxMinClosePricer where
          ppPrice _ path = MMCP high low close
                  where   !close   = last xs
                          !high    = maximum xs
                          !low     = minimum xs
                          xs      = map getX path
  
  -- | This pricer gets the last point of path
  newtype LastPointPricer = LastPointPricer Double
  
  instance PathPricer LastPointPricer where
          ppPrice _ = LastPointPricer <$> getX . last
  
  -- | This pricer estimates the log of difference between start and end of process
  newtype LogLastPointPricer = LogLastPointPricer Double
  
  instance PathPricer LogLastPointPricer where
          ppPrice _ path = LogLastPointPricer (log (lastX / firstX))
            where
              lastX = getX $ last path
              firstX = getX $ head path
  