w-trade-backtest 1.0.3

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.
Files changed (84) hide show
  1. package/.editorconfig +9 -0
  2. package/.eslintignore +3 -0
  3. package/.eslintrc.js +55 -0
  4. package/.jsdoc +25 -0
  5. package/README.md +167 -0
  6. package/SECURITY.md +5 -0
  7. package/babel.config.js +16 -0
  8. package/dist/renderOrdersTable.js +217 -0
  9. package/dist/renderOrdersTimeline.js +159 -0
  10. package/dist/renderProfitPlot.js +198 -0
  11. package/dist/renderSummary.js +194 -0
  12. package/dist/tmp.html +232 -0
  13. package/dist/w-trade-backtest.umd.js +32 -0
  14. package/dist/w-trade-backtest.umd.js.map +1 -0
  15. package/docs/calcOrders.mjs.html +278 -0
  16. package/docs/calcOrdersRatio.mjs.html +146 -0
  17. package/docs/calcOrdersSummary.mjs.html +506 -0
  18. package/docs/calcOrdersSummarySimple.mjs.html +207 -0
  19. package/docs/calcSummary.mjs.html +201 -0
  20. package/docs/closeAndSummaryOrders.mjs.html +265 -0
  21. package/docs/fonts/Montserrat/Montserrat-Bold.eot +0 -0
  22. package/docs/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
  23. package/docs/fonts/Montserrat/Montserrat-Bold.woff +0 -0
  24. package/docs/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
  25. package/docs/fonts/Montserrat/Montserrat-Regular.eot +0 -0
  26. package/docs/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
  27. package/docs/fonts/Montserrat/Montserrat-Regular.woff +0 -0
  28. package/docs/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
  29. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
  30. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
  31. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
  32. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
  33. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
  34. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
  35. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
  36. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
  37. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
  38. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
  39. package/docs/genReport.mjs.html +196 -0
  40. package/docs/genReportCore.mjs.html +128 -0
  41. package/docs/global.html +4231 -0
  42. package/docs/index.html +84 -0
  43. package/docs/runStrategies.mjs.html +244 -0
  44. package/docs/runStrategy.mjs.html +455 -0
  45. package/docs/scripts/collapse.js +39 -0
  46. package/docs/scripts/commonNav.js +28 -0
  47. package/docs/scripts/linenumber.js +25 -0
  48. package/docs/scripts/nav.js +12 -0
  49. package/docs/scripts/polyfill.js +4 -0
  50. package/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
  51. package/docs/scripts/prettify/lang-css.js +2 -0
  52. package/docs/scripts/prettify/prettify.js +28 -0
  53. package/docs/scripts/search.js +99 -0
  54. package/docs/styles/jsdoc.css +776 -0
  55. package/docs/styles/prettify.css +80 -0
  56. package/g.mjs +146 -0
  57. package/package.json +30 -0
  58. package/script.txt +19 -0
  59. package/src/WTradeBacktest.mjs +27 -0
  60. package/src/calcOrders.mjs +206 -0
  61. package/src/calcOrdersRatio.mjs +74 -0
  62. package/src/calcOrdersSummary.mjs +434 -0
  63. package/src/calcOrdersSummarySimple.mjs +135 -0
  64. package/src/calcSummary.mjs +129 -0
  65. package/src/closeAndSummaryOrders.mjs +193 -0
  66. package/src/genReport.mjs +124 -0
  67. package/src/genReportCore.mjs +56 -0
  68. package/src/ott.mjs +28 -0
  69. package/src/readJson.mjs +26 -0
  70. package/src/renderOrdersTable.js +217 -0
  71. package/src/renderOrdersTimeline.js +159 -0
  72. package/src/renderProfitPlot.js +198 -0
  73. package/src/renderSummary.js +194 -0
  74. package/src/runStrategies.mjs +172 -0
  75. package/src/runStrategy.mjs +383 -0
  76. package/src/tmp.html +232 -0
  77. package/src/writeJson.mjs +31 -0
  78. package/src/writeTxt.mjs +19 -0
  79. package/test/unit-WTradeBacktest.test.mjs +541 -0
  80. package/toolg/addVersion.mjs +4 -0
  81. package/toolg/cleanFolder.mjs +5 -0
  82. package/toolg/gDistRollup.mjs +51 -0
  83. package/toolg/gDocsExams.mjs +48 -0
  84. package/toolg/modifyReadme.mjs +4 -0
