w-trade-backtest 1.0.4 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/w-trade-backtest.umd.js +2 -27
- package/dist/w-trade-backtest.umd.js.map +1 -1
- package/docs/buildKLinesTpSl.mjs.html +218 -0
- package/docs/calcOrders.mjs.html +2 -2
- package/docs/calcOrdersRatio.mjs.html +2 -2
- package/docs/calcOrdersSummary.mjs.html +2 -2
- package/docs/calcOrdersSummarySimple.mjs.html +2 -2
- package/docs/calcSummary.mjs.html +2 -2
- package/docs/closeAndSummaryOrders.mjs.html +7 -7
- package/docs/genKLinesTpSl.mjs.html +154 -0
- package/docs/genReport.mjs.html +34 -27
- package/docs/genReportCore.mjs.html +5 -5
- package/docs/global.html +1274 -165
- package/docs/index.html +2 -2
- package/docs/loadKLinesTpSl.mjs.html +189 -0
- package/docs/runStrategies.mjs.html +2 -2
- package/docs/runStrategiesAndBacktest.mjs.html +7 -7
- package/docs/runStrategy.mjs.html +2 -2
- package/package.json +2 -3
- package/src/WTradeBacktest.mjs +6 -0
- package/src/buildKLinesTpSl.mjs +146 -0
- package/src/closeAndSummaryOrders.mjs +5 -5
- package/src/genKLinesTpSl.mjs +82 -0
- package/src/genReport.mjs +32 -25
- package/src/genReportCore.mjs +3 -3
- package/src/loadKLinesTpSl.mjs +117 -0
- package/src/runStrategiesAndBacktest.mjs +5 -5
- package/test/unit-WTradeBacktest.test.mjs +23 -643
- package/test/unit-buildKLinesTpSl.test.mjs +98 -0
- package/test/unit-calcOrders.test.mjs +60 -0
- package/test/unit-calcOrdersRatio.test.mjs +39 -0
- package/test/unit-calcOrdersSummary.test.mjs +71 -0
- package/test/unit-calcOrdersSummarySimple.test.mjs +30 -0
- package/test/unit-calcSummary.test.mjs +30 -0
- package/test/unit-closeAndSummaryOrders.test.mjs +53 -0
- package/test/unit-genKLinesTpSl.test.mjs +46 -0
- package/test/unit-genReport.test.mjs +113 -0
- package/test/unit-genReportCore.test.mjs +39 -0
- package/test/unit-loadKLinesTpSl.test.mjs +158 -0
- package/test/unit-ott.test.mjs +20 -0
- package/test/unit-runStrategies.test.mjs +30 -0
- package/test/unit-runStrategiesAndBacktest.test.mjs +114 -0
- package/test/unit-runStrategy.test.mjs +53 -0
- package/test/unit-setup.mjs +120 -0
- package/src/readJson.mjs +0 -26
- package/src/writeJson.mjs +0 -31
- package/src/writeTxt.mjs +0 -19
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
|
|
5
|
+
<meta charset="utf-8">
|
|
6
|
+
<title>buildKLinesTpSl.mjs - Documentation</title>
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
<script src="scripts/prettify/prettify.js"></script>
|
|
10
|
+
<script src="scripts/prettify/lang-css.js"></script>
|
|
11
|
+
<!--[if lt IE 9]>
|
|
12
|
+
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
|
13
|
+
<![endif]-->
|
|
14
|
+
<link type="text/css" rel="stylesheet" href="styles/prettify.css">
|
|
15
|
+
<link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
|
|
16
|
+
<script src="scripts/nav.js" defer></script>
|
|
17
|
+
|
|
18
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
19
|
+
</head>
|
|
20
|
+
<body>
|
|
21
|
+
|
|
22
|
+
<input type="checkbox" id="nav-trigger" class="nav-trigger" />
|
|
23
|
+
<label for="nav-trigger" class="navicon-button x">
|
|
24
|
+
<div class="navicon"></div>
|
|
25
|
+
</label>
|
|
26
|
+
|
|
27
|
+
<label for="nav-trigger" class="overlay"></label>
|
|
28
|
+
|
|
29
|
+
<nav >
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#buildKLinesTpSl">buildKLinesTpSl</a></li><li><a href="global.html#calcOrders">calcOrders</a></li><li><a href="global.html#calcOrdersRatio">calcOrdersRatio</a></li><li><a href="global.html#calcOrdersSummary">calcOrdersSummary</a></li><li><a href="global.html#calcOrdersSummarySimple">calcOrdersSummarySimple</a></li><li><a href="global.html#calcSummary">calcSummary</a></li><li><a href="global.html#closeAndSummaryOrders">closeAndSummaryOrders</a></li><li><a href="global.html#genKLinesTpSl">genKLinesTpSl</a></li><li><a href="global.html#genReport">genReport</a></li><li><a href="global.html#genReportCore">genReportCore</a></li><li><a href="global.html#loadKLinesTpSl">loadKLinesTpSl</a></li><li><a href="global.html#runStrategies">runStrategies</a></li><li><a href="global.html#runStrategiesAndBacktest">runStrategiesAndBacktest</a></li><li><a href="global.html#runStrategy">runStrategy</a></li></ul>
|
|
33
|
+
|
|
34
|
+
</nav>
|
|
35
|
+
|
|
36
|
+
<div id="main">
|
|
37
|
+
|
|
38
|
+
<h1 class="page-title">buildKLinesTpSl.mjs</h1>
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<section>
|
|
47
|
+
<article>
|
|
48
|
+
<pre class="prettyprint source linenums"><code>import path from 'path'
|
|
49
|
+
import fs from 'fs'
|
|
50
|
+
import isestr from 'wsemi/src/isestr.mjs'
|
|
51
|
+
import istime from 'wsemi/src/istime.mjs'
|
|
52
|
+
import fsIsFolder from 'wsemi/src/fsIsFolder.mjs'
|
|
53
|
+
import fsCreateFolder from 'wsemi/src/fsCreateFolder.mjs'
|
|
54
|
+
import WDataTdprovide from 'w-data-tdprovide/src/WDataTdprovide.mjs'
|
|
55
|
+
import genKLinesTpSl from './genKLinesTpSl.mjs'
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* 建置各K線與各止盈止損組合之先觸結果快取檔
|
|
60
|
+
*
|
|
61
|
+
* 以w-data-tdprovide讀取fdOhlc與fdParam資料夾內keyOhlc序列,取ts至te範圍K線後,逐一組合modes與tps呼叫genKLinesTpSl
|
|
62
|
+
* 各組合以`${mode}_${tpsl}`為key存入各根K線,win為1(止盈先觸)、0(止損先觸)或-1(至區間末仍未結)
|
|
63
|
+
* timeEnd於建置時由hold位移換算為絕對時間,故下游查表即得而不需位置索引,未結者為null
|
|
64
|
+
* 僅存win、timeEnd與各根close,盈虧由下游loadKLinesTpSl之ordersFromBars以close與手續費重算
|
|
65
|
+
* fdOhlc或fdParam非資料夾、fpJson或opt.keyOhlc非有效字串、opt.ts或opt.te非時間字串時throw
|
|
66
|
+
*
|
|
67
|
+
* Unit Test: {@link https://github.com/yuda-lyu/w-trade-backtest/blob/master/test/unit-WTradeBacktest.test.mjs Github}
|
|
68
|
+
* @function
|
|
69
|
+
* @param {String} fdOhlc 輸入儲存K線(ohlc)序列資料夾字串,各序列以`${key}.json`儲存
|
|
70
|
+
* @param {String} fdParam 輸入儲存指標參數序列資料夾字串
|
|
71
|
+
* @param {String} fpJson 輸入輸出快取json檔案路徑字串,資料夾不存在時自動建立
|
|
72
|
+
* @param {Object} [opt={}] 輸入設定物件,預設{}
|
|
73
|
+
* @param {String} opt.keyOhlc 輸入K線序列key字串
|
|
74
|
+
* @param {String} opt.ts 輸入起始秒時間字串
|
|
75
|
+
* @param {String} opt.te 輸入結束秒時間字串
|
|
76
|
+
* @param {Array} [opt.tps=[4,5,6,7,8,9,10]] 輸入止盈止損百分比數值陣列,如5代表止盈與止損皆5%,預設[4,5,6,7,8,9,10]
|
|
77
|
+
* @param {Array} [opt.modes=['long','short']] 輸入交易方向字串陣列,預設['long','short']
|
|
78
|
+
* @returns {Promise} 回傳Promise,resolve為{meta,bars}物件,meta內含keyOhlc、ts、te、tps、modes與nBars(K線根數),bars以進場時間為key,各值內含close與各`${mode}_${tpsl}`之{win,timeEnd},並同步寫出至fpJson
|
|
79
|
+
* @example
|
|
80
|
+
*
|
|
81
|
+
* import fs from 'fs'
|
|
82
|
+
*
|
|
83
|
+
* let arrOhlc = [
|
|
84
|
+
* { time: '2020-01-01T00:00:00', Open: 100, High: 101, Low: 99, Close: 100 },
|
|
85
|
+
* { time: '2020-01-01T04:00:00', Open: 100, High: 106, Low: 100, Close: 105 },
|
|
86
|
+
* { time: '2020-01-01T08:00:00', Open: 105, High: 107, Low: 102, Close: 103 },
|
|
87
|
+
* { time: '2020-01-01T12:00:00', Open: 103, High: 104, Low: 94, Close: 95 },
|
|
88
|
+
* { time: '2020-01-01T16:00:00', Open: 95, High: 98, Low: 92, Close: 93 },
|
|
89
|
+
* { time: '2020-01-01T20:00:00', Open: 93, High: 99, Low: 95, Close: 97 },
|
|
90
|
+
* ]
|
|
91
|
+
*
|
|
92
|
+
* //建立數據資料夾, fdOhlc放K線序列, fdParam放指標參數序列
|
|
93
|
+
* fs.mkdirSync('./data-ohlc', { recursive: true })
|
|
94
|
+
* fs.mkdirSync('./data-param', { recursive: true })
|
|
95
|
+
* fs.writeFileSync('./data-ohlc/btc.json', JSON.stringify(arrOhlc), 'utf8')
|
|
96
|
+
*
|
|
97
|
+
* let r = await buildKLinesTpSl('./data-ohlc', './data-param', './cache/kltpsl.json', {
|
|
98
|
+
* keyOhlc: 'btc',
|
|
99
|
+
* ts: '2020-01-01T00:00:00',
|
|
100
|
+
* te: '2020-01-01T20:00:00',
|
|
101
|
+
* tps: [5],
|
|
102
|
+
* modes: ['long'],
|
|
103
|
+
* })
|
|
104
|
+
* console.log(r.meta)
|
|
105
|
+
* // => {
|
|
106
|
+
* // keyOhlc: 'btc',
|
|
107
|
+
* // ts: '2020-01-01T00:00:00',
|
|
108
|
+
* // te: '2020-01-01T20:00:00',
|
|
109
|
+
* // tps: [ 5 ],
|
|
110
|
+
* // modes: [ 'long' ],
|
|
111
|
+
* // nBars: 6
|
|
112
|
+
* // }
|
|
113
|
+
* console.log(r.bars['2020-01-01T00:00:00'])
|
|
114
|
+
* // => { close: 100, long_5: { win: 1, timeEnd: '2020-01-01T04:00:00' } }
|
|
115
|
+
* console.log(r.bars['2020-01-01T12:00:00'])
|
|
116
|
+
* // => { close: 95, long_5: { win: -1, timeEnd: null } }
|
|
117
|
+
*
|
|
118
|
+
*/
|
|
119
|
+
let buildKLinesTpSl = async (fdOhlc, fdParam, fpJson, opt = {}) => {
|
|
120
|
+
//一次性全建(訓練區間固定, 不需增量); 若日後要增量延長: 已結entry不動、未結entry用新OHLC重掃、新棒加key即可
|
|
121
|
+
|
|
122
|
+
//check
|
|
123
|
+
if (!fsIsFolder(fdOhlc)) {
|
|
124
|
+
throw new Error(`fdOhlc[${fdOhlc}] is not a folder`)
|
|
125
|
+
}
|
|
126
|
+
if (!fsIsFolder(fdParam)) {
|
|
127
|
+
throw new Error(`fdParam[${fdParam}] is not a folder`)
|
|
128
|
+
}
|
|
129
|
+
if (!isestr(fpJson)) {
|
|
130
|
+
throw new Error(`invalid fpJson`)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
let provideData = WDataTdprovide(fdOhlc, fdParam) //數據資料夾由呼叫端顯式指定
|
|
134
|
+
|
|
135
|
+
let {
|
|
136
|
+
keyOhlc,
|
|
137
|
+
ts,
|
|
138
|
+
te,
|
|
139
|
+
tps = [4, 5, 6, 7, 8, 9, 10],
|
|
140
|
+
modes = ['long', 'short'],
|
|
141
|
+
} = opt
|
|
142
|
+
|
|
143
|
+
//check
|
|
144
|
+
if (!isestr(keyOhlc)) {
|
|
145
|
+
throw new Error(`invalid opt.keyOhlc`)
|
|
146
|
+
}
|
|
147
|
+
if (!istime(ts)) {
|
|
148
|
+
throw new Error(`invalid opt.ts`)
|
|
149
|
+
}
|
|
150
|
+
if (!istime(te)) {
|
|
151
|
+
throw new Error(`invalid opt.te`)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
//OHLC(訓練區間)
|
|
155
|
+
let arrOhlc = await provideData.getTimeSeriesByTimeRange(keyOhlc, ts, te)
|
|
156
|
+
let n = arrOhlc.length
|
|
157
|
+
let time = arrOhlc.map((r) => r.time)
|
|
158
|
+
|
|
159
|
+
//每根 close(各 mode_tpsl 共用)
|
|
160
|
+
let bars = {}
|
|
161
|
+
for (let i = 0; i < n; i++) {
|
|
162
|
+
bars[time[i]] = { close: arrOhlc[i].Close }
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
//各 (mode, tpsl) 跑 first-touch → 填 { win, timeEnd }
|
|
166
|
+
for (let mode of modes) {
|
|
167
|
+
for (let tpsl of tps) {
|
|
168
|
+
let { win, hold } = genKLinesTpSl(arrOhlc, { tp: tpsl / 100, sl: tpsl / 100, mode })
|
|
169
|
+
let k = `${mode}_${tpsl}`
|
|
170
|
+
for (let i = 0; i < n; i++) {
|
|
171
|
+
let wn = win[i]
|
|
172
|
+
let timeEnd = (wn >= 0 && Number.isFinite(hold[i])) ? time[i + hold[i]] : null
|
|
173
|
+
bars[time[i]][k] = { win: wn, timeEnd }
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
//out
|
|
179
|
+
let out = { meta: { keyOhlc, ts, te, tps, modes, nBars: n }, bars }
|
|
180
|
+
|
|
181
|
+
//寫檔
|
|
182
|
+
let jp = path.resolve(fpJson)
|
|
183
|
+
let fd = path.dirname(jp)
|
|
184
|
+
if (!fsIsFolder(fd)) {
|
|
185
|
+
fsCreateFolder(fd)
|
|
186
|
+
}
|
|
187
|
+
fs.writeFileSync(jp, JSON.stringify(out))
|
|
188
|
+
|
|
189
|
+
return out
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
export default buildKLinesTpSl
|
|
194
|
+
</code></pre>
|
|
195
|
+
</article>
|
|
196
|
+
</section>
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
</div>
|
|
204
|
+
|
|
205
|
+
<br class="clear">
|
|
206
|
+
|
|
207
|
+
<footer>
|
|
208
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Aug 04 2026 23:16:05 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
209
|
+
</footer>
|
|
210
|
+
|
|
211
|
+
<script>prettyPrint();</script>
|
|
212
|
+
<script src="scripts/polyfill.js"></script>
|
|
213
|
+
<script src="scripts/linenumber.js"></script>
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
</body>
|
|
218
|
+
</html>
|
package/docs/calcOrders.mjs.html
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
<nav >
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
<h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#calcOrders">calcOrders</a></li><li><a href="global.html#calcOrdersRatio">calcOrdersRatio</a></li><li><a href="global.html#calcOrdersSummary">calcOrdersSummary</a></li><li><a href="global.html#calcOrdersSummarySimple">calcOrdersSummarySimple</a></li><li><a href="global.html#calcSummary">calcSummary</a></li><li><a href="global.html#closeAndSummaryOrders">closeAndSummaryOrders</a></li><li><a href="global.html#genReport">genReport</a></li><li><a href="global.html#genReportCore">genReportCore</a></li><li><a href="global.html#runStrategies">runStrategies</a></li><li><a href="global.html#runStrategiesAndBacktest">runStrategiesAndBacktest</a></li><li><a href="global.html#runStrategy">runStrategy</a></li></ul>
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#buildKLinesTpSl">buildKLinesTpSl</a></li><li><a href="global.html#calcOrders">calcOrders</a></li><li><a href="global.html#calcOrdersRatio">calcOrdersRatio</a></li><li><a href="global.html#calcOrdersSummary">calcOrdersSummary</a></li><li><a href="global.html#calcOrdersSummarySimple">calcOrdersSummarySimple</a></li><li><a href="global.html#calcSummary">calcSummary</a></li><li><a href="global.html#closeAndSummaryOrders">closeAndSummaryOrders</a></li><li><a href="global.html#genKLinesTpSl">genKLinesTpSl</a></li><li><a href="global.html#genReport">genReport</a></li><li><a href="global.html#genReportCore">genReportCore</a></li><li><a href="global.html#loadKLinesTpSl">loadKLinesTpSl</a></li><li><a href="global.html#runStrategies">runStrategies</a></li><li><a href="global.html#runStrategiesAndBacktest">runStrategiesAndBacktest</a></li><li><a href="global.html#runStrategy">runStrategy</a></li></ul>
|
|
33
33
|
|
|
34
34
|
</nav>
|
|
35
35
|
|
|
@@ -265,7 +265,7 @@ export default calcOrders
|
|
|
265
265
|
<br class="clear">
|
|
266
266
|
|
|
267
267
|
<footer>
|
|
268
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on
|
|
268
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Aug 04 2026 23:16:05 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
269
269
|
</footer>
|
|
270
270
|
|
|
271
271
|
<script>prettyPrint();</script>
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
<nav >
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
<h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#calcOrders">calcOrders</a></li><li><a href="global.html#calcOrdersRatio">calcOrdersRatio</a></li><li><a href="global.html#calcOrdersSummary">calcOrdersSummary</a></li><li><a href="global.html#calcOrdersSummarySimple">calcOrdersSummarySimple</a></li><li><a href="global.html#calcSummary">calcSummary</a></li><li><a href="global.html#closeAndSummaryOrders">closeAndSummaryOrders</a></li><li><a href="global.html#genReport">genReport</a></li><li><a href="global.html#genReportCore">genReportCore</a></li><li><a href="global.html#runStrategies">runStrategies</a></li><li><a href="global.html#runStrategiesAndBacktest">runStrategiesAndBacktest</a></li><li><a href="global.html#runStrategy">runStrategy</a></li></ul>
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#buildKLinesTpSl">buildKLinesTpSl</a></li><li><a href="global.html#calcOrders">calcOrders</a></li><li><a href="global.html#calcOrdersRatio">calcOrdersRatio</a></li><li><a href="global.html#calcOrdersSummary">calcOrdersSummary</a></li><li><a href="global.html#calcOrdersSummarySimple">calcOrdersSummarySimple</a></li><li><a href="global.html#calcSummary">calcSummary</a></li><li><a href="global.html#closeAndSummaryOrders">closeAndSummaryOrders</a></li><li><a href="global.html#genKLinesTpSl">genKLinesTpSl</a></li><li><a href="global.html#genReport">genReport</a></li><li><a href="global.html#genReportCore">genReportCore</a></li><li><a href="global.html#loadKLinesTpSl">loadKLinesTpSl</a></li><li><a href="global.html#runStrategies">runStrategies</a></li><li><a href="global.html#runStrategiesAndBacktest">runStrategiesAndBacktest</a></li><li><a href="global.html#runStrategy">runStrategy</a></li></ul>
|
|
33
33
|
|
|
34
34
|
</nav>
|
|
35
35
|
|
|
@@ -133,7 +133,7 @@ export default calcOrdersRatio
|
|
|
133
133
|
<br class="clear">
|
|
134
134
|
|
|
135
135
|
<footer>
|
|
136
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on
|
|
136
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Aug 04 2026 23:16:05 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
137
137
|
</footer>
|
|
138
138
|
|
|
139
139
|
<script>prettyPrint();</script>
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
<nav >
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
<h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#calcOrders">calcOrders</a></li><li><a href="global.html#calcOrdersRatio">calcOrdersRatio</a></li><li><a href="global.html#calcOrdersSummary">calcOrdersSummary</a></li><li><a href="global.html#calcOrdersSummarySimple">calcOrdersSummarySimple</a></li><li><a href="global.html#calcSummary">calcSummary</a></li><li><a href="global.html#closeAndSummaryOrders">closeAndSummaryOrders</a></li><li><a href="global.html#genReport">genReport</a></li><li><a href="global.html#genReportCore">genReportCore</a></li><li><a href="global.html#runStrategies">runStrategies</a></li><li><a href="global.html#runStrategiesAndBacktest">runStrategiesAndBacktest</a></li><li><a href="global.html#runStrategy">runStrategy</a></li></ul>
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#buildKLinesTpSl">buildKLinesTpSl</a></li><li><a href="global.html#calcOrders">calcOrders</a></li><li><a href="global.html#calcOrdersRatio">calcOrdersRatio</a></li><li><a href="global.html#calcOrdersSummary">calcOrdersSummary</a></li><li><a href="global.html#calcOrdersSummarySimple">calcOrdersSummarySimple</a></li><li><a href="global.html#calcSummary">calcSummary</a></li><li><a href="global.html#closeAndSummaryOrders">closeAndSummaryOrders</a></li><li><a href="global.html#genKLinesTpSl">genKLinesTpSl</a></li><li><a href="global.html#genReport">genReport</a></li><li><a href="global.html#genReportCore">genReportCore</a></li><li><a href="global.html#loadKLinesTpSl">loadKLinesTpSl</a></li><li><a href="global.html#runStrategies">runStrategies</a></li><li><a href="global.html#runStrategiesAndBacktest">runStrategiesAndBacktest</a></li><li><a href="global.html#runStrategy">runStrategy</a></li></ul>
|
|
33
33
|
|
|
34
34
|
</nav>
|
|
35
35
|
|
|
@@ -493,7 +493,7 @@ export default calcOrdersSummary
|
|
|
493
493
|
<br class="clear">
|
|
494
494
|
|
|
495
495
|
<footer>
|
|
496
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on
|
|
496
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Aug 04 2026 23:16:05 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
497
497
|
</footer>
|
|
498
498
|
|
|
499
499
|
<script>prettyPrint();</script>
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
<nav >
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
<h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#calcOrders">calcOrders</a></li><li><a href="global.html#calcOrdersRatio">calcOrdersRatio</a></li><li><a href="global.html#calcOrdersSummary">calcOrdersSummary</a></li><li><a href="global.html#calcOrdersSummarySimple">calcOrdersSummarySimple</a></li><li><a href="global.html#calcSummary">calcSummary</a></li><li><a href="global.html#closeAndSummaryOrders">closeAndSummaryOrders</a></li><li><a href="global.html#genReport">genReport</a></li><li><a href="global.html#genReportCore">genReportCore</a></li><li><a href="global.html#runStrategies">runStrategies</a></li><li><a href="global.html#runStrategiesAndBacktest">runStrategiesAndBacktest</a></li><li><a href="global.html#runStrategy">runStrategy</a></li></ul>
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#buildKLinesTpSl">buildKLinesTpSl</a></li><li><a href="global.html#calcOrders">calcOrders</a></li><li><a href="global.html#calcOrdersRatio">calcOrdersRatio</a></li><li><a href="global.html#calcOrdersSummary">calcOrdersSummary</a></li><li><a href="global.html#calcOrdersSummarySimple">calcOrdersSummarySimple</a></li><li><a href="global.html#calcSummary">calcSummary</a></li><li><a href="global.html#closeAndSummaryOrders">closeAndSummaryOrders</a></li><li><a href="global.html#genKLinesTpSl">genKLinesTpSl</a></li><li><a href="global.html#genReport">genReport</a></li><li><a href="global.html#genReportCore">genReportCore</a></li><li><a href="global.html#loadKLinesTpSl">loadKLinesTpSl</a></li><li><a href="global.html#runStrategies">runStrategies</a></li><li><a href="global.html#runStrategiesAndBacktest">runStrategiesAndBacktest</a></li><li><a href="global.html#runStrategy">runStrategy</a></li></ul>
|
|
33
33
|
|
|
34
34
|
</nav>
|
|
35
35
|
|
|
@@ -194,7 +194,7 @@ export default calcOrdersSummarySimple
|
|
|
194
194
|
<br class="clear">
|
|
195
195
|
|
|
196
196
|
<footer>
|
|
197
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on
|
|
197
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Aug 04 2026 23:16:05 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
198
198
|
</footer>
|
|
199
199
|
|
|
200
200
|
<script>prettyPrint();</script>
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
<nav >
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
<h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#calcOrders">calcOrders</a></li><li><a href="global.html#calcOrdersRatio">calcOrdersRatio</a></li><li><a href="global.html#calcOrdersSummary">calcOrdersSummary</a></li><li><a href="global.html#calcOrdersSummarySimple">calcOrdersSummarySimple</a></li><li><a href="global.html#calcSummary">calcSummary</a></li><li><a href="global.html#closeAndSummaryOrders">closeAndSummaryOrders</a></li><li><a href="global.html#genReport">genReport</a></li><li><a href="global.html#genReportCore">genReportCore</a></li><li><a href="global.html#runStrategies">runStrategies</a></li><li><a href="global.html#runStrategiesAndBacktest">runStrategiesAndBacktest</a></li><li><a href="global.html#runStrategy">runStrategy</a></li></ul>
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#buildKLinesTpSl">buildKLinesTpSl</a></li><li><a href="global.html#calcOrders">calcOrders</a></li><li><a href="global.html#calcOrdersRatio">calcOrdersRatio</a></li><li><a href="global.html#calcOrdersSummary">calcOrdersSummary</a></li><li><a href="global.html#calcOrdersSummarySimple">calcOrdersSummarySimple</a></li><li><a href="global.html#calcSummary">calcSummary</a></li><li><a href="global.html#closeAndSummaryOrders">closeAndSummaryOrders</a></li><li><a href="global.html#genKLinesTpSl">genKLinesTpSl</a></li><li><a href="global.html#genReport">genReport</a></li><li><a href="global.html#genReportCore">genReportCore</a></li><li><a href="global.html#loadKLinesTpSl">loadKLinesTpSl</a></li><li><a href="global.html#runStrategies">runStrategies</a></li><li><a href="global.html#runStrategiesAndBacktest">runStrategiesAndBacktest</a></li><li><a href="global.html#runStrategy">runStrategy</a></li></ul>
|
|
33
33
|
|
|
34
34
|
</nav>
|
|
35
35
|
|
|
@@ -188,7 +188,7 @@ export default calcSummary
|
|
|
188
188
|
<br class="clear">
|
|
189
189
|
|
|
190
190
|
<footer>
|
|
191
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on
|
|
191
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Aug 04 2026 23:16:05 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
192
192
|
</footer>
|
|
193
193
|
|
|
194
194
|
<script>prettyPrint();</script>
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
<nav >
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
<h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#calcOrders">calcOrders</a></li><li><a href="global.html#calcOrdersRatio">calcOrdersRatio</a></li><li><a href="global.html#calcOrdersSummary">calcOrdersSummary</a></li><li><a href="global.html#calcOrdersSummarySimple">calcOrdersSummarySimple</a></li><li><a href="global.html#calcSummary">calcSummary</a></li><li><a href="global.html#closeAndSummaryOrders">closeAndSummaryOrders</a></li><li><a href="global.html#genReport">genReport</a></li><li><a href="global.html#genReportCore">genReportCore</a></li><li><a href="global.html#runStrategies">runStrategies</a></li><li><a href="global.html#runStrategiesAndBacktest">runStrategiesAndBacktest</a></li><li><a href="global.html#runStrategy">runStrategy</a></li></ul>
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#buildKLinesTpSl">buildKLinesTpSl</a></li><li><a href="global.html#calcOrders">calcOrders</a></li><li><a href="global.html#calcOrdersRatio">calcOrdersRatio</a></li><li><a href="global.html#calcOrdersSummary">calcOrdersSummary</a></li><li><a href="global.html#calcOrdersSummarySimple">calcOrdersSummarySimple</a></li><li><a href="global.html#calcSummary">calcSummary</a></li><li><a href="global.html#closeAndSummaryOrders">closeAndSummaryOrders</a></li><li><a href="global.html#genKLinesTpSl">genKLinesTpSl</a></li><li><a href="global.html#genReport">genReport</a></li><li><a href="global.html#genReportCore">genReportCore</a></li><li><a href="global.html#loadKLinesTpSl">loadKLinesTpSl</a></li><li><a href="global.html#runStrategies">runStrategies</a></li><li><a href="global.html#runStrategiesAndBacktest">runStrategiesAndBacktest</a></li><li><a href="global.html#runStrategy">runStrategy</a></li></ul>
|
|
33
33
|
|
|
34
34
|
</nav>
|
|
35
35
|
|
|
@@ -53,8 +53,8 @@ import isestr from 'wsemi/src/isestr.mjs'
|
|
|
53
53
|
import isarr from 'wsemi/src/isarr.mjs'
|
|
54
54
|
import cint from 'wsemi/src/cint.mjs'
|
|
55
55
|
import fsIsFolder from 'wsemi/src/fsIsFolder.mjs'
|
|
56
|
+
import fsWriteJson from 'wsemi/src/fsWriteJson.mjs'
|
|
56
57
|
import WDataTdprovide from 'w-data-tdprovide/src/WDataTdprovide.mjs'
|
|
57
|
-
import writeJson from './writeJson.mjs'
|
|
58
58
|
import calcOrders from './calcOrders.mjs'
|
|
59
59
|
import calcSummary from './calcSummary.mjs'
|
|
60
60
|
import genReportCore from './genReportCore.mjs'
|
|
@@ -195,8 +195,8 @@ let closeAndSummaryOrders = async (ott, fdOhlc, fdParam, uIni, timeOhlcStart, ti
|
|
|
195
195
|
//fpOrders
|
|
196
196
|
let fpOrders = path.resolve(fdTest, fnOrders)
|
|
197
197
|
|
|
198
|
-
//
|
|
199
|
-
|
|
198
|
+
//fsWriteJson
|
|
199
|
+
fsWriteJson(fpOrders, r.orders, { useFormat: true })
|
|
200
200
|
|
|
201
201
|
}
|
|
202
202
|
|
|
@@ -215,8 +215,8 @@ let closeAndSummaryOrders = async (ott, fdOhlc, fdParam, uIni, timeOhlcStart, ti
|
|
|
215
215
|
}
|
|
216
216
|
// console.log('stsm', stsm)
|
|
217
217
|
|
|
218
|
-
//
|
|
219
|
-
|
|
218
|
+
//fsWriteJson
|
|
219
|
+
fsWriteJson(fpSummary, stsm, { useFormat: true })
|
|
220
220
|
|
|
221
221
|
console.log('summary', r.summary, size(r.orders))
|
|
222
222
|
}
|
|
@@ -252,7 +252,7 @@ export default closeAndSummaryOrders
|
|
|
252
252
|
<br class="clear">
|
|
253
253
|
|
|
254
254
|
<footer>
|
|
255
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on
|
|
255
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Aug 04 2026 23:16:05 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
256
256
|
</footer>
|
|
257
257
|
|
|
258
258
|
<script>prettyPrint();</script>
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
|
|
5
|
+
<meta charset="utf-8">
|
|
6
|
+
<title>genKLinesTpSl.mjs - Documentation</title>
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
<script src="scripts/prettify/prettify.js"></script>
|
|
10
|
+
<script src="scripts/prettify/lang-css.js"></script>
|
|
11
|
+
<!--[if lt IE 9]>
|
|
12
|
+
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
|
13
|
+
<![endif]-->
|
|
14
|
+
<link type="text/css" rel="stylesheet" href="styles/prettify.css">
|
|
15
|
+
<link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
|
|
16
|
+
<script src="scripts/nav.js" defer></script>
|
|
17
|
+
|
|
18
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
19
|
+
</head>
|
|
20
|
+
<body>
|
|
21
|
+
|
|
22
|
+
<input type="checkbox" id="nav-trigger" class="nav-trigger" />
|
|
23
|
+
<label for="nav-trigger" class="navicon-button x">
|
|
24
|
+
<div class="navicon"></div>
|
|
25
|
+
</label>
|
|
26
|
+
|
|
27
|
+
<label for="nav-trigger" class="overlay"></label>
|
|
28
|
+
|
|
29
|
+
<nav >
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#buildKLinesTpSl">buildKLinesTpSl</a></li><li><a href="global.html#calcOrders">calcOrders</a></li><li><a href="global.html#calcOrdersRatio">calcOrdersRatio</a></li><li><a href="global.html#calcOrdersSummary">calcOrdersSummary</a></li><li><a href="global.html#calcOrdersSummarySimple">calcOrdersSummarySimple</a></li><li><a href="global.html#calcSummary">calcSummary</a></li><li><a href="global.html#closeAndSummaryOrders">closeAndSummaryOrders</a></li><li><a href="global.html#genKLinesTpSl">genKLinesTpSl</a></li><li><a href="global.html#genReport">genReport</a></li><li><a href="global.html#genReportCore">genReportCore</a></li><li><a href="global.html#loadKLinesTpSl">loadKLinesTpSl</a></li><li><a href="global.html#runStrategies">runStrategies</a></li><li><a href="global.html#runStrategiesAndBacktest">runStrategiesAndBacktest</a></li><li><a href="global.html#runStrategy">runStrategy</a></li></ul>
|
|
33
|
+
|
|
34
|
+
</nav>
|
|
35
|
+
|
|
36
|
+
<div id="main">
|
|
37
|
+
|
|
38
|
+
<h1 class="page-title">genKLinesTpSl.mjs</h1>
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<section>
|
|
47
|
+
<article>
|
|
48
|
+
<pre class="prettyprint source linenums"><code>/**
|
|
49
|
+
* 計算各K線進場後之止盈止損先觸結果
|
|
50
|
+
*
|
|
51
|
+
* 以各根K線收盤價為進場價,往後逐根K線掃描first-touch,long以Low<=進場價*(1-sl)判止損、High>=進場價*(1+tp)判止盈
|
|
52
|
+
* short以High>=進場價*(1+sl)判止損、Low<=進場價*(1-tp)判止盈,同根同時觸發時皆先判止損
|
|
53
|
+
* 末根K線與掃描至序列末仍未觸發者視為未結,win為-1且pnl與hold為NaN
|
|
54
|
+
*
|
|
55
|
+
* Unit Test: {@link https://github.com/yuda-lyu/w-trade-backtest/blob/master/test/unit-WTradeBacktest.test.mjs Github}
|
|
56
|
+
* @function
|
|
57
|
+
* @param {Array} arrOhlc 輸入K線陣列,各元素需含time(秒時間字串)、Close、High、Low欄位,且依時間由小至大排序
|
|
58
|
+
* @param {Object} [opt={}] 輸入設定物件,預設{}
|
|
59
|
+
* @param {Number} opt.tp 輸入止盈比例正數,如0.05代表5%
|
|
60
|
+
* @param {Number} opt.sl 輸入止損比例正數,如0.05代表5%
|
|
61
|
+
* @param {String} [opt.mode='long'] 輸入交易方向字串,可為'long'或'short',預設'long'
|
|
62
|
+
* @returns {Object} 回傳物件,內含time(時間字串陣列)、pnl(Float64Array,止盈為tp、止損為-sl、未結為NaN)、win(Int8Array,1為止盈先觸、0為止損先觸、-1為未結)、hold(Float64Array,出場K線與進場K線之位移根數,未結為NaN)欄位,各陣列長度同arrOhlc且index對應
|
|
63
|
+
* @example
|
|
64
|
+
*
|
|
65
|
+
* let arrOhlc = [
|
|
66
|
+
* { time: '2020-01-01T00:00:00', Open: 100, High: 101, Low: 99, Close: 100 },
|
|
67
|
+
* { time: '2020-01-01T04:00:00', Open: 100, High: 106, Low: 100, Close: 105 },
|
|
68
|
+
* { time: '2020-01-01T08:00:00', Open: 105, High: 107, Low: 102, Close: 103 },
|
|
69
|
+
* { time: '2020-01-01T12:00:00', Open: 103, High: 104, Low: 94, Close: 95 },
|
|
70
|
+
* { time: '2020-01-01T16:00:00', Open: 95, High: 98, Low: 92, Close: 93 },
|
|
71
|
+
* { time: '2020-01-01T20:00:00', Open: 93, High: 99, Low: 95, Close: 97 },
|
|
72
|
+
* ]
|
|
73
|
+
*
|
|
74
|
+
* let r = genKLinesTpSl(arrOhlc, { tp: 0.05, sl: 0.05, mode: 'long' })
|
|
75
|
+
* console.log(Array.from(r.win))
|
|
76
|
+
* // => [ 1, 0, 0, -1, 1, -1 ]
|
|
77
|
+
* console.log(Array.from(r.hold))
|
|
78
|
+
* // => [ 1, 2, 1, NaN, 1, NaN ]
|
|
79
|
+
* console.log(Array.from(r.pnl))
|
|
80
|
+
* // => [ 0.05, -0.05, -0.05, NaN, 0.05, NaN ]
|
|
81
|
+
*
|
|
82
|
+
*/
|
|
83
|
+
let genKLinesTpSl = (arrOhlc, opt = {}) => {
|
|
84
|
+
|
|
85
|
+
let tp = opt.tp; let sl = opt.sl; let mode = opt.mode || 'long'
|
|
86
|
+
if (!(tp > 0) || !(sl > 0)) throw new Error(`genKLinesTpSl: invalid tp[${tp}] / sl[${sl}]`)
|
|
87
|
+
|
|
88
|
+
let n = arrOhlc.length
|
|
89
|
+
let time = new Array(n)
|
|
90
|
+
let C = new Float64Array(n); let H = new Float64Array(n); let L = new Float64Array(n)
|
|
91
|
+
for (let i = 0; i < n; i++) {
|
|
92
|
+
let r = arrOhlc[i]; time[i] = r.time; C[i] = r.Close; H[i] = r.High; L[i] = r.Low
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
let pnl = new Float64Array(n).fill(NaN)
|
|
96
|
+
let win = new Int8Array(n).fill(-1)
|
|
97
|
+
let hold = new Float64Array(n).fill(NaN)
|
|
98
|
+
|
|
99
|
+
for (let i = 0; i < n - 1; i++) {
|
|
100
|
+
let e = C[i]; if (!(e > 0)) continue
|
|
101
|
+
let up = e * (1 + tp); let dn = e * (1 - sl) //長: up=止盈線, dn=止損線
|
|
102
|
+
for (let j = i + 1; j < n; j++) {
|
|
103
|
+
if (mode === 'long') {
|
|
104
|
+
//長: 跌破 dn (SL) 或 漲到 up (TP); 同根同觸 → 先判 SL
|
|
105
|
+
if (L[j] <= dn) {
|
|
106
|
+
pnl[i] = -sl; win[i] = 0; hold[i] = j - i; break
|
|
107
|
+
}
|
|
108
|
+
if (H[j] >= up) {
|
|
109
|
+
pnl[i] = tp; win[i] = 1; hold[i] = j - i; break
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
//空: 漲到 e*(1+sl) (SL) 或 跌到 e*(1-tp) (TP); 同根同觸 → 先判 SL
|
|
114
|
+
let upS = e * (1 + sl); let dnS = e * (1 - tp)
|
|
115
|
+
if (H[j] >= upS) {
|
|
116
|
+
pnl[i] = -sl; win[i] = 0; hold[i] = j - i; break
|
|
117
|
+
}
|
|
118
|
+
if (L[j] <= dnS) {
|
|
119
|
+
pnl[i] = tp; win[i] = 1; hold[i] = j - i; break
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return { time, pnl, win, hold }
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
export default genKLinesTpSl
|
|
130
|
+
</code></pre>
|
|
131
|
+
</article>
|
|
132
|
+
</section>
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
</div>
|
|
140
|
+
|
|
141
|
+
<br class="clear">
|
|
142
|
+
|
|
143
|
+
<footer>
|
|
144
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Aug 04 2026 23:16:05 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
145
|
+
</footer>
|
|
146
|
+
|
|
147
|
+
<script>prettyPrint();</script>
|
|
148
|
+
<script src="scripts/polyfill.js"></script>
|
|
149
|
+
<script src="scripts/linenumber.js"></script>
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
</body>
|
|
154
|
+
</html>
|