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
|
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( |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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
|
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
|
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之各門檻組合皆對應同一tidUnit 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}
Example
console.log(nowTpeStr())
// => '2026-08-04T22:08:31+08:00'
Returns:
回傳當下台北時間字串
- Type
- String
nowTpeStrp() → {String}
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
|
Returns:
回傳策略資訊陣列,各元素為{path,name,tkid,tid,levelNumTrade,rEquivalentCumuProfitOrLossFinalNormYear,mode,ps},opt.readContent為true時額外提供data
- Type
- Array