[dharmatech] Area Under Yield Curve : US
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © dharmatech

//@version=5
// indicator("[dharmatech] Area Under Yield Curve : US", "Area Under Yield Curve : US", overlay = true)

indicator("[dharmatech] Area Under Yield Curve : US", "Area Under Yield Curve : US")

except_4M = 'except 4M'

except_2M_4M_7Y_20Y = 'except 2M 4M 7Y 20Y'
except_1M_2M_4M_7Y_20Y = 'except 1M 2M 4M 7Y 20Y'
except_6M = 'except 6M'

items = input.string(defval = "all", options = ['all', 'except 4M', 'except 4M 20Y', 'except 2M 4M 20Y', except_2M_4M_7Y_20Y, except_1M_2M_4M_7Y_20Y, except_6M])

US01MY = request.security('US01MY', '', close)
US02MY = request.security('US02MY', '', close)
US03MY = request.security('US03MY', '', close)
US04MY = request.security('US04MY', '', close)
US06MY = request.security('US06MY', '', close)
US01Y  = request.security('US01Y',  '', close)
US02Y  = request.security('US02Y',  '', close)
US03Y  = request.security('US03Y',  '', close)
US05Y  = request.security('US05Y',  '', close)
US07Y  = request.security('US07Y',  '', close)
US10Y  = request.security('US10Y',  '', close)
US20Y  = request.security('US20Y',  '', close)
US30Y  = request.security('US30Y',  '', close)

// area_section(float width, float a, float b) =>
//     math.min(a, b) + width / 2 * math.abs(a - b)


// area of rectangle             +   area of triangle
// width * height of rectangle   +   1/2 * width * height of triangle

area_section(float width, float a, float b) =>
    width * math.min(a, b) + width / 2 * math.abs(a - b)

// area = 
//      area_section(2,   DGS1MO, DGS3MO) + 
//      area_section(3,   DGS3MO, DGS6MO) + 
//      area_section(6,   DGS6MO, DGS1)   +
//      area_section(12,  DGS1,   DGS2)   +
//      area_section(12,  DGS2,   DGS3)   +
//      area_section(24,  DGS3,   DGS5)   +
//      area_section(24,  DGS5,   DGS7)   +
//      area_section(36,  DGS7,   DGS10)  +
//      area_section(120, DGS10,  DGS20)  +
//      area_section(120, DGS20,  DGS30)  +
//      0

// complete

area_all = 
     area_section(  1, US01MY , US02MY ) +
     area_section(  1, US02MY , US03MY ) +
     area_section(  1, US03MY , US04MY ) +
     area_section(  2, US04MY , US06MY ) +
     area_section(  6, US06MY , US01Y  ) +
     area_section( 12, US01Y  , US02Y  ) +
     area_section( 12, US02Y  , US03Y  ) +
     area_section( 24, US03Y  , US05Y  ) +
     area_section( 24, US05Y  , US07Y  ) +
     area_section( 36, US07Y  , US10Y  ) +
     area_section(120, US10Y  , US20Y  ) +
     area_section(120, US20Y  , US30Y  ) +
     0

// except 4M

area_except_4M = 
     area_section(  1, US01MY , US02MY ) +
     area_section(  1, US02MY , US03MY ) +
     area_section(  3, US03MY , US06MY ) +     
     area_section(  6, US06MY , US01Y  ) +
     area_section( 12, US01Y  , US02Y  ) +
     area_section( 12, US02Y  , US03Y  ) +
     area_section( 24, US03Y  , US05Y  ) +
     area_section( 24, US05Y  , US07Y  ) +
     area_section( 36, US07Y  , US10Y  ) +
     area_section(120, US10Y  , US20Y  ) +
     area_section(120, US20Y  , US30Y  ) +
     0


// except 4M 20Y

area_except_4M_20Y = 
     area_section(  1, US01MY , US02MY ) +
     area_section(  1, US02MY , US03MY ) +
     area_section(  3, US03MY , US06MY ) +     
     area_section(  6, US06MY , US01Y  ) +
     area_section( 12, US01Y  , US02Y  ) +
     area_section( 12, US02Y  , US03Y  ) +
     area_section( 24, US03Y  , US05Y  ) +
     area_section( 24, US05Y  , US07Y  ) +
     area_section( 36, US07Y  , US10Y  ) +
     area_section(240, US10Y  , US30Y  ) +
     0

