genSid.mjs

import join from 'lodash-es/join.js'
import map from 'lodash-es/map.js'
import cont from './cont.mjs'


/**
 * 產生策略識別碼sid
 *
 * 各cond先組為`${key}${sym}${th}`,再以cont.dlmSeps串接mode與各cond為識別字串,最後進行與genTid相同之縮寫替換
 * 縮寫替換依序為: 剔除`${coin}_`、剔除`${interval}_`、'price_'轉'p_'、'index_'轉'i_'、'Ohlc_'轉'o_'、'Close_'轉'c_'、'Volumn_'轉'v_'
 * 因替換係以`${coin}_`與`${interval}_`為樣式,故coin與interval須給予有效字串,否則將剔除全部底線
 * sid已含各cond之門檻,故同組keys之不同門檻組合對應不同sid,可與僅由keys決定之tid區別
 *
 * Unit Test: {@link https://github.com/yuda-lyu/w-trade-solve/blob/master/test/unit-genSid.test.mjs Github}
 * @function
 * @param {String} coin 輸入幣種名稱字串,例如'btc'
 * @param {String} interval 輸入K線週期字串,例如'4hr'
 * @param {String} mode 輸入交易方向字串,可選'long'或'short'
 * @param {Array} conds 輸入條件物件陣列,各元素為{key,sym,th},key為指標key字串,sym為'>'或'<',th為門檻數值
 * @returns {String} 回傳策略識別碼sid字串
 * @example
 *
 * let conds = [
 *     { key: 'btc_price_4hr_ma_1day', sym: '>', th: 0.05 },
 *     { key: 'btc_index_rsi_4hr', sym: '<', th: -0.2 },
 * ]
 *
 * let sid = genSid('btc', '4hr', 'long', conds)
 * console.log(sid)
 * // => 'long ║ p_ma_1day>0.05 ║ i_rsi_4hr<-0.2'
 *
 */
let genSid = (coin, interval, mode, conds) => {
    let ss = map(conds, (cond) => {
        // key,
        // sym,
        // th,
        return `${cond.key}${cond.sym}${cond.th}`
    })
    let sid = join([mode, ...ss], cont.dlmSeps)
    sid = sid.replaceAll(`${coin}_`, '')
    sid = sid.replaceAll(`${interval}_`, '')
    sid = sid.replaceAll(`price_`, 'p_')
    sid = sid.replaceAll(`index_`, 'i_')
    sid = sid.replaceAll(`Ohlc_`, 'o_')
    sid = sid.replaceAll(`Close_`, 'c_')
    sid = sid.replaceAll(`Volumn_`, 'v_')
    // console.log('sid', sid)
    return sid
}


export default genSid