Global

Members

(constant) cont :Object

Description:
  • 共用常數

    dlmSeps為tid與sid內各段(mode與各key或各cond)之分隔字串 dlmPkgs為舊版策略檔名內各段(tid、levelNumTrade、rEquivalentCumuProfitOrLossFinalNormYear)之分隔字串,自genStrategyFileName改採雜湊檔名後僅供readStrategies解析舊格式檔名使用

Source:

共用常數

dlmSeps為tid與sid內各段(mode與各key或各cond)之分隔字串 dlmPkgs為舊版策略檔名內各段(tid、levelNumTrade、rEquivalentCumuProfitOrLossFinalNormYear)之分隔字串,自genStrategyFileName改採雜湊檔名後僅供readStrategies解析舊格式檔名使用

Type:
  • Object
Example
console.log(cont)
// => { dlmSeps: ' ║ ', dlmPkgs: ' ⊙ ' }

Methods

calcFitness(settings, summary) → {Number}

Description:
  • 計算策略適應值fitness

    供最佳化求解使用之目標函數值,數值越小代表策略越佳 由勝率與最終等效年化盈虧兩者組成: 勝率rWin限縮至[0,1],等效年化盈虧rEquivalentCumuProfitOrLossFinalNormYear限縮至[0,0.5]再正規化至[0,1],兩者皆轉為越小越好後,以權重2與1加權求和,故無懲罰時fitness落於[0,3] 交易次數為0時加上懲罰值1000000,最終累計盈虧金額(summary.uEquityFinal-settings.uIni)小於等於0時再加上懲罰值1000000,故兩者皆觸發時可達2000000以上

    Unit Test: Github

Source:
Example
let settings = { uIni: 1000 }

//勝率60%, 等效年化盈虧25%(正規化後0.5), fitness = 2*(1-0.6) + 1*(1-0.5) = 1.3
let summary = {
    numTrade: 30,
    uEquityFinal: 1200,
    rWin: '60%',
    rEquivalentCumuProfitOrLossFinalNormYear: '25%',
}
console.log(calcFitness(settings, summary))
// => 1.3

//無交易且無獲利時, 兩懲罰值皆觸發
let summaryNone = {
    numTrade: 0,
    uEquityFinal: 1000,
    rWin: '',
    rEquivalentCumuProfitOrLossFinalNormYear: '',
}
console.log(calcFitness(settings, summaryNone))
// => 2000003
Parameters:
Name Type Description
settings Object

輸入策略設定物件,需含uIni(初始資金)欄位

summary Object

輸入回測統計摘要物件,需含numTrade(交易次數)、uEquityFinal(最終權益金額)、rWin(勝率百分比字串)、rEquivalentCumuProfitOrLossFinalNormYear(最終等效年化盈虧百分比字串)欄位

Returns:

回傳適應值數值,越小代表策略越佳

Type
Number

calcLevelNumTrade(numTrade) → {Number}

Description:
  • 計算交易次數所屬級距代碼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: Github

Source:
Example
console.log(calcLevelNumTrade(0))
// => 0

console.log(calcLevelNumTrade(3))
// => 1

console.log(calcLevelNumTrade(30))
// => 12

console.log(calcLevelNumTrade(8000))
// => 100
Parameters:
Name Type Description
numTrade Number

輸入交易次數數值

Returns:

回傳級距代碼數值

Type
Number

(async) estimComps(ott, name, symbol, interval, fdOhlc, fdParam, timeStart, timeEnd, mode, comps, fdData, optopt) → {Promise}

Description:
  • 依指標組成comps隨機挑選keys,再率定各key之門檻與止盈止損,求解最佳策略

    comps為以逗號分隔之3個數字字串,依序代表由一般類(keysNorm)、指數類(keysIndex)與成交量類(keysVolumn)各隨機挑選之key個數,例如'2,1,0'代表挑2個一般類、1個指數類與0個成交量類 各類皆以randomIntsNdpRange不重複隨機取樣,故同一comps每次執行所挑之keys不同 comps非3段時throw,其餘檢核與分類邏輯同estimPicks

    Unit Test: Github

