/*
* jFin, open source derivatives trade processing
*
* Copyright (C) 2005-2011 Morgan Brown Consultancy Ltd.
*
* This file is part of jFin.
*
* jFin is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option) any later
* version.
*
* jFin is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public License along
* with jFin; if not, write to the Free Software Foundation, Inc., 51 Franklin
* St, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package com.mbc.jfin.daycount.impl.calculator;
import com.mbc.jfin.daycount.impl.DaycountCalculator;
import com.mbc.jfin.holiday.HolidayCalendar;
import com.mbc.jfin.schedule.SchedulePeriod;
import com.mbc.jfin.util.DateUtils;
import org.joda.time.Days;
import org.joda.time.LocalDate;
import org.joda.time.Years;
/**
* Created by IntelliJ IDEA.
* User: dmb
* Date: 05/05/2011
* Time: 09:04
*/
public class AFBActualActualDaycountCalculator implements DaycountCalculator {
public double calculateDaycountFraction(SchedulePeriod period, HolidayCalendar calendar) {
int daysBetween = DateUtils.daysBetween(period.getStart(), period.getEnd());
if(daysBetween==0) return 0;
LocalDate newD2 = period.getEnd();
LocalDate temp = period.getEnd();
double sum = 0.0;
while (temp.isAfter(period.getStart()))
{
temp = newD2;
temp = temp.minus(Years.ONE);
if (
temp.getDayOfMonth() == 28 &&
temp.getMonthOfYear() == 2 &&
DateUtils.isLeapYear(temp))
{
temp = temp.plus(Days.ONE);
}
if (temp.isAfter(period.getStart()) || temp.equals(period.getStart()))
{
sum += 1.0;
newD2 = temp;
}
}
double den = 365.0;
if (DateUtils.isLeapYear(newD2))
{
temp = newD2;
temp = new LocalDate(temp.getYear(), 2, 29);
if (
newD2.isAfter(temp)
&& ( period.getStart().isBefore(temp) || period.getStart().equals(temp) )
)
den += 1.0;
} else if (DateUtils.isLeapYear(period.getStart()))
{
temp = new LocalDate(period.getStart().getYear(), 2, 29);
if (newD2.isAfter(temp)
&& ( period.getStart().isBefore(temp) || period.getStart()
.equals(temp) ))
den += 1.0;
}
return sum + DateUtils.daysBetween(period.getStart(), newD2) / den;
}
}
Ads help maintain this website.