USBOND_BackCalc
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Aki_Pine1024
//@version=5

// Determining bond prices from yields on US Treasuries
// 米国債の利回りから債券価格を求める
indicator("USBOND_BackCalc", precision = 2)

//{ Symbol information シンボルの情報
// Get symbol
// シンボルを取得
string symbolName = syminfo.tickerid
// Determine if a symbol is a US Treasury bond
// シンボルが米国債かどうかを判定
bool isUSBond = str.startswith(symbolName, "TVC:US")
// Determine if the chart is a yield chart
// 利回りのチャートかどうかを判定
bool isYield = str.endswith(syminfo.tickerid, "Y")
// Determining whether the receivables are less than one year old
// 一年未満（月単位）の債権かどうかを判定
bool isMonthlyBond = str.endswith(syminfo.tickerid, "MY")
//}

//{ Determining if the symbol is a US Treasury and Yield chart シンボルから米国債かつ利回りのチャートかどうか判定
if(not (isUSBond and isYield))
    runtime.error("Cannot be used because it is not a chart of US Treasuries and yields. 米国債利回り以外のチャートでは使用できません。")
//}

//{ Get the term of a US Bond from a symbol and convert to years シンボルから米国債の期間（年数・月数）を取得し、年単位に変換する
int cutLen = str.pos(symbolName, "S")
float bondYearOrMonth = str.tonumber(str.substring(symbolName, cutLen + 1, cutLen + 3))
// Convert to year if unit is month 単位が月であれば年に直す
if(isMonthlyBond)
    bondYearOrMonth /= 12
//}

// Determining bond prices from yields on US Treasuries
// 米国債の利回りから債券価格を求める
float price = 100 * math.pow(1 + close/100, -(bondYearOrMonth))

plot(price)