Source:
Example
import ott from './src/ott.mjs'

//comps='2,1,0', 挑2種一般類、1種指數類與0種成交量類
await estimComps(ott, 'btc', 'BTCUSDT', '4hr', './data/ohlc', './data/param', '2022-07-01T00:00:00', '2025-04-08T00:00:00', 'long', '2,1,0', './data/strategy', {})
Parameters:
Name Type Attributes Default Description
ott function

輸入時區時間函數,傳入時間字串回傳dayjs時間物件,可用src/ott.mjs

name String

輸入幣種名稱字串,例如'btc'

symbol String

輸入交易對名稱字串,例如'BTCUSDT'

interval String

輸入K線週期字串,例如'4hr'

fdOhlc String

輸入儲存K線(ohlc)序列資料夾字串

fdParam String

輸入儲存指標參數序列資料夾字串

timeStart String

輸入回測起始時間字串,格式'YYYY-MM-DDTHH:mm:ss'

timeEnd String

輸入回測結束時間字串,格式'YYYY-MM-DDTHH:mm:ss'

mode String

輸入交易方向字串,可選'long'或'short'

comps String

輸入指標組成字串,為逗號分隔之3個數字,例如'2,1,0'

fdData String

輸入儲存策略資料夾字串,不存在時自動建立

opt Object <optional>
{}

輸入設定物件,預設{},全部欄位皆傳遞至estimPicks

Returns:

回傳Promise,resolve為undefined

Type
Promise

(async) estimFinder(ott, name, symbol, interval, fdOhlc, fdParam, fdData, optopt) → {Promise}

Description:
  • 以隨機之交易方向與指標組成求解最佳策略

    供批次探索用之進入點,未指定時mode由'long'與'short'隨機取一,comps由18種預設組成隨機取一,故重複呼叫即可隨機探索各種策略 未指定時timeStart預設為'2022-07-01T00:00:00',timeEnd則依mode給予不同值: 做多為'2025-04-08T00:00:00'(須涵蓋暴跌數據),做空為'2025-10-06T00:00:00'(須涵蓋暴漲數據),藉此提高率定難度 name、symbol、interval、fdOhlc、fdParam與fdData無效時throw

    Unit Test: Github

Source:
Example
import ott from './src/ott.mjs'

//mode與comps皆隨機, 適合以迴圈重複呼叫批次探索
await estimFinder(ott, 'btc', 'BTCUSDT', '4hr', './data/ohlc', './data/param', './data/strategy', {})
Parameters:
Name Type Attributes Default Description
ott function

輸入時區時間函數,傳入時間字串回傳dayjs時間物件,可用src/ott.mjs

name String

輸入幣種名稱字串,例如'btc'

symbol String

輸入交易對名稱字串,例如'BTCUSDT'

interval String

輸入K線週期字串,例如'4hr'

fdOhlc String

輸入儲存K線(ohlc)序列資料夾字串

fdParam String

輸入儲存指標參數序列資料夾字串

fdData String

輸入儲存策略資料夾字串,不存在時自動建立

opt Object <optional>
{}

輸入設定物件,預設{},全部欄位皆傳遞至estimComps

Properties
Name Type Attributes Default Description
mode String <optional>
''

輸入交易方向字串,可選'long'或'short',未給予時隨機取一,預設''

timeStart String <optional>
'2022-07-01T00:00:00'

輸入回測起始時間字串,預設'2022-07-01T00:00:00'

timeEnd String <optional>
''

輸入回測結束時間字串,未給予時做多為'2025-04-08T00:00:00'、做空為'2025-10-06T00:00:00',預設''

comps String <optional>
''

輸入指標組成字串,例如'2,1,0',未給予時由18種預設組成隨機取一,預設''

Returns:

回傳Promise,resolve為undefined

Type
Promise

(async) estimKeys(ott, name, symbol, interval, fdOhlc, fdParam, timeStart, timeEnd, mode, keys, fdData, optopt) → {Promise}