// except 2M 4M 20Y

area_except_2M_4M_20Y = 
     area_section(  2, US01MY , US03MY ) +     
     area_section(  3, US03MY , US06MY ) +     
     area_section(  6, US06MY , US01Y  ) +
     area_section( 12, US01Y  , US02Y  ) +
     area_section( 12, US02Y  , US03Y  ) +
     area_section( 24, US03Y  , US05Y  ) +
     area_section( 24, US05Y  , US07Y  ) +
     area_section( 36, US07Y  , US10Y  ) +
     area_section(240, US10Y  , US30Y  ) +
     0

// except 2M 4M 7Y 20Y

area_except_2M_4M_7Y_20Y = 
     area_section(  2, US01MY , US03MY ) +     
     area_section(  3, US03MY , US06MY ) +     
     area_section(  6, US06MY , US01Y  ) +
     area_section( 12, US01Y  , US02Y  ) +
     area_section( 12, US02Y  , US03Y  ) +
     area_section( 24, US03Y  , US05Y  ) +
     area_section( 24, US05Y  , US10Y  ) +
     area_section(240, US10Y  , US30Y  ) +
     0

// except 1M 2M 4M 7Y 20Y

area_except_1M_2M_4M_7Y_20Y = 
     area_section(  3, US03MY , US06MY ) +     
     area_section(  6, US06MY , US01Y  ) +
     area_section( 12, US01Y  , US02Y  ) +
     area_section( 12, US02Y  , US03Y  ) +
     area_section( 24, US03Y  , US05Y  ) +
     area_section( 24, US05Y  , US10Y  ) +
     area_section(240, US10Y  , US30Y  ) +
     0

area_except_6M = 
     area_section(  9, US03MY , US01Y  ) +     
     area_section( 12, US01Y  , US02Y  ) +
     area_section( 12, US02Y  , US03Y  ) +
     area_section( 24, US03Y  , US05Y  ) +
     area_section( 24, US05Y  , US10Y  ) +
     area_section(240, US10Y  , US30Y  ) +
     0

// except 4M 20Y

// area = 
//      area_section(  1, US01MY , US02MY ) +
//      area_section(  1, US02MY , US03MY ) +
//      area_section(  3, US03MY , US06MY ) +     
//      area_section(  6, US06MY , US01Y  ) +
//      area_section( 12, US01Y  , US02Y  ) +
//      area_section( 12, US02Y  , US03Y  ) +
//      area_section( 24, US03Y  , US05Y  ) +
//      area_section( 24, US05Y  , US07Y  ) +
//      area_section( 36, US07Y  , US10Y  ) +
//      area_section(240, US10Y  , US30Y  ) +
//      0





// except 4 and 6

// area = 
//      area_section(  1, US01MY , US02MY ) +
//      area_section(  1, US02MY , US03MY ) +
//      area_section(  9, US03MY , US01Y  ) +     
//      area_section( 12, US01Y  , US02Y  ) +
//      area_section( 12, US02Y  , US03Y  ) +
//      area_section( 24, US03Y  , US05Y  ) +
//      area_section( 24, US05Y  , US07Y  ) +
//      area_section( 36, US07Y  , US10Y  ) +
//      area_section(120, US10Y  , US20Y  ) +
//      area_section(120, US20Y  , US30Y  ) +
//      0

area = if items == 'all'
    area_all
else if items == 'except 4M'
    area_except_4M
else if items == 'except 4M 20Y'
    area_except_4M_20Y
else if items == 'except 2M 4M 20Y'
    area_except_2M_4M_20Y
else if items == except_2M_4M_7Y_20Y
    area_except_2M_4M_7Y_20Y
else if items == except_1M_2M_4M_7Y_20Y
    area_except_1M_2M_4M_7Y_20Y
else if items == except_6M
    area_except_6M

plot(area, color = color.yellow)