HarmonicCalculation
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © RozaniGhani-RG

//@version=5

// @description TODO: library for HarmonicCalculation
library('HarmonicCalculation')

//  0. PriceDiff
//  1. TimeDiff 
//  2. ReturnIndexOf3Arrays
//  3. AbsoluteRange
//  4. PriceAverage
//  5. TimeAverage
//  6. StringBool
//  7. PricePercent
//  8. BoolCurrency
//  9. RatioText
// 10. RangeText
// 11. PriceCurrency

// —————————————————————————————————————————————————————————————————————————————  0. PriceDiff {
// @function : Price Difference
// @param    : price_1, price_2
// @returns  : PriceDiff
export PriceDiff(float price_1, float price_2) =>
    price_1 - price_2
// }
// —————————————————————————————————————————————————————————————————————————————  1. TimeDiff {
// @function : Time Difference
// @param    : time_1, time_2
// @returns  : TimeDiff
export TimeDiff(int  time_1, int time_2) =>
    time_1 -  time_2
// }
// —————————————————————————————————————————————————————————————————————————————  2. ReturnIndexOf3Arrays {
// @function : Return Index Of 3 Arrays
// @param    : id1, id2, id3, _int
// @returns  : ReturnIndexOf3Arrays
export ReturnIndexOf3Arrays(simple float[] id1, simple float[] id2, simple float[] id3, int _int) =>
    a = array.get(id1, _int)
    b = array.get(id2, _int)
    c = array.get(id3, _int)
    [a, b, c]
// }
// —————————————————————————————————————————————————————————————————————————————  3. AbsoluteRange {
// @function : Price Difference
// @param    : price, y, point
// @returns  : AbsoluteRange
export AbsoluteRange(float price, float y, float point) =>
    math.abs(price - (y * point))
// }
// —————————————————————————————————————————————————————————————————————————————  4. PriceAverage {
// @function : To calculate average of 2 prices
// @param    : price_1, price_2
// @returns  : PriceAverage
export PriceAverage(float price_1, float price_2) =>
    math.avg(price_1, price_2)
// }
// —————————————————————————————————————————————————————————————————————————————  5. TimeAverage {
// @function : To calculate average of 2 times
// @param    : time_1, time_2
// @returns  : TimeAverage
export TimeAverage(   int  time_1,   int  time_2) =>
    int(math.avg( time_1,  time_2))
// }
// —————————————————————————————————————————————————————————————————————————————  6. StringBool {
// @function : To show ratio in 3 decimals format
// @param    : _value, _bool, _text
// @returns  : StringBool
export StringBool(float _value, bool _bool = false, string _text = '') =>
    if _bool
        string str = ' ' + _text
        str.tostring(_value, '0.000') + str
    else
        str.tostring(_value, '0.000')
// }
// —————————————————————————————————————————————————————————————————————————————  7. PricePercent {
// @function : To show Price in percent format
// @param    : _price, PriceRef, str_dir
// @returns  : PricePercent
export PricePercent(float _price, float PriceRef, string str_dir) =>
    string percent = na
    bear_bool =  (  _price - PriceRef) / PriceRef > 0 ? ' ▼' :  (  _price - PriceRef) / PriceRef > 0 ? ' ▲' : ''
    bull_bool = -(PriceRef -   _price) / PriceRef > 0 ? ' ▲' : -(PriceRef -   _price) / PriceRef < 0 ? ' ▼' : ''
    if str_dir == 'BEARISH'
        percent := str.tostring( (  _price - PriceRef) / PriceRef, '##.## %') + bear_bool
    else
        percent := str.tostring(-(PriceRef -   _price) / PriceRef, '##.## %') + bull_bool
    percent
// }
// —————————————————————————————————————————————————————————————————————————————  8. BoolCurrency {
// @function : To show syminfo.currency
// @param    : _bool
// @returns  : BoolCurrency
export BoolCurrency(bool _bool) =>
    currency = switch _bool
        true => syminfo.currency + ' '
        =>      ''
    currency
// }
// —————————————————————————————————————————————————————————————————————————————  9. RatioText {
// @function : To show RatioText in 3 decimals format
// @param    : _value, _text
// @returns  : RatioText
export RatioText(float _value, string _text) =>
    str.tostring(math.abs(_value), '0.000 ') + _text
// }
// ————————————————————————————————————————————————————————————————————————————— 10. RangeText {
// @function : To display RangeText in Harmonic Range Format
// @param    : _id1, _id2, _int, _text
// @returns  : RangeText
export RangeText(simple float[] _id1, simple float[] _id2, int _int, string _text) =>
    RatioText(array.get(_id1, _int), '; ') + RatioText(array.get(_id2, _int), _text)
// }
// ————————————————————————————————————————————————————————————————————————————— 11. PriceCurrency {
// @function : To show Currency in Price Format
// @param    : _bool, _value
// @returns  : PriceCurrency
export PriceCurrency(bool _bool, float _value) =>
    BoolCurrency(_bool) + str.tostring(math.abs(_value), '0.000')
// }