Description:
  • 針對指定keys率定各key之門檻與止盈止損,求解最佳策略

    設計變數為[止損比例, 止盈比例, ...各key之門檻],止損與止盈由opt.thsSl與opt.thsTp給予之百分比清單離散取值 各key門檻取值範圍為[-thLim,thLim]切為thLim20段,並各自平移+vdir與-vdir(vdir=thLim5)為兩組,使解值恆大於0代表'>'條件、恆小於0代表'<'條件,還原時再扣除平移值,故單一設計變數即同時涵蓋大於與小於兩種條件 以w-optimization之最佳化函數求解,由opt.methodOml指定演算法,各次計算皆以w-trade-backtest之runStrategy回測並經calcFitness計算適應值;亦可由opt.funRunStrategyCustom注入自訂評估核心加速求解(如以w-trade-backtest之buildStrategyFastSession預算first-touch表與因子對位序列),注入僅回傳精簡欄位之核心時可配合opt.useRunStrategyBeforeSave於存檔前重跑完整回測,使落地summary維持完整欄位口徑;存檔前重跑後檔內numTrade、levelNumTrade、tkid、fitness與檔名皆由重跑之summary重新衍生,確保檔名與檔案內容同源一致;重算檔名與原檔名不同(評估核心與重跑結果跨級距)時,對新檔名重做存在檢查、身分驗證與優劣比較,新檔名已有更佳者則放棄本次寫入 各次計算結果若同時滿足交易次數、勝率與最終等效年化盈虧三門檻,則以genStrategyFileName產生檔名存入fdData;檔名為tkid(tid+交易次數級距)之純函數,故直接組出檔名查詢既有策略(O(1),不列舉全庫),同tkid已有策略時僅於最終等效年化盈虧更佳時原地覆寫,故同tkid恆僅一檔;覆寫前驗證舊檔內tkid、name與interval與本次一致,不一致代表雜湊碰撞,直接throw以避免無聲覆寫 策略檔內容除策略本體(tid、sid、name、symbol、interval、keyOhlc、mode、conds、settings)與summary、fitness外,另落地tkid、numTrade、levelNumTrade、keys與solve區塊(timeStart、timeEnd、methodOml、thNumTrade、thRWin、thREquivalentCumuProfitOrLossFinalNormYear、thsTp、thsSl、timeSolved),使識別與求解條件欄位自足,不依賴檔名 opt除下列各欄位外,其餘欄位皆原樣傳遞至所選之最佳化函數,兩者欄位名稱無重疊,故可一併給予求解設定 各演算法共通之設定為NContiguous(最佳解連續未更新次數上限,預設100)、NRepeat、NCore、ModeOutLimit、UseRepeat、UseImmigration、LocalSearchMethod與funGetBetter、funGenerationBefore、funGenerationAfter三接口;族群數與迴圈數之欄位名稱各演算法不同,RGA與DE為Np與Ng、PSO為Np與Nl、HS為Ns與Ni、ACO為Na與Nl;另各演算法有其專屬超參數,如PSO之psoC1Start、RGA之rgaCrossover、DE之deF、HS之hsHMCR與ACO之acoAlphaStart等 預設之求解量甚大(單一key約需1萬7千次回測),僅需快速試算時可調小族群數與NContiguous name、symbol、interval、fdOhlc、fdParam、timeStart、timeEnd、keys、fdData無效或mode非'long'或'short'時throw

    Unit Test: Github

Source:
Example
import ott from './src/ott.mjs'

//keys, 待率定門檻之指標key, 各key於fdParam內須有對應之`${key}.json`
let keys = ['btc_price_4hr_ma_1day']

let m = await estimKeys(ott, 'btc', 'BTCUSDT', '4hr', './data/ohlc', './data/param', '2022-07-01T00:00:00', '2025-04-08T00:00:00', 'long', keys, './data/strategy', {
    thsTp: [1, 2, 3],
    thsSl: [1, 2, 3],
    useShowLog: true,
})
console.log(m.bestSolution.fitness)
// => 1.0325

