calcLevelNumTrade.mjs

import isnum from 'wsemi/src/isnum.mjs'
import cint from 'wsemi/src/cint.mjs'


/**
 * 計算交易次數所屬級距代碼levelNumTrade
 *
 * 交易次數過少之策略統計意義不足,過多則屬高頻,故以級距分群,使不同交易次數規模之策略各自保留最佳者
 * 級距對應為: <=0為0,1-5為1,6-9為2,10-24為11,25-49為12,50-74為13,75-99為14,100-249為101,250-499為102,500-749為103,750-999為104,1000-1999為1001,2000-2999為1002,3000-3999為1003,4000-4999為1004,>=5000為100
 * numTrade非數值時throw
 *
 * Unit Test: {@link https://github.com/yuda-lyu/w-trade-solve/blob/master/test/unit-calcLevelNumTrade.test.mjs Github}
 * @function
 * @param {Number} numTrade 輸入交易次數數值
 * @returns {Number} 回傳級距代碼數值
 * @example
 *
 * console.log(calcLevelNumTrade(0))
 * // => 0
 *
 * console.log(calcLevelNumTrade(3))
 * // => 1
 *
 * console.log(calcLevelNumTrade(30))
 * // => 12
 *
 * console.log(calcLevelNumTrade(8000))
 * // => 100
 *
 */
let calcLevelNumTrade = (numTrade) => {

    if (!isnum(numTrade)) {
        throw new Error(`numTrade[${numTrade}] is not a number`)
    }
    numTrade = cint(numTrade)

    let levelNumTrade = 0
    if (numTrade <= 0) {
        levelNumTrade = 0
    }
    else if (numTrade <= 5) {
        levelNumTrade = 1
    }
    else if (numTrade <= 10 - 1) {
        levelNumTrade = 2
    }
    else if (numTrade <= 25 - 1) {
        levelNumTrade = 11
    }
    else if (numTrade <= 50 - 1) {
        levelNumTrade = 12
    }
    else if (numTrade <= 75 - 1) {
        levelNumTrade = 13
    }
    else if (numTrade <= 100 - 1) {
        levelNumTrade = 14
    }
    else if (numTrade <= 250 - 1) {
        levelNumTrade = 101
    }
    else if (numTrade <= 500 - 1) {
        levelNumTrade = 102
    }
    else if (numTrade <= 750 - 1) {
        levelNumTrade = 103
    }
    else if (numTrade <= 1000 - 1) {
        levelNumTrade = 104
    }
    else if (numTrade <= 2000 - 1) {
        levelNumTrade = 1001
    }
    else if (numTrade <= 3000 - 1) {
        levelNumTrade = 1002
    }
    else if (numTrade <= 4000 - 1) {
        levelNumTrade = 1003
    }
    else if (numTrade <= 5000 - 1) {
        levelNumTrade = 1004
    }
    else {
        levelNumTrade = 100
    }

    return levelNumTrade
}


export default calcLevelNumTrade