@@ -0,0 +1,278 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+
5
+ <meta charset="utf-8">
6
+ <title>calcOrders.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#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#runStrategy">runStrategy</a></li></ul>
33
+
34
+ </nav>
35
+
36
+ <div id="main">
37
+
38
+ <h1 class="page-title">calcOrders.mjs</h1>
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+ <section>
47
+ <article>
48
+ <pre class="prettyprint source linenums"><code>import each from 'lodash-es/each.js'
49
+ import get from 'lodash-es/get.js'
50
+ import sortBy from 'lodash-es/sortBy.js'
51
+ import dig from 'wsemi/src/dig.mjs'
52
+ import haskey from 'wsemi/src/haskey.mjs'
53
+
54
+
55
+ /**
56
+ * 結算訂單,依K線序列判斷各下單之止盈止損觸發並計算盈虧
57
+ *
58
+ * 各單僅檢查time大於timeStart之K棒,long以Low&lt;=priceStopLoss先判止損、High>=priceTakeProfit判止盈,short以High>=priceStopLoss先判止損、Low&lt;=priceTakeProfit判止盈
59
+ * long盈虧為uTrade*(priceEnd/priceStart)-uTrade-2*uFee,short盈虧為(priceStart-priceEnd)*(uTrade/priceStart)-2*uFee
60
+ * 依timeStart排序逐單累計uCumuProfitOrLoss與uEquity(自uIni起算),modeResult為盈虧&lt;0時'loss'否則'profit',未觸發止盈止損者維持原單(未平倉)
61
+ *
62
+ * Unit Test: {@link https://github.com/yuda-lyu/w-trade-backtest/blob/master/test/unit-WTradeBacktest.test.mjs Github}
63
+ * @function
64
+ * @param {Array} arrOhlc 輸入K線陣列,各元素需含time、High、Low欄位
65
+ * @param {Array} orders 輸入下單陣列,各元素需含mode('long'或'short')、timeStart、priceStart、uTrade、priceTakeProfit、priceStopLoss、uFee欄位
66
+ * @param {Object} [opt={}] 輸入設定物件,預設{}
67
+ * @param {Number} [opt.uIni=1000] 輸入初始資金數字,預設1000
68
+ * @returns {Promise} 回傳Promise,resolve為結算後訂單陣列
69
+ * @example
70
+ *
71
+ * let arrOhlc = [
72
+ * { time: '2020-01-01T00:00:00', Open: 100, High: 101, Low: 99, Close: 100 },
73
+ * { time: '2020-01-01T04:00:00', Open: 100, High: 106, Low: 100, Close: 105 },
74
+ * { time: '2020-01-01T08:00:00', Open: 105, High: 107, Low: 102, Close: 103 },
75
+ * { time: '2020-01-01T12:00:00', Open: 103, High: 104, Low: 94, Close: 95 },
76
+ * { time: '2020-01-01T16:00:00', Open: 95, High: 98, Low: 92, Close: 93 },
77
+ * { time: '2020-01-01T20:00:00', Open: 93, High: 99, Low: 95, Close: 97 },
78
+ * ]
79
+ *
80
+ * let orders = [{
81
+ * mode: 'long',
82
+ * timeStart: '2020-01-01T00:00:00',
83
+ * priceStart: 100,
84
+ * uTrade: 100,
85
+ * priceTakeProfit: 105,
86
+ * priceStopLoss: 97,
87
+ * timeEnd: '',
88
+ * priceEnd: '',
89
+ * modeResult: '',
90
+ * uFee: 0.05,
91
+ * }]
92
+ *
93
+ * calcOrders(arrOhlc, orders, { uIni: 1000 })
94
+ * .then((rs) => {
95
+ * console.log(rs[0])
96
+ * // => {
97
+ * // mode: 'long',
98
+ * // timeStart: '2020-01-01T00:00:00',
99
+ * // priceStart: 100,
100
+ * // uTrade: 100,
101
+ * // priceTakeProfit: 105,
102
+ * // priceStopLoss: 97,
103
+ * // timeEnd: '2020-01-01T04:00:00',
104
+ * // priceEnd: 105,
105
+ * // modeResult: 'profit',
106
+ * // uFee: 0.05,
107
+ * // uProfitOrLoss: 4.9,
108
+ * // rProfitOrLoss: 0.049,
109
+ * // uCumuProfitOrLoss: 4.9,
110
+ * // rCumuProfitOrLoss: '0.49%',
111
+ * // uEquity: 1004.9
112
+ * // }
113
+ * })
114
+ *
115
+ */
116
+ let calcOrders = async(arrOhlc, orders, opt = {}) => {
117
+
118
+ //sortBy, 已或未平倉訂單一定有timeStart欄位
119
+ orders = sortBy(orders, 'timeStart')
120
+
121
+ //uIni
122
+ let uIni = get(opt, 'uIni', 1000)
123
+
124
+ //kpOhlc
125
+ let kpOhlc = {}
126
+ each(arrOhlc, (v) => {
127
+ // console.log('v', v)
128
+ // time: '2025-10-31T12:00:00',
129
+ // Open: 3829.16,
130
+ // High: 3873.68,
131
+ // Low: 3821.67,
132
+ // Close: 3831.49,
133
+ // Volumn: 56050.6433,
134
+ // CloseTime: '2025-10-31T15:59:59',
135
+ // QuoteAssetVolume: 215591315.444694,
136
+ // NumberOfTrades: 634069,
137
+ // TakerBuyBaseAssetVolume: 28908.4413,
138
+ // TakerBuyQuoteAssetVolume: 111187066.78764
139
+ kpOhlc[v['time']] = v
140
+ })
141
+ // console.log('kpOhlc', kpOhlc)
142
+
143
+ //kpOrders
144
+ let kpOrders = {}
145
+ let uEquity = uIni
146
+ let uCumuProfitOrLoss = 0
147
+ each(orders, (o, ko) => {
148
+
149
+ each(kpOhlc, (g) => {
150
+
151
+ //check, 小於等於下單時間不計算
152
+ if (g['time'] &lt;= o.timeStart) {
153
+ delete kpOhlc[g['time']]
154
+ return true //跳出換下一個
155
+ }
156
+ // console.log('size(kpOhlc)', size(kpOhlc))
157
+
158
+ if (o.mode === 'long') {
159
+
160
+ if (g.Low &lt;= o.priceStopLoss) { //先偵測出現止損
161
+ //止損
162
+ o.timeEnd = g['time']
163
+ o.priceEnd = o.priceStopLoss
164
+ o.uProfitOrLoss = (o.uTrade * (o.priceEnd / o.priceStart)) - o.uTrade - 2 * o.uFee //須扣除手續費
165
+ o.rProfitOrLoss = o.uProfitOrLoss / o.uTrade
166
+ uCumuProfitOrLoss += o.uProfitOrLoss
167
+ o.uCumuProfitOrLoss = uCumuProfitOrLoss
168
+ o.rCumuProfitOrLoss = dig((o.uCumuProfitOrLoss / uIni) * 100, 2) + '%' //單位為%
169
+ uEquity += o.uProfitOrLoss
170
+ o.uEquity = uEquity
171
+ o.modeResult = o.uProfitOrLoss &lt; 0 ? 'loss' : 'profit'
172
+ kpOrders[ko] = o
173
+ return false //跳出
174
+ }
175
+ if (g.High >= o.priceTakeProfit) { //後偵測出現止盈
176
+ //止盈
177
+ o.timeEnd = g['time']
178
+ o.priceEnd = o.priceTakeProfit
179
+ o.uProfitOrLoss = (o.uTrade * (o.priceEnd / o.priceStart)) - o.uTrade - 2 * o.uFee //須扣除手續費
180
+ o.rProfitOrLoss = o.uProfitOrLoss / o.uTrade
181
+ uCumuProfitOrLoss += o.uProfitOrLoss
182
+ o.uCumuProfitOrLoss = uCumuProfitOrLoss
183
+ o.rCumuProfitOrLoss = dig((o.uCumuProfitOrLoss / uIni) * 100, 2) + '%' //單位為%
184
+ uEquity += o.uProfitOrLoss
185
+ o.uEquity = uEquity
186
+ o.modeResult = o.uProfitOrLoss &lt; 0 ? 'loss' : 'profit'
187
+ kpOrders[ko] = o
188
+ return false //跳出
189
+ }
190
+
191
+ }
192
+ else { //short
193
+
194
+ if (g.High >= o.priceStopLoss) { //先偵測出現止損
195
+ //止損
196
+ o.timeEnd = g['time']
197
+ o.priceEnd = o.priceStopLoss
198
+ o.uProfitOrLoss = (o.priceStart - o.priceEnd) * (o.uTrade / o.priceStart) - 2 * o.uFee //須扣除手續費
199
+ o.rProfitOrLoss = o.uProfitOrLoss / o.uTrade
200
+ uCumuProfitOrLoss += o.uProfitOrLoss
201
+ o.uCumuProfitOrLoss = uCumuProfitOrLoss
202
+ o.rCumuProfitOrLoss = dig((o.uCumuProfitOrLoss / uIni) * 100, 2) + '%' //單位為%
203
+ uEquity += o.uProfitOrLoss
204
+ o.uEquity = uEquity
205
+ o.modeResult = o.uProfitOrLoss &lt; 0 ? 'loss' : 'profit'
206
+ kpOrders[ko] = o
207
+ return false //跳出
208
+ }
209
+ if (g.Low &lt;= o.priceTakeProfit) { //後偵測出現止盈
210
+ //止盈
211
+ o.timeEnd = g['time']
212
+ o.priceEnd = o.priceTakeProfit
213
+ o.uProfitOrLoss = (o.priceStart - o.priceEnd) * (o.uTrade / o.priceStart) - 2 * o.uFee //須扣除手續費
214
+ o.rProfitOrLoss = o.uProfitOrLoss / o.uTrade
215
+ uCumuProfitOrLoss += o.uProfitOrLoss
216
+ o.uCumuProfitOrLoss = uCumuProfitOrLoss
217
+ o.rCumuProfitOrLoss = dig((o.uCumuProfitOrLoss / uIni) * 100, 2) + '%' //單位為%
218
+ uEquity += o.uProfitOrLoss
219
+ o.uEquity = uEquity
220
+ o.modeResult = o.uProfitOrLoss &lt; 0 ? 'loss' : 'profit'
221
+ kpOrders[ko] = o
222
+ return false //跳出
223
+ }
224
+
225
+ }
226
+
227
+ })
228
+
229
+ })
230
+ // console.log('kpOrders', kpOrders)
231
+
232
+ if (true) {
233
+ let _orders = []
234
+ each(orders, (o, ko) => {
235
+ // console.log('o', o)
236
+ let oo = null
237
+ if (haskey(kpOrders, ko)) {
238
+ oo = kpOrders[ko]
239
+ }
240
+ else {
241
+ oo = o
242
+ }
243
+ // console.log('oo', oo)
244
+ _orders.push(oo)
245
+ })
246
+ orders = _orders
247
+ }
248
+
249
+ return orders
250
+ }
251
+
252
+
253
+ export default calcOrders
254
+ </code></pre>
255
+ </article>
256
+ </section>
257
+
258
+
259
+
260
+
261
+
262
+
263
+ </div>
264
+
265
+ <br class="clear">
266
+
267
+ <footer>
268
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Aug 02 2026 20:09:43 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
269
+ </footer>
270
+
271
+ <script>prettyPrint();</script>
272
+ <script src="scripts/polyfill.js"></script>
273
+ <script src="scripts/linenumber.js"></script>
274
+
275
+
276
+
277
+ </body>
278
+ </html>
@@ -0,0 +1,146 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+
5
+ <meta charset="utf-8">
6
+ <title>calcOrdersRatio.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#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#runStrategy">runStrategy</a></li></ul>
33
+
34
+ </nav>
35
+
36
+ <div id="main">
37
+
38
+ <h1 class="page-title">calcOrdersRatio.mjs</h1>
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+ <section>
47
+ <article>
48
+ <pre class="prettyprint source linenums"><code>import map from 'lodash-es/map.js'
49
+ import isestr from 'wsemi/src/isestr.mjs'
50
+
51
+
52
+ /**
53
+ * 計算各已平倉訂單之持倉天數與等效日盈虧比例
54
+ *
55
+ * dayHold以timeStart與timeEnd之日期差+1計算,rProfitOrLossDay為(1+rProfitOrLoss)^(1/dayHold)-1
56
+ * modeResult非有效字串(未平倉)之訂單不計算
57
+ *
58
+ * Unit Test: {@link https://github.com/yuda-lyu/w-trade-backtest/blob/master/test/unit-WTradeBacktest.test.mjs Github}
59
+ * @function
60
+ * @param {Function} ott 輸入時區時間函數,傳入時間字串回傳dayjs時間物件(可用src/ott.mjs或自行以dayjs包裝)
61
+ * @param {Array} orders 輸入已結算訂單陣列,各元素需含modeResult、timeStart、timeEnd、rProfitOrLoss欄位
62
+ * @returns {Array} 回傳附加dayHold與rProfitOrLossDay之訂單陣列
63
+ * @example
64
+ *
65
+ * let orders = calcOrdersRatio(ott, [{
66
+ * modeResult: 'profit',
67
+ * timeStart: '2020-01-01T20:00:00',
68
+ * timeEnd: '2020-01-03T04:00:00',
69
+ * rProfitOrLoss: 0.331,
70
+ * }])
71
+ * console.log(orders[0])
72
+ * // => {
73
+ * // modeResult: 'profit',
74
+ * // timeStart: '2020-01-01T20:00:00',
75
+ * // timeEnd: '2020-01-03T04:00:00',
76
+ * // rProfitOrLoss: 0.331,
77
+ * // dayHold: 3,
78
+ * // rProfitOrLossDay: 0.10000000000000009
79
+ * // }
80
+ *
81
+ */
82
+ let calcOrdersRatio = (ott, orders) => {
83
+
84
+ //計算各單持倉天數, 盈虧比例, 等效日盈虧比例
85
+ orders = map(orders, (o) => {
86
+
87
+ //未平倉訂單不計算
88
+ if (!isestr(o.modeResult)) {
89
+ return o
90
+ }
91
+
92
+ //dayHold, 持倉天數
93
+ let ts = ott(o.timeStart)
94
+ let te = ott(o.timeEnd)
95
+ let ds = ts.format('YYYY-MM-DD')
96
+ let de = te.format('YYYY-MM-DD')
97
+ let tcs = ott(ds, 'YYYY-MM-DD')
98
+ let tce = ott(de, 'YYYY-MM-DD')
99
+ let dayHold = tce.diff(tcs, 'day') + 1
100
+ o.dayHold = dayHold
101
+ // console.log('ds', ds, 'de', de, dayHold)
102
+
103
+ //rProfitOrLossDay, 等效日盈虧比例(none)
104
+ let rProfitOrLossDay = 0
105
+ if ((1 + o.rProfitOrLoss) >= 0) {
106
+ rProfitOrLossDay = Math.pow((1 + o.rProfitOrLoss), 1 / o.dayHold) - 1
107
+ }
108
+ // let rProfitOrLossDay = Math.pow((1 + o.rProfitOrLoss), 1 / o.dayHold) - 1
109
+
110
+ o.rProfitOrLossDay = rProfitOrLossDay
111
+ // console.log('rProfitOrLossDay', rProfitOrLossDay)
112
+
113
+ return o
114
+ })
115
+ // console.log('orders', orders[size(orders) - 1], size(orders))
116
+
117
+ return orders
118
+ }
119
+
120
+
121
+ export default calcOrdersRatio
122
+ </code></pre>
123
+ </article>
124
+ </section>
125
+
126
+
127
+
128
+
129
+
130
+
131
+ </div>
132
+
133
+ <br class="clear">
134
+
135
+ <footer>
136
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Aug 02 2026 20:09:43 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
137
+ </footer>
138
+
139
+ <script>prettyPrint();</script>
140
+ <script src="scripts/polyfill.js"></script>
141
+ <script src="scripts/linenumber.js"></script>
142
+
143
+
144
+
145
+ </body>
146
+ </html>