//可指定演算法並一併給予其求解設定, 縮小族群數與NContiguous即可快速試算
let mQuick = await estimKeys(ott, 'btc', 'BTCUSDT', '4hr', './data/ohlc', './data/param', '2022-07-01T00:00:00', '2025-04-08T00:00:00', 'long', keys, './data/strategy', {
    thsTp: [1, 2, 3],
    thsSl: [1, 2, 3],
    methodOml: 'PSO',
    Np: 8, //PSO之粒子數, 預設40
    NContiguous: 5, //最佳解連續未更新次數上限, 預設100
})
console.log(mQuick.stopMode)
// => 'stop by iContinue[5] >= NContiguous[5]'
console.log(mQuick.stopExecutions) //核心分析次數, 較預設設定大幅減少, 因求解為隨機故每次不同
// => 357
Parameters:
Name Type Attributes Default Description
ott function

輸入時區時間函數,傳入時間字串回傳dayjs時間物件,未傳入時回傳當下時間(供solve.timeSolved記錄),可用src/ott.mjs

name String

輸入幣種名稱字串,例如'btc',用於組出K線序列key(${name}_price_${interval})與縮寫tid

symbol String

輸入交易對名稱字串,例如'BTCUSDT',僅儲存至策略內供辨識

interval String

輸入K線週期字串,例如'4hr'

fdOhlc String

輸入儲存K線(ohlc)序列資料夾字串

fdParam String

輸入儲存指標參數序列資料夾字串

timeStart String

輸入回測起始時間字串,格式'YYYY-MM-DDTHH:mm:ss'

timeEnd String

輸入回測結束時間字串,格式'YYYY-MM-DDTHH:mm:ss'

mode String

輸入交易方向字串,可選'long'或'short'

keys Array

輸入待率定門檻之指標key字串陣列

fdData String

輸入儲存策略資料夾字串,不存在時自動建立

opt Object <optional>
{}

輸入設定物件,預設{},除下列欄位外皆傳遞至所選之最佳化函數,故可另給NContiguous等求解設定

Properties
Name Type Attributes Default Description
methodOml String <optional>
'PSO'

輸入最佳化演算法字串,可選'RGA'(實數型基因演算法)、'DE'(差分進化法)、'HS'(和聲搜尋法)、'PSO'(粒子群最佳化)與'ACO'(蟻群最佳化),給予其他值時亦採'PSO',預設'PSO'

thsTp Array <optional>
[1,2,3,4,5,6,7,8,9,10]

輸入止盈門檻百分比數值陣列,預設[1,2,3,4,5,6,7,8,9,10]

thsSl Array <optional>
[1,2,3,4,5,6,7,8,9,10]

輸入止損門檻百分比數值陣列,預設[1,2,3,4,5,6,7,8,9,10]

thNumTrade Number <optional>
1

輸入策略須儲存之最少交易次數數值,預設1

thRWin Number <optional>
0.5

輸入策略須儲存之最低勝率比例數值,預設0.5

thREquivalentCumuProfitOrLossFinalNormYear Number <optional>
0.15

輸入策略須儲存之最低最終等效年化盈虧比例數值,預設0.15

funRunStrategyCustom function <optional>
null

輸入自訂回測評估async函數,傳入{ott,strategy,funGetSeries}物件,須回傳{summary}且summary至少含numTrade、rWin、uEquityFinal與rEquivalentCumuProfitOrLossFinalNormYear四欄,各欄語義須與runStrategy等值,回傳之準確性由注入端負責;未給時採runStrategy,預設null

useRunStrategyBeforeSave Boolean <optional>
false

輸入存檔前是否重跑一次回測並以其summary重新衍生檔案內容與檔名布林值,注入僅回傳精簡欄位之評估核心時應設true以維持策略檔欄位口徑,求解搜索仍全程使用自訂函數不受影響,預設false

funRunStrategyCustomBeforeSave function <optional>
null

輸入存檔前重跑用之自訂回測async函數,介面同opt.funRunStrategyCustom,僅於opt.useRunStrategyBeforeSave為true時生效,未給時採runStrategy,預設null

useShowLog Boolean <optional>
false

輸入是否顯示求解過程log布林值,預設false

Returns:

回傳Promise,resolve為求解結果物件,含bestSolution(最佳解,內有ps設計變數陣列與fitness適應值)、stopMode(觸發停止之機制字串)、stopIteration(停止時之迴圈數)與stopExecutions(停止時之核心分析次數)等欄位

Type
Promise

(async) estimPicks(ott, name, symbol, interval, fdOhlc, fdParam, timeStart, timeEnd, mode, funPickKeys, fdData, optopt) → {Promise}

Description:
  • 由fdParam內全部指標key分類後挑選keys,再率定各key之門檻與止盈止損,求解最佳策略

    先由fdParam列舉全部指標key,並依名稱分為3類: 開頭為'index_'者為keysIndex(指數類)、含'vbs'者為keysVolumn(成交量類)、其餘為keysNorm(一般類) 分類後各類可經opt內對應之過濾函數再行篩選,接著呼叫funPickKeys由3類挑出待率定之keys,最後交由estimKeys求解 name、symbol、interval、fdOhlc、fdParam、timeStart、timeEnd、fdData無效或mode非'long'或'short'或funPickKeys非函數時throw

    Unit Test: Github

Source:
Example
import ott from './src/ott.mjs'

//funPickKeys, 由一般類挑第1個key為待率定key
let funPickKeys = ({ keysNorm, keysIndex, keysVolumn }) => {
    return [keysNorm[0]]
}

await estimPicks(ott, 'btc', 'BTCUSDT', '4hr', './data/ohlc', './data/param', '2022-07-01T00:00:00', '2025-04-08T00:00:00', 'long', funPickKeys, './data/strategy', {})
Parameters:
Name Type Attributes Default Description
ott function

輸入時區時間函數,傳入時間字串回傳dayjs時間物件,可用src/ott.mjs

name String

輸入幣種名稱字串,例如'btc'

symbol String

輸入交易對名稱字串,例如'BTCUSDT'

interval String

輸入K線週期字串,例如'4hr'

fdOhlc String

輸入儲存K線(ohlc)序列資料夾字串

fdParam String

輸入儲存指標參數序列資料夾字串

timeStart String

輸入回測起始時間字串,格式'YYYY-MM-DDTHH:mm:ss'

timeEnd String

輸入回測結束時間字串,格式'YYYY-MM-DDTHH:mm:ss'

mode String

輸入交易方向字串,可選'long'或'short'

funPickKeys function

輸入挑選keys函數,傳入{keysNorm,keysIndex,keysVolumn}物件,回傳待率定之指標key字串陣列

fdData String

輸入儲存策略資料夾字串,不存在時自動建立

opt Object <optional>
{}

輸入設定物件,預設{},其餘欄位皆傳遞至estimKeys

Properties
Name Type Attributes Default Description
funFilterKeysNorm function <optional>
null

輸入過濾一般類key之async函數,傳入keysNorm陣列回傳過濾後陣列,預設null

funFilterKeysIndex function <optional>
null

輸入過濾指數類key之async函數,傳入keysIndex陣列回傳過濾後陣列,預設null

funFilterKeysVolumn function <optional>
null

輸入過濾成交量類key之async函數,傳入keysVolumn陣列回傳過濾後陣列,預設null

Returns:

回傳Promise,resolve為undefined

Type
Promise

genSid(coin, interval, mode, conds) → {String}

Description:
  • 產生策略識別碼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: Github

Source:
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'
Parameters:
Name Type Description
coin String

輸入幣種名稱字串,例如'btc'

interval String

輸入K線週期字串,例如'4hr'

mode String

輸入交易方向字串,可選'long'或'short'

conds Array

輸入條件物件陣列,各元素為{key,sym,th},key為指標key字串,sym為'>'或'<',th為門檻數值

Returns:

回傳策略識別碼sid字串

Type
String

genStrategyFileName(coin, interval, mode, keys, settings, summary) → {String}

Description:
  • 產生策略儲存檔名

    檔名為${mode}_${levelNumTrade}_${hash}.json,hash為md5(${coin}:${interval}:${tid}:${levelNumTrade})取前16碼(64bits) tid由genTid以coin、interval、mode與keys產生,levelNumTrade由calcLevelNumTrade以summary.numTrade產生 檔名為(coin,interval,tid,levelNumTrade)之純函數且與求解結果(等效年化盈虧)無關,故同tkid恆對應同一檔名, 存檔端可直接組出檔名以fsIsFile查詢既有策略(O(1)),不需列舉全庫,且更新為原地覆寫,結構上不會出現同tkid多檔 因genTid會剔除${coin}_${interval}_樣式,不同幣種或週期之同組keys會得到相同tid,故hash輸入需含coin與interval以避免跨幣種/跨週期碰撞 採定長雜湊係因NTFS單一檔名段上限為255字元(UTF-16計,LongPathsEnabled無法放寬),keys個數多時舊式${tid} ⊙ ...檔名會超限 settings目前未參與檔名組成

    Unit Test: Github

Source:
Example
let keys = ['btc_price_4hr_ma_1day']

let settings = { uIni: 1000, uTrade: 1, rTakeProfit: 0.05, rStopLoss: 0.03, rFee: 0.0005 }

let summary = { numTrade: 30, rEquivalentCumuProfitOrLossFinalNormYear: '31.25%' }

let fn = genStrategyFileName('btc', '4hr', 'long', keys, settings, summary)
console.log(fn)
// => 'long_12_9fce6961e8f56493.json'
//tid為'long ║ p_ma_1day', 級距為12, hash為md5('btc:4hr:long ║ p_ma_1day:12')前16碼
Parameters:
Name Type Description
coin String

輸入幣種名稱字串,例如'btc'

interval String

輸入K線週期字串,例如'4hr'

mode String

輸入交易方向字串,可選'long'或'short'

keys Array

輸入指標key字串陣列

settings Object

輸入策略設定物件

summary Object

輸入回測統計摘要物件,需含numTrade(交易次數)欄位

Returns:

回傳策略儲存檔名字串

Type
String

genTid(coin, interval, mode, keys) → {String}

Description:
  • 產生策略種類識別碼tid

    以cont.dlmSeps串接mode與各key為識別字串,再進行縮寫替換以縮短長度 縮寫替換依序為: 剔除${coin}_、剔除${interval}_、'price_'轉'p_'、'index_'轉'i_'、'Ohlc_'轉'o_'、'Close_'轉'c_'、'Volumn_'轉'v_' 因替換係以${coin}_${interval}_為樣式,故coin與interval須給予有效字串,否則將剔除全部底線 tid僅由mode與keys決定,未含各key之門檻條件,故同組keys之各門檻組合皆對應同一tid

    Unit Test: Github

Source:
Example
let tid = genTid('btc', '4hr', 'long', ['btc_price_4hr_ma_1day', 'btc_index_rsi_4hr'])
console.log(tid)
// => 'long ║ p_ma_1day ║ i_rsi_4hr'
Parameters:
Name Type Description
coin String

輸入幣種名稱字串,例如'btc'

interval String

輸入K線週期字串,例如'4hr'

mode String

輸入交易方向字串,可選'long'或'short'

keys Array

輸入指標key字串陣列

Returns:

回傳策略種類識別碼tid字串

Type
String

nowTpeStr() → {String}

Description:
  • 取得當下台北時間字串,格式'YYYY-MM-DDTHH:mm:ssZ'

Source:
Example
console.log(nowTpeStr())
// => '2026-08-04T22:08:31+08:00'
Returns:

回傳當下台北時間字串

Type
String

nowTpeStrp() → {String}

Description:
  • 取得當下台北時間字串,格式'YYYYMMDDHHmmss'

Source:
Example
console.log(nowTpeStrp())
// => '20260804220831'
Returns:

回傳當下台北時間字串

Type
String

ott(inputopt) → {Object}

Description:
  • 產生台北時區(Asia/Taipei)之dayjs時間物件

    供estimKeys與w-trade-backtest之runStrategy等函數使用,使各處時間換算基準一致 未給予input時回傳當下時間,給予input時以台北時區解析該時間

Source:
Example
console.log(ott('2020-01-01T00:00:00').format('YYYY-MM-DDTHH:mm:ssZ'))
// => '2020-01-01T00:00:00+08:00'
Parameters:
Name Type Attributes Default Description
input String | Number | Date <optional>
null

輸入時間字串、時間數值或時間物件,未給予時代表當下時間,預設null

Returns:

回傳台北時區之dayjs時間物件

Type
Object

p2r(p) → {Number}

Description:
  • 轉換百分比字串為比例數值

    輸入須為含'%'之字串(例如w-trade-backtest之summary內各比例欄位),剔除'%'後除以100為比例值 未含'%'時回傳0,故無任何交易之空字串亦回傳0

    Unit Test: Github

Source:
Example
console.log(p2r('31.25%'))
// => 0.3125

console.log(p2r('-5%'))
// => -0.05

console.log(p2r(''))
// => 0
Parameters:
Name Type Description
p String

輸入百分比字串,例如'31.25%'

Returns:

回傳比例數值

Type
Number

readStrategies(fd, optopt) → {Array}

Description:
  • 讀取儲存策略資料夾內各策略檔資訊

    僅列舉fd第1層之檔案,資料夾不列入,fd非資料夾或無任何檔案時回傳空陣列 各檔依opt.fromContent決定解析來源: 'filename'為舊式檔名反解: 以主檔名(剔除'.json')依cont.dlmPkgs切段,依序為tid、levelNumTrade與rEquivalentCumuProfitOrLossFinalNormYear,切不出tid者予以略過 'content'為讀取檔內json之tid、tkid、levelNumTrade與summary等欄位(即estimKeys所寫出之策略內容),非合法json或無tid欄位者予以略過,因需讀檔故較'filename'慢 'auto'(預設)為逐檔判別: 檔名符合genStrategyFileName雜湊格式(${mode}_${levelNumTrade}_${hash16}.json)者走'content',其餘走'filename',故新舊格式混存時皆可列舉 tid依cont.dlmSeps切段,首段為mode,其餘為各key所組成之ps tkid為${tid}:${levelNumTrade},與estimKeys內用於判斷同組keys與同交易次數級距之組合方式一致

    Unit Test: Github

Source:
Example
import fs from 'fs'
import genStrategyFileName from './src/genStrategyFileName.mjs'

let fd = './tmp/data-strategy'
fs.mkdirSync(fd, { recursive: true })

//以genStrategyFileName之檔名規則儲存策略檔, 檔名為雜湊格式, 識別資訊由檔內json承載
let summary = { numTrade: 30, rEquivalentCumuProfitOrLossFinalNormYear: '31.25%' }
let fn = genStrategyFileName('btc', '4hr', 'long', ['btc_4hr_ma_1day'], {}, summary)
let data = { tid: 'long ║ ma_1day', tkid: 'long ║ ma_1day:12', levelNumTrade: 12, mode: 'long', summary }
fs.writeFileSync(`${fd}/${fn}`, JSON.stringify(data), 'utf8')

console.log(readStrategies(fd))
// => [
//   {
//     path: './tmp/data-strategy/long_12_a7578526a1fc57d8.json',
//     name: 'long_12_a7578526a1fc57d8.json',
//     tkid: 'long ║ ma_1day:12',
//     tid: 'long ║ ma_1day',
//     levelNumTrade: '12',
//     rEquivalentCumuProfitOrLossFinalNormYear: '31.25%',
//     mode: 'long',
//     ps: [ 'ma_1day' ]
//   }
// ]
Parameters:
Name Type Attributes Default Description
fd String

輸入儲存策略資料夾字串

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
readContent Boolean <optional>
false

輸入是否額外提供策略檔內容布林值,為true時各元素額外提供data欄位,內容非合法json時data為null,預設false

fromContent String <optional>
'auto'

輸入解析來源字串,可選'filename'(由檔名反解)、'content'(讀檔內json欄位)與'auto'(依檔名格式逐檔判別),給予其他值時亦採'auto',預設'auto'

Returns:

回傳策略資訊陣列,各元素為{path,name,tkid,tid,levelNumTrade,rEquivalentCumuProfitOrLossFinalNormYear,mode,ps},opt.readContent為true時額外提供data

Type
Array