w-trade-backtest 1.0.8 → 1.1.1
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 -2
- package/dist/w-trade-backtest.umd.js.map +1 -1
- package/docs/buildKLinesTpSl.mjs.html +2 -2
- package/docs/buildStrategyFastSession.mjs.html +365 -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 +7 -4
- package/docs/calcSummary.mjs.html +2 -2
- package/docs/closeAndSummaryOrders.mjs.html +2 -2
- package/docs/genKLinesTpSl.mjs.html +2 -2
- package/docs/genReport.mjs.html +2 -2
- package/docs/genReportCore.mjs.html +2 -2
- package/docs/global.html +667 -3
- package/docs/index.html +2 -2
- package/docs/loadKLinesTpSl.mjs.html +4 -5
- package/docs/runStrategies.mjs.html +2 -2
- package/docs/runStrategiesAndBacktest.mjs.html +2 -2
- package/docs/runStrategy.mjs.html +2 -2
- package/docs/settleOrderPnl.mjs.html +100 -0
- package/package.json +1 -1
- package/src/WTradeBacktest.mjs +2 -0
- package/src/buildStrategyFastSession.mjs +293 -0
- package/src/calcOrdersSummarySimple.mjs +5 -2
- package/src/loadKLinesTpSl.mjs +2 -3
- package/src/settleOrderPnl.mjs +28 -0
- package/test/unit-WTradeBacktest.test.mjs +1 -0
- package/test/unit-buildStrategyFastSession.test.mjs +298 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* w-trade-backtest v1.
|
|
2
|
+
* w-trade-backtest v1.1.1
|
|
3
3
|
* (c) 2018-2021 yuda-lyu(semisphere)
|
|
4
4
|
* Released under the MIT License.
|
|
5
5
|
*/
|
|
6
|
-
!function(t,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r(require("path"),require("fs"),require("url")):"function"==typeof define&&define.amd?define(["path","fs","url"],r):(t="undefined"!=typeof globalThis?globalThis:t||self)["w-trade-backtest"]=r(t.path,t.fs,t.url)}(this,function(t,r,e){"use strict";var n="undefined"!=typeof document?document.currentScript:null;function o(t,r){for(var e=-1,n=null==t?0:t.length;++e<n&&!1!==r(t[e],e,t););return t}var i,u=function(t,r,e){for(var n=-1,o=Object(t),u=e(t),a=u.length;a--;){var s=u[i?a:++n];if(!1===r(o[s],s,o))break}return t};var a="object"==typeof global&&global&&global.Object===Object&&global,s="object"==typeof self&&self&&self.Object===Object&&self,f=a||s||Function("return this")(),l=f.Symbol,c=Object.prototype,d=c.hasOwnProperty,h=c.toString,p=l?l.toStringTag:void 0;var m=Object.prototype.toString;var y=l?l.toStringTag:void 0;function v(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":y&&y in Object(t)?function(t){var r=d.call(t,p),e=t[p];try{t[p]=void 0;var n=!0}catch(t){}var o=h.call(t);return n&&(r?t[p]=e:delete t[p]),o}(t):function(t){return m.call(t)}(t)}function b(t){return null!=t&&"object"==typeof t}function g(t){return b(t)&&"[object Arguments]"==v(t)}var w=Object.prototype,O=w.hasOwnProperty,j=w.propertyIsEnumerable,S=g(function(){return arguments}())?g:function(t){return b(t)&&O.call(t,"callee")&&!j.call(t,"callee")},$=S,_=Array.isArray;var E="object"==typeof exports&&exports&&!exports.nodeType&&exports,T=E&&"object"==typeof module&&module&&!module.nodeType&&module,P=T&&T.exports===E?f.Buffer:void 0,L=(P?P.isBuffer:void 0)||function(){return!1},A=/^(?:0|[1-9]\d*)$/;function M(t,r){var e=typeof t;return!!(r=null==r?9007199254740991:r)&&("number"==e||"symbol"!=e&&A.test(t))&&t>-1&&t%1==0&&t<r}function k(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}var D={};function F(t){return function(r){return t(r)}}D["[object Float32Array]"]=D["[object Float64Array]"]=D["[object Int8Array]"]=D["[object Int16Array]"]=D["[object Int32Array]"]=D["[object Uint8Array]"]=D["[object Uint8ClampedArray]"]=D["[object Uint16Array]"]=D["[object Uint32Array]"]=!0,D["[object Arguments]"]=D["[object Array]"]=D["[object ArrayBuffer]"]=D["[object Boolean]"]=D["[object DataView]"]=D["[object Date]"]=D["[object Error]"]=D["[object Function]"]=D["[object Map]"]=D["[object Number]"]=D["[object Object]"]=D["[object RegExp]"]=D["[object Set]"]=D["[object String]"]=D["[object WeakMap]"]=!1;var x="object"==typeof exports&&exports&&!exports.nodeType&&exports,C=x&&"object"==typeof module&&module&&!module.nodeType&&module,Y=C&&C.exports===x&&a.process,R=function(){try{var t=C&&C.require&&C.require("util").types;return t||Y&&Y.binding&&Y.binding("util")}catch(t){}}(),I=R&&R.isTypedArray,N=I?F(I):function(t){return b(t)&&k(t.length)&&!!D[v(t)]},q=Object.prototype.hasOwnProperty;function z(t,r){var e=_(t),n=!e&&$(t),o=!e&&!n&&L(t),i=!e&&!n&&!o&&N(t),u=e||n||o||i,a=u?function(t,r){for(var e=-1,n=Array(t);++e<t;)n[e]=r(e);return n}(t.length,String):[],s=a.length;for(var f in t)!r&&!q.call(t,f)||u&&("length"==f||o&&("offset"==f||"parent"==f)||i&&("buffer"==f||"byteLength"==f||"byteOffset"==f)||M(f,s))||a.push(f);return a}var H=Object.prototype;function U(t){var r=t&&t.constructor;return t===("function"==typeof r&&r.prototype||H)}function B(t,r){return function(e){return t(r(e))}}var W=B(Object.keys,Object),J=Object.prototype.hasOwnProperty;function V(t){if(!U(t))return W(t);var r=[];for(var e in Object(t))J.call(t,e)&&"constructor"!=e&&r.push(e);return r}function G(t){var r=typeof t;return null!=t&&("object"==r||"function"==r)}function Z(t){if(!G(t))return!1;var r=v(t);return"[object Function]"==r||"[object GeneratorFunction]"==r||"[object AsyncFunction]"==r||"[object Proxy]"==r}function K(t){return null!=t&&k(t.length)&&!Z(t)}function Q(t){return K(t)?z(t):V(t)}var X=function(t,r){return function(e,n){if(null==e)return e;if(!K(e))return t(e,n);for(var o=e.length,i=r?o:-1,u=Object(e);(r?i--:++i<o)&&!1!==n(u[i],i,u););return e}}(function(t,r){return t&&u(t,r,Q)}),tt=X;function rt(t){return t}function et(t,r){var e;return(_(t)?o:tt)(t,"function"==typeof(e=r)?e:rt)}function nt(t){return t&&t.length?t[0]:void 0}function ot(t){return"symbol"==typeof t||b(t)&&"[object Symbol]"==v(t)}var it=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,ut=/^\w*$/;function at(t,r){if(_(t))return!1;var e=typeof t;return!("number"!=e&&"symbol"!=e&&"boolean"!=e&&null!=t&&!ot(t))||(ut.test(t)||!it.test(t)||null!=r&&t in Object(r))}var st,ft=f["__core-js_shared__"],lt=(st=/[^.]+$/.exec(ft&&ft.keys&&ft.keys.IE_PROTO||""))?"Symbol(src)_1."+st:"";var ct=Function.prototype.toString;function dt(t){if(null!=t){try{return ct.call(t)}catch(t){}try{return t+""}catch(t){}}return""}var ht=/^\[object .+?Constructor\]$/,pt=Function.prototype,mt=Object.prototype,yt=pt.toString,vt=mt.hasOwnProperty,bt=RegExp("^"+yt.call(vt).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function gt(t){return!(!G(t)||(r=t,lt&< in r))&&(Z(t)?bt:ht).test(dt(t));var r}function wt(t,r){var e=function(t,r){return null==t?void 0:t[r]}(t,r);return gt(e)?e:void 0}var Ot=wt(Object,"create");var jt=Object.prototype.hasOwnProperty;var St=Object.prototype.hasOwnProperty;function $t(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r<e;){var n=t[r];this.set(n[0],n[1])}}function _t(t,r){return t===r||t!=t&&r!=r}function Et(t,r){for(var e=t.length;e--;)if(_t(t[e][0],r))return e;return-1}$t.prototype.clear=function(){this.__data__=Ot?Ot(null):{},this.size=0},$t.prototype.delete=function(t){var r=this.has(t)&&delete this.__data__[t];return this.size-=r?1:0,r},$t.prototype.get=function(t){var r=this.__data__;if(Ot){var e=r[t];return"__lodash_hash_undefined__"===e?void 0:e}return jt.call(r,t)?r[t]:void 0},$t.prototype.has=function(t){var r=this.__data__;return Ot?void 0!==r[t]:St.call(r,t)},$t.prototype.set=function(t,r){var e=this.__data__;return this.size+=this.has(t)?0:1,e[t]=Ot&&void 0===r?"__lodash_hash_undefined__":r,this};var Tt=Array.prototype.splice;function Pt(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r<e;){var n=t[r];this.set(n[0],n[1])}}Pt.prototype.clear=function(){this.__data__=[],this.size=0},Pt.prototype.delete=function(t){var r=this.__data__,e=Et(r,t);return!(e<0)&&(e==r.length-1?r.pop():Tt.call(r,e,1),--this.size,!0)},Pt.prototype.get=function(t){var r=this.__data__,e=Et(r,t);return e<0?void 0:r[e][1]},Pt.prototype.has=function(t){return Et(this.__data__,t)>-1},Pt.prototype.set=function(t,r){var e=this.__data__,n=Et(e,t);return n<0?(++this.size,e.push([t,r])):e[n][1]=r,this};var Lt=wt(f,"Map");function At(t,r){var e,n,o=t.__data__;return("string"==(n=typeof(e=r))||"number"==n||"symbol"==n||"boolean"==n?"__proto__"!==e:null===e)?o["string"==typeof r?"string":"hash"]:o.map}function Mt(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r<e;){var n=t[r];this.set(n[0],n[1])}}Mt.prototype.clear=function(){this.size=0,this.__data__={hash:new $t,map:new(Lt||Pt),string:new $t}},Mt.prototype.delete=function(t){var r=At(this,t).delete(t);return this.size-=r?1:0,r},Mt.prototype.get=function(t){return At(this,t).get(t)},Mt.prototype.has=function(t){return At(this,t).has(t)},Mt.prototype.set=function(t,r){var e=At(this,t),n=e.size;return e.set(t,r),this.size+=e.size==n?0:1,this};function kt(t,r){if("function"!=typeof t||null!=r&&"function"!=typeof r)throw new TypeError("Expected a function");var e=function(){var n=arguments,o=r?r.apply(this,n):n[0],i=e.cache;if(i.has(o))return i.get(o);var u=t.apply(this,n);return e.cache=i.set(o,u)||i,u};return e.cache=new(kt.Cache||Mt),e}kt.Cache=Mt;var Dt,Ft,xt,Ct=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Yt=/\\(\\)?/g,Rt=(Dt=function(t){var r=[];return 46===t.charCodeAt(0)&&r.push(""),t.replace(Ct,function(t,e,n,o){r.push(n?o.replace(Yt,"$1"):e||t)}),r},Ft=kt(Dt,function(t){return 500===xt.size&&xt.clear(),t}),xt=Ft.cache,Ft),It=Rt;function Nt(t,r){for(var e=-1,n=null==t?0:t.length,o=Array(n);++e<n;)o[e]=r(t[e],e,t);return o}var qt=l?l.prototype:void 0,zt=qt?qt.toString:void 0;function Ht(t){if("string"==typeof t)return t;if(_(t))return Nt(t,Ht)+"";if(ot(t))return zt?zt.call(t):"";var r=t+"";return"0"==r&&1/t==-1/0?"-0":r}function Ut(t){return null==t?"":Ht(t)}function Bt(t,r){return _(t)?t:at(t,r)?[t]:It(Ut(t))}function Wt(t){if("string"==typeof t||ot(t))return t;var r=t+"";return"0"==r&&1/t==-1/0?"-0":r}function Jt(t,r){for(var e=0,n=(r=Bt(r,t)).length;null!=t&&e<n;)t=t[Wt(r[e++])];return e&&e==n?t:void 0}function Vt(t,r,e){var n=null==t?void 0:Jt(t,r);return void 0===n?e:n}function Gt(t){var r=null==t?0:t.length;return r?t[r-1]:void 0}var Zt=wt(f,"DataView"),Kt=wt(f,"Promise"),Qt=wt(f,"Set"),Xt=wt(f,"WeakMap"),tr="[object Map]",rr="[object Promise]",er="[object Set]",nr="[object WeakMap]",or="[object DataView]",ir=dt(Zt),ur=dt(Lt),ar=dt(Kt),sr=dt(Qt),fr=dt(Xt),lr=v;(Zt&&lr(new Zt(new ArrayBuffer(1)))!=or||Lt&&lr(new Lt)!=tr||Kt&&lr(Kt.resolve())!=rr||Qt&&lr(new Qt)!=er||Xt&&lr(new Xt)!=nr)&&(lr=function(t){var r=v(t),e="[object Object]"==r?t.constructor:void 0,n=e?dt(e):"";if(n)switch(n){case ir:return or;case ur:return tr;case ar:return rr;case sr:return er;case fr:return nr}return r});var cr=lr;function dr(t){return function(r){return null==r?void 0:r[t]}}var hr=dr("length"),pr=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");function mr(t){return pr.test(t)}var yr="\\ud800-\\udfff",vr="["+yr+"]",br="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",gr="\\ud83c[\\udffb-\\udfff]",wr="[^"+yr+"]",Or="(?:\\ud83c[\\udde6-\\uddff]){2}",jr="[\\ud800-\\udbff][\\udc00-\\udfff]",Sr="(?:"+br+"|"+gr+")"+"?",$r="[\\ufe0e\\ufe0f]?",_r=$r+Sr+("(?:\\u200d(?:"+[wr,Or,jr].join("|")+")"+$r+Sr+")*"),Er="(?:"+[wr+br+"?",br,Or,jr,vr].join("|")+")",Tr=RegExp(gr+"(?="+gr+")|"+Er+_r,"g");function Pr(t){return mr(t)?function(t){for(var r=Tr.lastIndex=0;Tr.test(t);)++r;return r}(t):hr(t)}function Lr(t){if(null==t)return 0;if(K(t))return"string"==typeof(r=t)||!_(r)&&b(r)&&"[object String]"==v(r)?Pr(t):t.length;var r,e=cr(t);return"[object Map]"==e||"[object Set]"==e?t.size:V(t).length}function Ar(t){var r=this.__data__=new Pt(t);this.size=r.size}Ar.prototype.clear=function(){this.__data__=new Pt,this.size=0},Ar.prototype.delete=function(t){var r=this.__data__,e=r.delete(t);return this.size=r.size,e},Ar.prototype.get=function(t){return this.__data__.get(t)},Ar.prototype.has=function(t){return this.__data__.has(t)},Ar.prototype.set=function(t,r){var e=this.__data__;if(e instanceof Pt){var n=e.__data__;if(!Lt||n.length<199)return n.push([t,r]),this.size=++e.size,this;e=this.__data__=new Mt(n)}return e.set(t,r),this.size=e.size,this};function Mr(t){var r=-1,e=null==t?0:t.length;for(this.__data__=new Mt;++r<e;)this.add(t[r])}function kr(t,r){for(var e=-1,n=null==t?0:t.length;++e<n;)if(r(t[e],e,t))return!0;return!1}function Dr(t,r){return t.has(r)}Mr.prototype.add=Mr.prototype.push=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this},Mr.prototype.has=function(t){return this.__data__.has(t)};function Fr(t,r,e,n,o,i){var u=1&e,a=t.length,s=r.length;if(a!=s&&!(u&&s>a))return!1;var f=i.get(t),l=i.get(r);if(f&&l)return f==r&&l==t;var c=-1,d=!0,h=2&e?new Mr:void 0;for(i.set(t,r),i.set(r,t);++c<a;){var p=t[c],m=r[c];if(n)var y=u?n(m,p,c,r,t,i):n(p,m,c,t,r,i);if(void 0!==y){if(y)continue;d=!1;break}if(h){if(!kr(r,function(t,r){if(!Dr(h,r)&&(p===t||o(p,t,e,n,i)))return h.push(r)})){d=!1;break}}else if(p!==m&&!o(p,m,e,n,i)){d=!1;break}}return i.delete(t),i.delete(r),d}var xr=f.Uint8Array;function Cr(t){var r=-1,e=Array(t.size);return t.forEach(function(t,n){e[++r]=[n,t]}),e}function Yr(t){var r=-1,e=Array(t.size);return t.forEach(function(t){e[++r]=t}),e}var Rr=l?l.prototype:void 0,Ir=Rr?Rr.valueOf:void 0;function Nr(t,r){for(var e=-1,n=r.length,o=t.length;++e<n;)t[o+e]=r[e];return t}function qr(t,r,e){var n=r(t);return _(t)?n:Nr(n,e(t))}function zr(t,r){for(var e=-1,n=null==t?0:t.length,o=0,i=[];++e<n;){var u=t[e];r(u,e,t)&&(i[o++]=u)}return i}function Hr(){return[]}var Ur=Object.prototype.propertyIsEnumerable,Br=Object.getOwnPropertySymbols,Wr=Br?function(t){return null==t?[]:(t=Object(t),zr(Br(t),function(r){return Ur.call(t,r)}))}:Hr;function Jr(t){return qr(t,Q,Wr)}var Vr=Object.prototype.hasOwnProperty;var Gr="[object Arguments]",Zr="[object Array]",Kr="[object Object]",Qr=Object.prototype.hasOwnProperty;function Xr(t,r,e,n,o,i){var u=_(t),a=_(r),s=u?Zr:cr(t),f=a?Zr:cr(r),l=(s=s==Gr?Kr:s)==Kr,c=(f=f==Gr?Kr:f)==Kr,d=s==f;if(d&&L(t)){if(!L(r))return!1;u=!0,l=!1}if(d&&!l)return i||(i=new Ar),u||N(t)?Fr(t,r,e,n,o,i):function(t,r,e,n,o,i,u){switch(e){case"[object DataView]":if(t.byteLength!=r.byteLength||t.byteOffset!=r.byteOffset)return!1;t=t.buffer,r=r.buffer;case"[object ArrayBuffer]":return!(t.byteLength!=r.byteLength||!i(new xr(t),new xr(r)));case"[object Boolean]":case"[object Date]":case"[object Number]":return _t(+t,+r);case"[object Error]":return t.name==r.name&&t.message==r.message;case"[object RegExp]":case"[object String]":return t==r+"";case"[object Map]":var a=Cr;case"[object Set]":var s=1&n;if(a||(a=Yr),t.size!=r.size&&!s)return!1;var f=u.get(t);if(f)return f==r;n|=2,u.set(t,r);var l=Fr(a(t),a(r),n,o,i,u);return u.delete(t),l;case"[object Symbol]":if(Ir)return Ir.call(t)==Ir.call(r)}return!1}(t,r,s,e,n,o,i);if(!(1&e)){var h=l&&Qr.call(t,"__wrapped__"),p=c&&Qr.call(r,"__wrapped__");if(h||p){var m=h?t.value():t,y=p?r.value():r;return i||(i=new Ar),o(m,y,e,n,i)}}return!!d&&(i||(i=new Ar),function(t,r,e,n,o,i){var u=1&e,a=Jr(t),s=a.length;if(s!=Jr(r).length&&!u)return!1;for(var f=s;f--;){var l=a[f];if(!(u?l in r:Vr.call(r,l)))return!1}var c=i.get(t),d=i.get(r);if(c&&d)return c==r&&d==t;var h=!0;i.set(t,r),i.set(r,t);for(var p=u;++f<s;){var m=t[l=a[f]],y=r[l];if(n)var v=u?n(y,m,l,r,t,i):n(m,y,l,t,r,i);if(!(void 0===v?m===y||o(m,y,e,n,i):v)){h=!1;break}p||(p="constructor"==l)}if(h&&!p){var b=t.constructor,g=r.constructor;b==g||!("constructor"in t)||!("constructor"in r)||"function"==typeof b&&b instanceof b&&"function"==typeof g&&g instanceof g||(h=!1)}return i.delete(t),i.delete(r),h}(t,r,e,n,o,i))}function te(t,r,e,n,o){return t===r||(null==t||null==r||!b(t)&&!b(r)?t!=t&&r!=r:Xr(t,r,e,n,te,o))}function re(t){return t==t&&!G(t)}function ee(t,r){return function(e){return null!=e&&(e[t]===r&&(void 0!==r||t in Object(e)))}}function ne(t){var r=function(t){for(var r=Q(t),e=r.length;e--;){var n=r[e],o=t[n];r[e]=[n,o,re(o)]}return r}(t);return 1==r.length&&r[0][2]?ee(r[0][0],r[0][1]):function(e){return e===t||function(t,r,e,n){var o=e.length,i=o,u=!n;if(null==t)return!i;for(t=Object(t);o--;){var a=e[o];if(u&&a[2]?a[1]!==t[a[0]]:!(a[0]in t))return!1}for(;++o<i;){var s=(a=e[o])[0],f=t[s],l=a[1];if(u&&a[2]){if(void 0===f&&!(s in t))return!1}else{var c=new Ar;if(n)var d=n(f,l,s,t,r,c);if(!(void 0===d?te(l,f,3,n,c):d))return!1}}return!0}(e,t,r)}}function oe(t,r){return null!=t&&r in Object(t)}function ie(t,r){return null!=t&&function(t,r,e){for(var n=-1,o=(r=Bt(r,t)).length,i=!1;++n<o;){var u=Wt(r[n]);if(!(i=null!=t&&e(t,u)))break;t=t[u]}return i||++n!=o?i:!!(o=null==t?0:t.length)&&k(o)&&M(u,o)&&(_(t)||$(t))}(t,r,oe)}function ue(t){return at(t)?dr(Wt(t)):function(t){return function(r){return Jt(r,t)}}(t)}function ae(t){return"function"==typeof t?t:null==t?rt:"object"==typeof t?_(t)?function(t,r){return at(t)&&re(r)?ee(Wt(t),r):function(e){var n=Vt(e,t);return void 0===n&&n===r?ie(e,t):te(r,n,3)}}(t[0],t[1]):ne(t):ue(t)}function se(t,r){var e=-1,n=K(t)?Array(t.length):[];return tt(t,function(t,o,i){n[++e]=r(t,o,i)}),n}function fe(t,r){return(_(t)?Nt:se)(t,ae(r))}var le=l?l.isConcatSpreadable:void 0;function ce(t){return _(t)||$(t)||!!(le&&t&&t[le])}function de(t,r,e,n,o){var i=-1,u=t.length;for(e||(e=ce),o||(o=[]);++i<u;){var a=t[i];r>0&&e(a)?r>1?de(a,r-1,e,n,o):Nr(o,a):n||(o[o.length]=a)}return o}function he(t,r){if(t!==r){var e=void 0!==t,n=null===t,o=t==t,i=ot(t),u=void 0!==r,a=null===r,s=r==r,f=ot(r);if(!a&&!f&&!i&&t>r||i&&u&&s&&!a&&!f||n&&u&&s||!e&&s||!o)return 1;if(!n&&!i&&!f&&t<r||f&&e&&o&&!n&&!i||a&&e&&o||!u&&o||!s)return-1}return 0}function pe(t,r,e){r=r.length?Nt(r,function(t){return _(t)?function(r){return Jt(r,1===t.length?t[0]:t)}:t}):[rt];var n=-1;return r=Nt(r,F(ae)),function(t,r){var e=t.length;for(t.sort(r);e--;)t[e]=t[e].value;return t}(se(t,function(t,e,o){return{criteria:Nt(r,function(r){return r(t)}),index:++n,value:t}}),function(t,r){return function(t,r,e){for(var n=-1,o=t.criteria,i=r.criteria,u=o.length,a=e.length;++n<u;){var s=he(o[n],i[n]);if(s)return n>=a?s:s*("desc"==e[n]?-1:1)}return t.index-r.index}(t,r,e)})}var me=Math.max;var ye=function(){try{var t=wt(Object,"defineProperty");return t({},"",{}),t}catch(t){}}(),ve=ye,be=ve?function(t,r){return ve(t,"toString",{configurable:!0,enumerable:!1,value:(e=r,function(){return e}),writable:!0});var e}:rt,ge=be,we=Date.now;var Oe=function(t){var r=0,e=0;return function(){var n=we(),o=16-(n-e);if(e=n,o>0){if(++r>=800)return arguments[0]}else r=0;return t.apply(void 0,arguments)}}(ge),je=Oe;function Se(t,r,e){if(!G(e))return!1;var n=typeof r;return!!("number"==n?K(e)&&M(r,e.length):"string"==n&&r in e)&&_t(e[r],t)}var $e=function(t,r){return je(function(t,r,e){return r=me(void 0===r?t.length-1:r,0),function(){for(var n=arguments,o=-1,i=me(n.length-r,0),u=Array(i);++o<i;)u[o]=n[r+o];o=-1;for(var a=Array(r+1);++o<r;)a[o]=n[o];return a[r]=e(u),function(t,r,e){switch(e.length){case 0:return t.call(r);case 1:return t.call(r,e[0]);case 2:return t.call(r,e[0],e[1]);case 3:return t.call(r,e[0],e[1],e[2])}return t.apply(r,e)}(t,this,a)}}(t,r,rt),t+"")}(function(t,r){if(null==t)return[];var e=r.length;return e>1&&Se(t,r[0],r[1])?r=[]:e>2&&Se(r[0],r[1],r[2])&&(r=[r[0]]),pe(t,de(r,1),[])}),_e=$e;function Ee(t,r,e){"__proto__"==r&&ve?ve(t,r,{configurable:!0,enumerable:!0,value:e,writable:!0}):t[r]=e}var Te=Object.prototype.hasOwnProperty;function Pe(t,r,e){var n=t[r];Te.call(t,r)&&_t(n,e)&&(void 0!==e||r in t)||Ee(t,r,e)}function Le(t,r,e,n){var o=!e;e||(e={});for(var i=-1,u=r.length;++i<u;){var a=r[i],s=n?n(e[a],t[a],a,e,t):void 0;void 0===s&&(s=t[a]),o?Ee(e,a,s):Pe(e,a,s)}return e}var Ae=Object.prototype.hasOwnProperty;function Me(t){if(!G(t))return function(t){var r=[];if(null!=t)for(var e in Object(t))r.push(e);return r}(t);var r=U(t),e=[];for(var n in t)("constructor"!=n||!r&&Ae.call(t,n))&&e.push(n);return e}function ke(t){return K(t)?z(t,!0):Me(t)}var De="object"==typeof exports&&exports&&!exports.nodeType&&exports,Fe=De&&"object"==typeof module&&module&&!module.nodeType&&module,xe=Fe&&Fe.exports===De?f.Buffer:void 0,Ce=xe?xe.allocUnsafe:void 0;var Ye=B(Object.getPrototypeOf,Object),Re=Object.getOwnPropertySymbols?function(t){for(var r=[];t;)Nr(r,Wr(t)),t=Ye(t);return r}:Hr,Ie=Re;function Ne(t){return qr(t,ke,Ie)}var qe=Object.prototype.hasOwnProperty;function ze(t){var r=new t.constructor(t.byteLength);return new xr(r).set(new xr(t)),r}var He=/\w*$/;var Ue=l?l.prototype:void 0,Be=Ue?Ue.valueOf:void 0;function We(t,r,e){var n,o=t.constructor;switch(r){case"[object ArrayBuffer]":return ze(t);case"[object Boolean]":case"[object Date]":return new o(+t);case"[object DataView]":return function(t,r){var e=r?ze(t.buffer):t.buffer;return new t.constructor(e,t.byteOffset,t.byteLength)}(t,e);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return function(t,r){var e=r?ze(t.buffer):t.buffer;return new t.constructor(e,t.byteOffset,t.length)}(t,e);case"[object Map]":case"[object Set]":return new o;case"[object Number]":case"[object String]":return new o(t);case"[object RegExp]":return function(t){var r=new t.constructor(t.source,He.exec(t));return r.lastIndex=t.lastIndex,r}(t);case"[object Symbol]":return n=t,Be?Object(Be.call(n)):{}}}var Je=Object.create,Ve=function(){function t(){}return function(r){if(!G(r))return{};if(Je)return Je(r);t.prototype=r;var e=new t;return t.prototype=void 0,e}}(),Ge=Ve;var Ze=R&&R.isMap,Ke=Ze?F(Ze):function(t){return b(t)&&"[object Map]"==cr(t)};var Qe=R&&R.isSet,Xe=Qe?F(Qe):function(t){return b(t)&&"[object Set]"==cr(t)},tn="[object Arguments]",rn="[object Function]",en="[object Object]",nn={};function on(t,r,e,n,i,u){var a,s=1&r,f=2&r,l=4&r;if(e&&(a=i?e(t,n,i,u):e(t)),void 0!==a)return a;if(!G(t))return t;var c=_(t);if(c){if(a=function(t){var r=t.length,e=new t.constructor(r);return r&&"string"==typeof t[0]&&qe.call(t,"index")&&(e.index=t.index,e.input=t.input),e}(t),!s)return function(t,r){var e=-1,n=t.length;for(r||(r=Array(n));++e<n;)r[e]=t[e];return r}(t,a)}else{var d=cr(t),h=d==rn||"[object GeneratorFunction]"==d;if(L(t))return function(t,r){if(r)return t.slice();var e=t.length,n=Ce?Ce(e):new t.constructor(e);return t.copy(n),n}(t,s);if(d==en||d==tn||h&&!i){if(a=f||h?{}:function(t){return"function"!=typeof t.constructor||U(t)?{}:Ge(Ye(t))}(t),!s)return f?function(t,r){return Le(t,Ie(t),r)}(t,function(t,r){return t&&Le(r,ke(r),t)}(a,t)):function(t,r){return Le(t,Wr(t),r)}(t,function(t,r){return t&&Le(r,Q(r),t)}(a,t))}else{if(!nn[d])return i?t:{};a=We(t,d,s)}}u||(u=new Ar);var p=u.get(t);if(p)return p;u.set(t,a),Xe(t)?t.forEach(function(n){a.add(on(n,r,e,n,t,u))}):Ke(t)&&t.forEach(function(n,o){a.set(o,on(n,r,e,o,t,u))});var m=c?void 0:(l?f?Ne:Jr:f?ke:Q)(t);return o(m||t,function(n,o){m&&(n=t[o=n]),Pe(a,o,on(n,r,e,o,t,u))}),a}nn[tn]=nn["[object Array]"]=nn["[object ArrayBuffer]"]=nn["[object DataView]"]=nn["[object Boolean]"]=nn["[object Date]"]=nn["[object Float32Array]"]=nn["[object Float64Array]"]=nn["[object Int8Array]"]=nn["[object Int16Array]"]=nn["[object Int32Array]"]=nn["[object Map]"]=nn["[object Number]"]=nn[en]=nn["[object RegExp]"]=nn["[object Set]"]=nn["[object String]"]=nn["[object Symbol]"]=nn["[object Uint8Array]"]=nn["[object Uint8ClampedArray]"]=nn["[object Uint16Array]"]=nn["[object Uint32Array]"]=!0,nn["[object Error]"]=nn[rn]=nn["[object WeakMap]"]=!1;function un(t){return"[object Array]"===Object.prototype.toString.call(t)}function an(t){return"[object Object]"===Object.prototype.toString.call(t)}function sn(t){return"[object String]"===Object.prototype.toString.call(t)}function fn(t){return t!=t}function ln(t){return!!function(t){return"[object Undefined]"===Object.prototype.toString.call(t)}(t)||(!!function(t){return"[object Null]"===Object.prototype.toString.call(t)}(t)||(!!function(t){if(an(t)){for(let r in t)return!1;return!0}return!1}(t)||(!!function(t){return!(!sn(t)||""!==t)}(t)||(!!function(t){return!!un(t)&&0===t.length}(t)||!!fn(t)))))}function cn(t){return!!un(t)&&(0!==t.length&&(1!==t.length||!ln(t[0])))}function dn(t){return!(!sn(t)||""===t)}function hn(t){return!0===(r=t)||!1===r||b(r)&&"[object Boolean]"==v(r);var r}function pn(t){let r=!1;if(dn(t))r=!isNaN(Number(t));else if(function(t){return"[object Number]"===Object.prototype.toString.call(t)}(t)){if(fn(t))return!1;r=!0}return r}var mn=/\s/;var yn=/^\s+/;function vn(t){return t?t.slice(0,function(t){for(var r=t.length;r--&&mn.test(t.charAt(r)););return r}(t)+1).replace(yn,""):t}var bn=/^[-+]0x[0-9a-f]+$/i,gn=/^0b[01]+$/i,wn=/^0o[0-7]+$/i,On=parseInt;function jn(t){if("number"==typeof t)return t;if(ot(t))return NaN;if(G(t)){var r="function"==typeof t.valueOf?t.valueOf():t;t=G(r)?r+"":r}if("string"!=typeof t)return 0===t?t:+t;t=vn(t);var e=gn.test(t);return e||wn.test(t)?On(t.slice(2),e?2:8):bn.test(t)?NaN:+t}var Sn=1/0;function $n(t){return t?(t=jn(t))===Sn||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0}function _n(t){if(!pn(t))return 0;return $n(t)}function En(t){if(!(dn(t)||pn(t)||ot(t)||function(t){return"[object BigInt]"===Object.prototype.toString.call(t)}(t)))return"";let r="";try{r=String(t)}catch(t){}try{r=t.toString()}catch(t){}return r}function Tn(t,r,e){var n=-1,o=t.length;r<0&&(r=-r>o?0:o+r),(e=e>o?o:e)<0&&(e+=o),o=r>e?0:e-r>>>0,r>>>=0;for(var i=Array(o);++n<o;)i[n]=t[n+r];return i}function Pn(t,r,e){var n=t.length;return e=void 0===e?n:e,!r&&e>=n?t:Tn(t,r,e)}function Ln(t,r,e,n){for(var o=t.length,i=e+(n?1:-1);n?i--:++i<o;)if(r(t[i],i,t))return i;return-1}function An(t){return t!=t}function Mn(t,r,e){return r==r?function(t,r,e){for(var n=e-1,o=t.length;++n<o;)if(t[n]===r)return n;return-1}(t,r,e):Ln(t,An,e)}var kn="\\ud800-\\udfff",Dn="["+kn+"]",Fn="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",xn="\\ud83c[\\udffb-\\udfff]",Cn="[^"+kn+"]",Yn="(?:\\ud83c[\\udde6-\\uddff]){2}",Rn="[\\ud800-\\udbff][\\udc00-\\udfff]",In="(?:"+Fn+"|"+xn+")"+"?",Nn="[\\ufe0e\\ufe0f]?",qn=Nn+In+("(?:\\u200d(?:"+[Cn,Yn,Rn].join("|")+")"+Nn+In+")*"),zn="(?:"+[Cn+Fn+"?",Fn,Yn,Rn,Dn].join("|")+")",Hn=RegExp(xn+"(?="+xn+")|"+zn+qn,"g");function Un(t){return mr(t)?function(t){return t.match(Hn)||[]}(t):function(t){return t.split("")}(t)}function Bn(t,r,e){if((t=Ut(t))&&(e||void 0===r))return vn(t);if(!t||!(r=Ht(r)))return t;var n=Un(t),o=Un(r),i=function(t,r){for(var e=-1,n=t.length;++e<n&&Mn(r,t[e],0)>-1;);return e}(n,o),u=function(t,r){for(var e=t.length;e--&&Mn(r,t[e],0)>-1;);return e}(n,o)+1;return Pn(n,i,u).join("")}function Wn(t){var r=$n(t),e=r%1;return r==r?e?r-e:r:0}function Jn(t,r,e){var n=null==t?0:t.length;return n?Tn(t,(r=e||void 0===r?1:Wn(r))<0?0:r,n):[]}var Vn=Array.prototype.reverse;function Gn(t){return!!pn(t)&&(t=_n(t),"number"==typeof(r=t)&&r==Wn(r));var r}var Zn=f.isFinite,Kn=Math.min;var Qn=function(t){var r=Math[t];return function(t,e){if(t=jn(t),(e=null==e?0:Kn(Wn(e),292))&&Zn(t)){var n=(Ut(t)+"e").split("e");return+((n=(Ut(r(n[0]+"e"+(+n[1]+e)))+"e").split("e"))[0]+"e"+(+n[1]-e))}return r(t)}}("round"),Xn=Qn;function to(t){if(!pn(t))return 0;t=_n(t);let r=Xn(t);return"0"===String(r)?0:r}function ro(t){if(!Gn(t))return!1;return to(t)>=0}function eo(t,r){if(!dn(t))return"";if(!ro(r))return"";if(0===(r=to(r)))return"";let e=t.length-r;return e<0&&(e=0),t.substring(e,e+r)}function no(t,r){return dn(t)&&ro(r)?0===(r=to(r))?t:eo(t,t.length-r):""}function oo(t,r){return dn(t)&&ro(r)?0===(r=to(r))?t:function(t,r){return dn(t)&&ro(r)?0===(r=to(r))?"":t.substring(0,r):""}(t,t.length-r):""}function io(t,r={}){let e=Vt(r,"excludeString");if(hn(e)||(e=!1),!dn(t))return"";let n=t=>t>="0"&&t<="9"||"."===t||"-"===t||"+"===t,o=Bn(t);if(e){let t=o.split("");for(let r=0;r<t.length;r++)if(n(t[r])){o=no(o,r),t=Jn(t,r);break}t=null==(i=t)?i:Vn.call(i);for(let r=0;r<t.length;r++)if(n(t[r])){o=oo(o,r);break}}var i;return o}function uo(t){let r=0,e=0,n=0,o=Lr(t);et(t,t=>{pn(t)?r+=1:sn(t)?e+=1:an(t)&&(n+=1)});let i="";return r===o?i="num":e===o?i="str":n===o?i="obj":r+e===o?i="str":console.log("eles in array are non-homogeneous",t),i}function ao(t,r,e={}){let n=[];if("num"!==r&&"str"!==r&&"files"!==r)throw new Error(`invalid type[${r}]`);if("num"===r)n=fe(t,(t,r)=>({key:r,payload:t,value:_n(t)}));else if("files"===r)n=fe(t,(t,r)=>({key:r,payload:t,value:En(t)}));else if("str"===r){let r=fe(t,t=>io(t,{excludeString:!0})),e=0;et(r,t=>{pn(t)&&e++});let o=e===Lr(r);n=fe(t,(t,e)=>{let n=t;return o?(n=r[e],n=_n(n)):n=En(n),{key:e,payload:t,value:n}})}return n}function so(t,r){let e=on(t,5);return e.sort((t,e)=>t[r].localeCompare(e[r],"standard",{numeric:!0})),e}function fo(t,r){let e=_e(t,"value");return fe(e,r?"key":"payload")}function lo(t,r){let e=so(t,"value");return fe(e,r?"key":"payload")}function co(t,r){return!!an(t)&&(!(!dn(r)&&!pn(r))&&r in t)}function ho(t){if(an(t)){for(let r in t)return!0;return!1}return!1}function po(t){let r=Object.prototype.toString.call(t);return"[object Function]"===r||"[object AsyncFunction]"===r}function mo(t,r){let e=function(){let t,r,e=new Promise(function(){t=arguments[0],r=arguments[1]});return e.resolve=t,e.reject=r,e}();if(!un(t)&&!an(t))return e.reject("rs is not an array or object"),e;let n=!1;if(an(t)){n=!0;let r=[];et(t,(t,e)=>{r.push({k:e,v:t})}),t=r}po(r)||(r=function(t){return t});let o=-1,i=[];return t.reduce(function(t,e){return t.then(function(t){i.push(t),o+=1;let u=o,a=e;return n&&(u=e.k,a=e.v),po(r)?r(a,u):a})},Promise.resolve()).then(function(t){i.push(t),i=Jn(i),e.resolve(i)}).catch(function(t){e.reject(t)}),e}function yo(t,r=0){if(!pn(t))return"";if(!ro(r))return"";return t=_n(t),Xn(t,r).toFixed(r)}let vo=async(t,r,e={})=>{r=_e(r,"timeStart");let n=Vt(e,"uIni",1e3),o={};et(t,t=>{o[t.time]=t});let i={},u=n,a=0;et(r,(t,r)=>{et(o,e=>{if(e.time<=t.timeStart)return delete o[e.time],!0;if("long"===t.mode){if(e.Low<=t.priceStopLoss)return t.timeEnd=e.time,t.priceEnd=t.priceStopLoss,t.uProfitOrLoss=t.uTrade*(t.priceEnd/t.priceStart)-t.uTrade-2*t.uFee,t.rProfitOrLoss=t.uProfitOrLoss/t.uTrade,a+=t.uProfitOrLoss,t.uCumuProfitOrLoss=a,t.rCumuProfitOrLoss=yo(t.uCumuProfitOrLoss/n*100,2)+"%",u+=t.uProfitOrLoss,t.uEquity=u,t.modeResult=t.uProfitOrLoss<0?"loss":"profit",i[r]=t,!1;if(e.High>=t.priceTakeProfit)return t.timeEnd=e.time,t.priceEnd=t.priceTakeProfit,t.uProfitOrLoss=t.uTrade*(t.priceEnd/t.priceStart)-t.uTrade-2*t.uFee,t.rProfitOrLoss=t.uProfitOrLoss/t.uTrade,a+=t.uProfitOrLoss,t.uCumuProfitOrLoss=a,t.rCumuProfitOrLoss=yo(t.uCumuProfitOrLoss/n*100,2)+"%",u+=t.uProfitOrLoss,t.uEquity=u,t.modeResult=t.uProfitOrLoss<0?"loss":"profit",i[r]=t,!1}else{if(e.High>=t.priceStopLoss)return t.timeEnd=e.time,t.priceEnd=t.priceStopLoss,t.uProfitOrLoss=(t.priceStart-t.priceEnd)*(t.uTrade/t.priceStart)-2*t.uFee,t.rProfitOrLoss=t.uProfitOrLoss/t.uTrade,a+=t.uProfitOrLoss,t.uCumuProfitOrLoss=a,t.rCumuProfitOrLoss=yo(t.uCumuProfitOrLoss/n*100,2)+"%",u+=t.uProfitOrLoss,t.uEquity=u,t.modeResult=t.uProfitOrLoss<0?"loss":"profit",i[r]=t,!1;if(e.Low<=t.priceTakeProfit)return t.timeEnd=e.time,t.priceEnd=t.priceTakeProfit,t.uProfitOrLoss=(t.priceStart-t.priceEnd)*(t.uTrade/t.priceStart)-2*t.uFee,t.rProfitOrLoss=t.uProfitOrLoss/t.uTrade,a+=t.uProfitOrLoss,t.uCumuProfitOrLoss=a,t.rCumuProfitOrLoss=yo(t.uCumuProfitOrLoss/n*100,2)+"%",u+=t.uProfitOrLoss,t.uEquity=u,t.modeResult=t.uProfitOrLoss<0?"loss":"profit",i[r]=t,!1}})});{let t=[];et(r,(r,e)=>{let n=null;n=co(i,e)?i[e]:r,t.push(n)}),r=t}return r},bo=(t,r)=>r=fe(r,r=>{if(!dn(r.modeResult))return r;let e=t(r.timeStart),n=t(r.timeEnd),o=e.format("YYYY-MM-DD"),i=n.format("YYYY-MM-DD"),u=t(o,"YYYY-MM-DD"),a=t(i,"YYYY-MM-DD").diff(u,"day")+1;r.dayHold=a;let s=0;return 1+r.rProfitOrLoss>=0&&(s=Math.pow(1+r.rProfitOrLoss,1/r.dayHold)-1),r.rProfitOrLossDay=s,r});function go(t,r){var e=[];return tt(t,function(t,n,o){r(t,n,o)&&e.push(t)}),e}function wo(t,r){return(_(t)?zr:go)(t,ae(r))}function Oo(t){return"number"==typeof t||b(t)&&"[object Number]"==v(t)}function jo(t){if(!pn(t))return!1;return _n(t)>0}let So=(t,r,e,n,o)=>{if(!jo(r))throw new Error(`uIni[${r}] is not a positive number`);if(!dn(n))throw new Error(`invalid timeOhlcStart[${n}]`);if(!dn(o))throw new Error(`invalid timeOhlcEnd[${o}]`);e=_e(e,"timeStart");let i=[],u=[];et(e,t=>{dn(t.modeResult)?i.push(t):u.push(t)});let a=Lr(e),s=Lr(i),f=Lr(u),l=yo(Lr(wo(e,{modeResult:"profit"}))/s*100,2)+"%",c=0,d="",h="",p=0,m="",y="",v="",b=0,g="",w=0,O=0,j=r,S=r,$={},_={};et(e,t=>{if(dn(t.modeResult)){j=Math.max(j,t.uEquity);let r=j-t.uEquity,e=yo(r/j*100,2)+"%";r>c&&(c=r,S=j,d=e)}{let r=null;r=1,dn(t.timeStart)&&(co($,t.timeStart)||($[t.timeStart]=0),$[t.timeStart]+=r*t.uTrade,co(_,t.timeStart)||(_[t.timeStart]=0),_[t.timeStart]+=1),dn(t.timeEnd)&&(co($,t.timeEnd)||($[t.timeEnd]=0),$[t.timeEnd]-=r*t.uTrade,co(_,t.timeEnd)||(_[t.timeEnd]=0),_[t.timeEnd]-=1)}});{let t=[];et($,(r,e)=>{if(!Oo(r))throw console.log("time",e),new Error(`invalid uTradeAll[${r}]`);t.push({time:e,uTradeAll:r})}),t=_e(t,"time");let r=0,e=fe(t,t=>(r+=t.uTradeAll,{...t,uAccm:r})),n={};et(e,t=>{n[t.time]=t.uAccm}),$=n}{let t=[];et(_,(r,e)=>{if(!Oo(r))throw console.log("time",e),new Error(`invalid numTradeAll[${r}]`);t.push({time:e,numTradeAll:r})}),t=_e(t,"time");let r=0,e=fe(t,t=>(r+=t.numTradeAll,{...t,nAccm:r})),n={};et(e,t=>{n[t.time]=t.nAccm}),_=n}e=fe(e,t=>{let e=Vt($,t.timeStart,null);if(!Oo(e))throw new Error("invalid uTradeAll");e=Math.abs(e),t.uTradeAll=e;let n=yo(t.uTradeAll/r*100,2)+"%";t.rTradeAll=n,b<t.uTradeAll&&(b=t.uTradeAll,g=t.rTradeAll);let o=Vt(_,t.timeStart,null);if(!Oo(o))throw new Error("invalid numTradeAll");return t.numTradeAll=o,w<t.numTradeAll&&(w=t.numTradeAll),t});{let t=Lr(i)-1;p=Vt(i,`${t}.uEquity`,""),m=Vt(i,`${t}.uCumuProfitOrLoss`,""),y=Vt(i,`${t}.rCumuProfitOrLoss`,"")}{let t;t=S-r+b>0?c/(S-r+b):0,h=yo(100*t,2)+"%"}v=b>0&&Oo(m)?m/b:0,v=yo(100*v,2)+"%";{let t=0,r=0,e=0,n=0;et(i,t=>{let r=t.rProfitOrLossDay*t.dayHold;e+=r;let o=t.dayHold;n+=o}),n>0&&(t=e/n);let o=0;et(i,r=>{let e=r.rProfitOrLossDay-t,n=r.dayHold*(e*e);o+=n}),n>1&&(r=Math.sqrt(o/(n-1))),r>0&&(O=t/r*Math.sqrt(252)),O<-10&&(O=-10),O>10&&(O=10)}let E=t(n),T=t(o).diff(E,"day"),P=T/365,L="";{let t;t=0===r||0===P?0:(p-r)/r/P,L=`${yo(100*t,2)}%`}let A="";{let t;t=0===b||0===P?0:(p-r)/b/P,A=`${yo(100*t,2)}%`}return{btDays:T,btYears:yo(P,1),numTrade:a,numTradeFin:s,numTradeUnsettled:f,uTradeAllMax:b,rTradeAllMax:g,numTradeAllMax:w,uDrawdownMax:c,rDrawdownMax:d,rEquivalentDrawdownMax:h,rSharpe:O,rWin:l,uEquityFinal:p,uCumuProfitOrLossFinal:m,rCumuProfitOrLossFinal:y,rCumuProfitOrLossFinalNormYear:L,rEquivalentCumuProfitOrLossFinal:v,rEquivalentCumuProfitOrLossFinalNormYear:A}},$o=async(t,r,e,n={})=>{let o=Vt(r,"mode","");if("long"!==o&&"short"!==o)throw new Error(`invalid strategy.mode[${o}] not 'long' or 'short'`);let i=Vt(r,"keyOhlc","");if(!dn(i))throw new Error("invalid strategy.keyOhlc");let u=Vt(r,"conds",[]);if(!cn(u))throw new Error("invalid strategy.conds");let a=Lr(u),s=Vt(r,"settings",{});if(ho(s)||(s={uIni:1e3,uTrade:1,rTakeProfit:.05,rStopLoss:.03,rFee:5e-4}),!po(e))throw new Error("funGetSeries is not a function");let f=Vt(n,"withCalcOrderProfitOrLoss",!0),l=Vt(n,"withSummary",!0),c=await e(i),d={},h={};await mo(u,async t=>{let r=await e(t.key);co(h,t.key)||(h[t.key]={}),et(r,r=>{h[t.key][r.time]=r.param,co(d,r.time)||(d[r.time]=0),d[r.time]+=1})});let p=[];et(d,(t,r)=>{t===a&&p.push(r)}),p=function(t,r={}){if(!cn(t))return[];if(1===Lr(t))return t;let e=Vt(r,"localeCompare");hn(e)||(e=!1);let n=Vt(r,"returnIndex");hn(n)||(n=!1);let o=Vt(r,"compareKey",null),i=null;i=e?lo:fo;let u,a=uo(t);if(""===a)return[];if("obj"===a){if(!dn(o))return[];let a=fe(t,(t,r)=>Vt(t,o,"")),s=uo(a);if("num"!==s&&"str"!==s)return[];{e&&(s="files");let o=i(ao(a,s,r),!0);u=n?o:fe(o,r=>t[r])}}else"num"!==a&&"str"!==a||(e&&(a="files"),u=i(ao(t,a,r),n));return u}(p);let m={};et(p,t=>{m[t]=!0});let y={};et(p,t=>{y[t]={},et(u,r=>{y[t][r.key]=h[r.key][t]})});let v=Vt(nt(c),"time",""),b=Vt(Gt(c),"time",""),g=[];await mo(c,async t=>{let r=Vt(t,"time");if(!co(m,r))return!0;let e=!0;{let t=[];et(u,(e,n)=>{let o=y[r][e.key],i=Vt(e,"sym",">"),u=Vt(e,"th",0),a=Vt(e,"opr",null);"and"!==a&&"or"!==a&&(a="and");let s=!1;s=">"===i?o>u:o<u,t.push({opr:a,b:s})});let n=t.filter(t=>"and"===t.opr).every(t=>t.b),o=t.filter(t=>"or"===t.opr),i=0===o.length||o.some(t=>t.b);e=n&&i}let n=!1,i=!1;if(e&&("long"===o?n=!0:i=!0),n){let e={mode:"long",timeStart:r,priceStart:t.Close,uTrade:s.uTrade,rTakeProfit:s.rTakeProfit,priceTakeProfit:(1+s.rTakeProfit)*t.Close,rStopLoss:s.rStopLoss,priceStopLoss:(1-s.rStopLoss)*t.Close,timeEnd:"",priceEnd:"",modeResult:"",rFee:s.rFee,uFee:s.rFee*s.uTrade,uProfitOrLoss:"",rProfitOrLoss:"",uCumuProfitOrLoss:"",rCumuProfitOrLoss:"",uEquity:"",uTradeAll:"",rTradeAll:""};g.push(e)}else if(i){let e={mode:"short",timeStart:r,priceStart:t.Close,uTrade:s.uTrade,rTakeProfit:s.rTakeProfit,priceTakeProfit:(1-s.rTakeProfit)*t.Close,rStopLoss:s.rStopLoss,priceStopLoss:(1+s.rStopLoss)*t.Close,timeEnd:"",priceEnd:"",modeResult:"",rFee:s.rFee,uFee:s.rFee*s.uTrade,uProfitOrLoss:"",rProfitOrLoss:"",uCumuProfitOrLoss:"",rCumuProfitOrLoss:"",uEquity:"",uTradeAll:"",rTradeAll:""};g.push(e)}}),f&&(g=await vo(c,g,{uIni:s.uIni}));let w={timeTest:t().format("YYYY-MM-DDTHH:mm:ssZ"),timeOhlcStart:v,timeOhlcEnd:b,uIni:Vt(s,"uIni","")};if(l){g=bo(t,g);let r=So(t,s.uIni,g,v,b);w={...w,...r}}return{orders:g,summary:w}};let _o=async(t,r,e,n,o,i={})=>{if(!jo(r))throw new Error(`uIni[${r}] is not a positive number`);if(!dn(n))throw new Error(`invalid timeOhlcStart[${n}]`);if(!dn(o))throw new Error(`invalid timeOhlcEnd[${o}]`);e=_e(e,"timeStart");let u=r,a=0;e=fe(e,t=>dn(t.modeResult)?(u+=t.uProfitOrLoss,t.uEquity=u,a+=t.uProfitOrLoss,t.uCumuProfitOrLoss=a,t.rCumuProfitOrLoss=yo(t.uCumuProfitOrLoss/r*100,2)+"%",t):t),e=bo(t,e);let s=So(t,r,e,n,o);return{timeTest:t().format("YYYY-MM-DDTHH:mm:ssZ"),timeOhlcStart:n,timeOhlcEnd:o,uIni:r,...s}},Eo=async(t,r,e,n={})=>{let o=Vt(n,"withCalcOrderProfitOrLoss",!0),i=Vt(n,"withSummary",!0),u=0,a=[],s=null;var f;await mo(r,async(r,n)=>{try{s=await $o(t,r,e,{withCalcOrderProfitOrLoss:o,withSummary:!1});let n=Vt(r,"settings.uIni","");if(!Oo(n))throw new Error(`uIni[${n}] is not a number`);u+=n,Lr(s.orders)>=1&&(s.orders=fe(s.orders,t=>(t.sid=r.sid,t)),a.push(s.orders))}catch(t){}}),a=null!=(f=a)&&f.length?de(f,1):[],Lr(a)>=2&&(a=_e(a,"timeStart"));let l=Vt(s,"summary.timeOhlcStart",""),c=Vt(s,"summary.timeOhlcEnd","");if(!dn(l))throw new Error("invalid timeOhlcStart");if(!dn(c))throw new Error("invalid timeOhlcEnd");let d={timeTest:t().format("YYYY-MM-DDTHH:mm:ssZ"),timeOhlcStart:l,timeOhlcEnd:c};return i&&(d=await _o(t,u,a,l,c)),{orders:a,summary:d}};function To(t,r={}){let e=Vt(r,"fs"),n=!1;try{e.statSync(t),n=!0}catch{n=!1}return n}function Po(t,r={}){let e=Vt(r,"fs");if(!To(t,{fs:e}))return!1;let n=e.lstatSync(t);return!n.isFile()&&!n.isSymbolicLink()}function Lo(t){return Po(t,{fs:r})}function Ao(t){if(!dn(t))return{path:"",isRoot:!1};for(;t.indexOf("\\\\")>=0;)t=t.replace("\\\\","\\");for(;t.indexOf("//")>=0;)t=t.replace("//","/");if(":"===eo(t,1))return{path:`${t}\\`,isRoot:!0};if("\\"===eo(t,1)){let r=oo(t,1);return":"===eo(r,1)?{path:t,isRoot:!0}:{path:r,isRoot:!1}}if("/"===eo(t,1)){let r=oo(t,1);return 0===r.length?{path:t,isRoot:!0}:{path:r,isRoot:!1}}return{path:t,isRoot:!1}}function Mo(t){if(!dn(t))return"";let r=Ao(t);if(r.isRoot)return r.path;let e=r.path;try{e=e.split("\\").pop().split("/").pop()}catch(t){}return e}function ko(t,r={}){let e=Vt(r,"fs");if(Po(t,{fs:e}))return{success:"input folder is already exists: "+t};if(To(t,{fs:e}))return{error:"input path already exists: "+t};try{e.mkdirSync(t,{recursive:!0})}catch(t){return{error:t}}return{success:"done: "+t}}function Do(t,r,e={}){let n=null,o=Vt(e,"fs"),i=function(t){if(!dn(t))return"";let r=Ao(t);if(r.isRoot)return r.path;let e=Mo(t=r.path);if(!dn(e))return t;let n=Ao(t=oo(t,e.length));return n.isRoot,n.path}(t);Po(i,{fs:o})||ko(i,{fs:o});try{o.writeFileSync(t,r,"utf8")}catch(t){n=t}return null!==n?{error:n}:{success:t}}function Fo(t,e,n={}){let o=null;if(!an(e)&&!un(e))return{error:"inp is not an object or array"};let i=Vt(n,"useFormat",null);hn(i)||(i=!1);let u="";try{u=i?JSON.stringify(e,null,2):JSON.stringify(e)}catch(t){o=t}return null!==o?{error:o}:Do(t,u,{fs:r})}function xo(t){return function(t,r={}){let e=Vt(r,"fs");return!!To(t,{fs:e})&&!e.lstatSync(t).isDirectory()&&!e.lstatSync(t).isSymbolicLink()}(t,{fs:r})}function Co(t){let e=null,n=function(t,r={}){let e=null,n=Vt(r,"fs"),o="";try{o=n.readFileSync(t,"utf8")}catch(t){e=t}return null!==e?{error:e}:{success:o}}(t,{fs:r});if(n.error)return n;let o=n.success,i=null;try{i=JSON.parse(o)}catch(t){e=t}return null!==e?{error:e}:{success:i}}function Yo(t,r=1,e={}){let n=1,o=Vt(e,"path"),i=Vt(e,"fs");if(!Po(t,{fs:i}))throw new Error(`fd[${t}] is not a folder`);var u;return null!==r&&(Gn(u=r)&&to(u)>0)&&(r=to(r))<1&&(r=1),function t(e){let u=[];return Po(e,{fs:i})?(et(i.readdirSync(e),function(a){let s=o.resolve(e,a),f=null;try{f=i.statSync(s)}catch(t){}f&&f.isDirectory()?(u.push({isFolder:!0,level:n,path:s,name:o.basename(s)}),n+=1,(n<=r||null===r)&&(u=u.concat(t(s))),n-=1):u.push({isFolder:!1,level:n,path:s,name:o.basename(s)})}),u):u}(t)}function Ro(e,n=1){return Yo(e,n,{path:t,fs:r})}var Io=R&&R.isRegExp,No=Io?F(Io):function(t){return b(t)&&"[object RegExp]"==v(t)};function qo(t,r,e){return e&&"number"!=typeof e&&Se(t,r,e)&&(r=e=void 0),(e=void 0===e?4294967295:e>>>0)?(t=Ut(t))&&("string"==typeof r||null!=r&&!No(r))&&!(r=Ht(r))&&mr(t)?Pn(Un(t),0,e):t.split(r,e):[]}var zo=Array.prototype.join;function Ho(t){if(!dn(t))return"";let r=Mo(t),e=qo(r,".");if(Lr(e)<=1)return r;let n="";try{e=(a=null==(o=e)?0:o.length)?Tn(o,0,(i=a-(i=u||void 0===i?1:Wn(i)))<0?0:i):[],n=function(t,r){return null==t?"":zo.call(t,r)}(e,".")}catch(t){}var o,i,u,a;return n}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function Uo(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var Bo={exports:{}};!function(t){t.exports=function(){var t=1e3,r=6e4,e=36e5,n="millisecond",o="second",i="minute",u="hour",a="day",s="week",f="month",l="quarter",c="year",d="date",h="Invalid Date",p=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,m=/\[([^\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,y={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(t){var r=["th","st","nd","rd"],e=t%100;return"["+t+(r[(e-20)%10]||r[e]||r[0])+"]"}},v=function(t,r,e){var n=String(t);return!n||n.length>=r?t:""+Array(r+1-n.length).join(e)+t},b={s:v,z:function(t){var r=-t.utcOffset(),e=Math.abs(r),n=Math.floor(e/60),o=e%60;return(r<=0?"+":"-")+v(n,2,"0")+":"+v(o,2,"0")},m:function t(r,e){if(r.date()<e.date())return-t(e,r);var n=12*(e.year()-r.year())+(e.month()-r.month()),o=r.clone().add(n,f),i=e-o<0,u=r.clone().add(n+(i?-1:1),f);return+(-(n+(e-o)/(i?o-u:u-o))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:f,y:c,w:s,d:a,D:d,h:u,m:i,s:o,ms:n,Q:l}[t]||String(t||"").toLowerCase().replace(/s$/,"")},u:function(t){return void 0===t}},g="en",w={};w[g]=y;var O="$isDayjsObject",j=function(t){return t instanceof E||!(!t||!t[O])},S=function t(r,e,n){var o;if(!r)return g;if("string"==typeof r){var i=r.toLowerCase();w[i]&&(o=i),e&&(w[i]=e,o=i);var u=r.split("-");if(!o&&u.length>1)return t(u[0])}else{var a=r.name;w[a]=r,o=a}return!n&&o&&(g=o),o||!n&&g},$=function(t,r){if(j(t))return t.clone();var e="object"==typeof r?r:{};return e.date=t,e.args=arguments,new E(e)},_=b;_.l=S,_.i=j,_.w=function(t,r){return $(t,{locale:r.$L,utc:r.$u,x:r.$x,$offset:r.$offset})};var E=function(){function y(t){this.$L=S(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[O]=!0}var v=y.prototype;return v.parse=function(t){this.$d=function(t){var r=t.date,e=t.utc;if(null===r)return new Date(NaN);if(_.u(r))return new Date;if(r instanceof Date)return new Date(r);if("string"==typeof r&&!/Z$/i.test(r)){var n=r.match(p);if(n){var o=n[2]-1||0,i=(n[7]||"0").substring(0,3);return e?new Date(Date.UTC(n[1],o,n[3]||1,n[4]||0,n[5]||0,n[6]||0,i)):new Date(n[1],o,n[3]||1,n[4]||0,n[5]||0,n[6]||0,i)}}return new Date(r)}(t),this.init()},v.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},v.$utils=function(){return _},v.isValid=function(){return!(this.$d.toString()===h)},v.isSame=function(t,r){var e=$(t);return this.startOf(r)<=e&&e<=this.endOf(r)},v.isAfter=function(t,r){return $(t)<this.startOf(r)},v.isBefore=function(t,r){return this.endOf(r)<$(t)},v.$g=function(t,r,e){return _.u(t)?this[r]:this.set(e,t)},v.unix=function(){return Math.floor(this.valueOf()/1e3)},v.valueOf=function(){return this.$d.getTime()},v.startOf=function(t,r){var e=this,n=!!_.u(r)||r,l=_.p(t),h=function(t,r){var o=_.w(e.$u?Date.UTC(e.$y,r,t):new Date(e.$y,r,t),e);return n?o:o.endOf(a)},p=function(t,r){return _.w(e.toDate()[t].apply(e.toDate("s"),(n?[0,0,0,0]:[23,59,59,999]).slice(r)),e)},m=this.$W,y=this.$M,v=this.$D,b="set"+(this.$u?"UTC":"");switch(l){case c:return n?h(1,0):h(31,11);case f:return n?h(1,y):h(0,y+1);case s:var g=this.$locale().weekStart||0,w=(m<g?m+7:m)-g;return h(n?v-w:v+(6-w),y);case a:case d:return p(b+"Hours",0);case u:return p(b+"Minutes",1);case i:return p(b+"Seconds",2);case o:return p(b+"Milliseconds",3);default:return this.clone()}},v.endOf=function(t){return this.startOf(t,!1)},v.$set=function(t,r){var e,s=_.p(t),l="set"+(this.$u?"UTC":""),h=(e={},e[a]=l+"Date",e[d]=l+"Date",e[f]=l+"Month",e[c]=l+"FullYear",e[u]=l+"Hours",e[i]=l+"Minutes",e[o]=l+"Seconds",e[n]=l+"Milliseconds",e)[s],p=s===a?this.$D+(r-this.$W):r;if(s===f||s===c){var m=this.clone().set(d,1);m.$d[h](p),m.init(),this.$d=m.set(d,Math.min(this.$D,m.daysInMonth())).$d}else h&&this.$d[h](p);return this.init(),this},v.set=function(t,r){return this.clone().$set(t,r)},v.get=function(t){return this[_.p(t)]()},v.add=function(n,l){var d,h=this;n=Number(n);var p=_.p(l),m=function(t){var r=$(h);return _.w(r.date(r.date()+Math.round(t*n)),h)};if(p===f)return this.set(f,this.$M+n);if(p===c)return this.set(c,this.$y+n);if(p===a)return m(1);if(p===s)return m(7);var y=(d={},d[i]=r,d[u]=e,d[o]=t,d)[p]||1,v=this.$d.getTime()+n*y;return _.w(v,this)},v.subtract=function(t,r){return this.add(-1*t,r)},v.format=function(t){var r=this,e=this.$locale();if(!this.isValid())return e.invalidDate||h;var n=t||"YYYY-MM-DDTHH:mm:ssZ",o=_.z(this),i=this.$H,u=this.$m,a=this.$M,s=e.weekdays,f=e.months,l=e.meridiem,c=function(t,e,o,i){return t&&(t[e]||t(r,n))||o[e].slice(0,i)},d=function(t){return _.s(i%12||12,t,"0")},p=l||function(t,r,e){var n=t<12?"AM":"PM";return e?n.toLowerCase():n};return n.replace(m,function(t,n){return n||function(t){switch(t){case"YY":return String(r.$y).slice(-2);case"YYYY":return _.s(r.$y,4,"0");case"M":return a+1;case"MM":return _.s(a+1,2,"0");case"MMM":return c(e.monthsShort,a,f,3);case"MMMM":return c(f,a);case"D":return r.$D;case"DD":return _.s(r.$D,2,"0");case"d":return String(r.$W);case"dd":return c(e.weekdaysMin,r.$W,s,2);case"ddd":return c(e.weekdaysShort,r.$W,s,3);case"dddd":return s[r.$W];case"H":return String(i);case"HH":return _.s(i,2,"0");case"h":return d(1);case"hh":return d(2);case"a":return p(i,u,!0);case"A":return p(i,u,!1);case"m":return String(u);case"mm":return _.s(u,2,"0");case"s":return String(r.$s);case"ss":return _.s(r.$s,2,"0");case"SSS":return _.s(r.$ms,3,"0");case"Z":return o}return null}(t)||o.replace(":","")})},v.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},v.diff=function(n,d,h){var p,m=this,y=_.p(d),v=$(n),b=(v.utcOffset()-this.utcOffset())*r,g=this-v,w=function(){return _.m(m,v)};switch(y){case c:p=w()/12;break;case f:p=w();break;case l:p=w()/3;break;case s:p=(g-b)/6048e5;break;case a:p=(g-b)/864e5;break;case u:p=g/e;break;case i:p=g/r;break;case o:p=g/t;break;default:p=g}return h?p:_.a(p)},v.daysInMonth=function(){return this.endOf(f).$D},v.$locale=function(){return w[this.$L]},v.locale=function(t,r){if(!t)return this.$L;var e=this.clone(),n=S(t,r,!0);return n&&(e.$L=n),e},v.clone=function(){return _.w(this.$d,this)},v.toDate=function(){return new Date(this.valueOf())},v.toJSON=function(){return this.isValid()?this.toISOString():null},v.toISOString=function(){return this.$d.toISOString()},v.toString=function(){return this.$d.toUTCString()},y}(),T=E.prototype;return $.prototype=T,[["$ms",n],["$s",o],["$m",i],["$H",u],["$W",a],["$M",f],["$y",c],["$D",d]].forEach(function(t){T[t[1]]=function(r){return this.$g(r,t[0],t[1])}}),$.extend=function(t,r){return t.$i||(t(r,E,$),t.$i=!0),$},$.locale=S,$.isDayjs=j,$.unix=function(t){return $(1e3*t)},$.en=w[g],$.Ls=w,$.p={},$}()}(Bo);var Wo=Uo(Bo.exports);function Jo(t){if(!dn(t))return!1;let r="YYYY-MM-DDTHH:mm:ss";return t===Wo(t,r).format(r)}let Vo=(r,e)=>{let n={},o=async o=>{if(co(n,o))return n[o];let i=await(async n=>{let o=t.resolve(e,`${n}.json`),i=t.resolve(r,`${n}.json`),u="";if(xo(o))u=o;else{if(!xo(i))throw console.log(`fpParam[${o}] or fpOhlc[${i}] do not exist`),new Error(`invalid key[${n}]`);u=i}let a=Vt(Co(u),"success",null);if(!cn(a))throw new Error(`fp[${u}] no data`);return a})(o);return n[o]=i,i},i=[],u=async()=>{if(Lr(i)>0)return i;let t=t=>{let r=Ro(t);return r=wo(r,t=>"json"===function(t){if(!dn(t))return"";let r=qo(Mo(t),".");if(Lr(r)<=1)return"";let e="";try{e=Gt(r)}catch(t){}return e}(t.name)),r},n=[],u=t(r);await mo(u,async t=>{let r=Ho(t.name),e=await o(r);n.push({type:"ohlc",key:r,arr:e})});let a=t(e);return await mo(a,async t=>{let r=Ho(t.name),e=await o(r);n.push({type:"param",key:r,arr:e})}),i=n,n},a={},s=async(t,r)=>{if(!Jo(t))throw new Error("invalid timeStart");if(!Jo(r))throw new Error("invalid timeEnd");let e=`${t}:${r}`;if(co(a,e))return a[e];let n=await u(),o="1000-01-01T00:00:00",i="9999-01-01T00:00:00";if(et(n,t=>{let r=nt(t.arr),e=Gt(t.arr),n=Vt(r,"time",""),u=Vt(e,"time","");"ohlc"===t.type&&o<n&&(o=n),i>u&&(i=u)}),t<o)throw new Error(`timeStart[${t}] < timeStartData[${o}]`);if(r>i)throw new Error(`timeEnd[${r}] > timeEndData[${i}]`);let s=[];return et(n,e=>{let n=wo(e.arr,e=>e.time>=t&&e.time<=r);s.push({key:e.key,arr:n})}),a[e]=s,s},f={getKeysParam:()=>fe(Ro(e),t=>Ho(t.name)),getTimeSeries:o,getTimeSeriesByTimeRange:async(t,r,e)=>{let n=await o(t);return n=wo(n,t=>t.time>=r&&t.time<=e),n},getTimeSeriesFull:u,getTimeSeriesFullByTimeRange:s,buildGetTimeSeriesByTimeRange:async(t,r)=>{let e=await s(t,r),n={};et(e,t=>{n[t.key]=t.arr});return async e=>{let o=Vt(n,e,[]);if(!cn(o))throw new Error(`can not get series by key[${e}] bewteen timeStart[${t}] and timeEnd[${r}]`);return o}},buildGetTimeValueByTimeRange:async(t,r)=>{let e=await s(t,r),n={};et(e,t=>{et(t.arr,r=>{let e=`${t.key}_${r.time}`;n[e]=r})});return async(e,o)=>{let i=Vt(n,`${e}_${o}`,{});if(!ho(i))throw new Error(`can not get value by key[${e}] and time[${o}] bewteen timeStart[${t}] and timeEnd[${r}]`);return i}}};return f};let Go=t.dirname(e.fileURLToPath("undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(__filename).href:"undefined"==typeof document?location.href:n&&"SCRIPT"===n.tagName.toUpperCase()&&n.src||new URL("w-trade-backtest.umd.js",document.baseURI).href)),Zo=(e,n)=>{let o=e=>{let n=t.resolve(Go,e);return r.readFileSync(n,"utf8")},i=o("tmp.html"),u=o("renderProfitPlot.js"),a=o("renderOrdersTable.js"),s=o("renderOrdersTimeline.js"),f=o("renderSummary.js");i=i.replace("{renderProfitPlot}",u),i=i.replace("{renderOrdersTable}",a),i=i.replace("{renderOrdersTimeline}",s),i=i.replace("{renderSummary}",f),i=i.replace("{name}",e.name),i=i.replace("{orders}",JSON.stringify(e.orders)),i=i.replace("{summary}",JSON.stringify(e.summary)),Do(n,i,{fs:r})};var Ko=Math.max;var Qo,Xo=(Qo=function(t,r,e){var n=null==t?0:t.length;if(!n)return-1;var o=null==e?0:Wn(e);return o<0&&(o=Ko(n+o,0)),Ln(t,ae(r),o)},function(t,r,e){var n=Object(t);if(!K(t)){var o=ae(r);t=Q(t),r=function(t){return o(n[t],t,n)}}var i=Qo(t,r,e);return i>-1?n[o?t[i]:i]:void 0});function ti(t,r,e){for(var n=-1,o=t.length;++n<o;){var i=t[n],u=r(i);if(null!=u&&(void 0===a?u==u&&!ot(u):e(u,a)))var a=u,s=i}return s}function ri(t,r){return t>r}function ei(t,r){return t<r}let ni=(t,r={})=>{let e=r.tp,n=r.sl,o=r.mode||"long";if(!(e>0&&n>0))throw new Error(`genKLinesTpSl: invalid tp[${e}] / sl[${n}]`);let i=t.length,u=new Array(i),a=new Float64Array(i),s=new Float64Array(i),f=new Float64Array(i);for(let r=0;r<i;r++){let e=t[r];u[r]=e.time,a[r]=e.Close,s[r]=e.High,f[r]=e.Low}let l=new Float64Array(i).fill(NaN),c=new Int8Array(i).fill(-1),d=new Float64Array(i).fill(NaN);for(let t=0;t<i-1;t++){let r=a[t];if(!(r>0))continue;let u=r*(1+e),h=r*(1-n);for(let a=t+1;a<i;a++)if("long"===o){if(f[a]<=h){l[t]=-n,c[t]=0,d[t]=a-t;break}if(s[a]>=u){l[t]=e,c[t]=1,d[t]=a-t;break}}else{let o=r*(1+n),i=r*(1-e);if(s[a]>=o){l[t]=-n,c[t]=0,d[t]=a-t;break}if(f[a]<=i){l[t]=e,c[t]=1,d[t]=a-t;break}}}return{time:u,pnl:l,win:c,hold:d}};let oi={runStrategy:$o,runStrategies:Eo,runStrategiesAndBacktest:async(r,e,n,o,i,u,a,s={})=>{if(!Lo(e))throw new Error(`fdOhlc[${e}] is not a forder`);if(!Lo(n))throw new Error(`fdParam[${n}] is not a forder`);if(!cn(o))throw new Error("invalid strategies");let f=Vt(s,"writeOrders",!0),l=Vt(s,"writeSummary",!0),c=Vt(s,"writeReport",!0),d=Vo(e,n),h=await d.buildGetTimeSeriesByTimeRange(i,u),p=await Eo(r,o,h,{});if(p.name="全部策略",f){let r="orders.json";Fo(t.resolve(a,r),p.orders,{useFormat:!0})}if(l){let r="summary.json";Fo(t.resolve(a,r),{name:p.name,summary:p.summary},{useFormat:!0}),console.log("summary",p.summary,Lr(p.orders))}if(c){let r="report.html",e=t.resolve(a,r);Zo(p,e)}return p},calcOrders:vo,calcOrdersRatio:bo,calcOrdersSummary:So,calcOrdersSummarySimple:(t,r,e,n,o,i={})=>{i&&i.skipSort||(e=e.slice().sort((t,r)=>t.timeStart<r.timeStart?-1:t.timeStart>r.timeStart?1:0));let u=e.length,a=0,s=0,f="",l=new Map;for(let t of e)dn(t.modeResult)&&(a++,"profit"===t.modeResult&&s++,f=t.uEquity),l.set(t.timeStart,(l.get(t.timeStart)||0)+t.uTrade),dn(t.timeEnd)&&l.set(t.timeEnd,(l.get(t.timeEnd)||0)-t.uTrade);let c=[...l.keys()].sort(),d=0,h=new Map;for(let t of c)d+=l.get(t),h.set(t,d);let p=0;for(let t of e){let r=Math.abs(h.get(t.timeStart));r>p&&(p=r)}let m,y=yo(s/a*100,2)+"%",v=yo(p/r*100,2)+"%",b=t(o).diff(t(n),"day"),g=b/365;m=`${yo(100*(0===p||0===g?0:(f-r)/p/g),2)}%`;return{numTrade:u,numTradeFin:a,rWin:y,uTradeAllMax:p,rTradeAllMax:v,uEquityFinal:f,btDays:b,btYears:yo(g,1),rEquivalentCumuProfitOrLossFinalNormYear:m,timeOhlcStart:n,timeOhlcEnd:o}},calcSummary:_o,closeAndSummaryOrders:async(r,e,n,o,i,u,a,s,f,l={})=>{if(!Lo(e))throw new Error(`fdOhlc[${e}] is not a forder`);if(!Lo(n))throw new Error(`fdParam[${n}] is not a forder`);if(!jo(o))throw new Error(`uIni[${o}] is not a positive number`);if(!dn(i))throw new Error(`invalid timeOhlcStart[${i}]`);if(!dn(u))throw new Error(`invalid timeOhlcEnd[${u}]`);if(!dn(a))throw new Error(`invalid keyOhlc[${a}]`);if(!un(s))throw new Error(`invalid ordersSubmit[${s}]`);if(!dn(f))throw new Error(`invalid fdTest[${f}]`);let c=Vt(l,"writeOrders",!0),d=Vt(l,"writeSummary",!0),h=Vt(l,"writeReport",!0),p=Vo(e,n),m=r(i),y=r(u).diff(m,"hour")/4;if(y!==to(y))throw new Error(`timeOhlcStart[${i}] to timeOhlcEnd[${u}] are not hour intervals`);let v=await p.buildGetTimeSeriesByTimeRange(i,u),b=await v(a),g=await vo(b,s,{uIni:o}),w=await _o(r,o,g,i,u);console.log("summary",w,Lr(g));let O={name:"全部策略",orders:g,summary:w};if(c){let r="orders.json";Fo(t.resolve(f,r),O.orders,{useFormat:!0})}if(d){let r="summary.json";Fo(t.resolve(f,r),{name:O.name,summary:O.summary},{useFormat:!0}),console.log("summary",O.summary,Lr(O.orders))}if(h){let r="report.html",e=t.resolve(f,r);Zo(O,e)}},genReport:async(r,e,n={})=>{if(!dn(e))throw new Error("invalid fpOrders");if(!xo(e))throw new Error(`fpOrders[${e}] is not a file`);let o=Vt(Co(e),"success",null);if(!cn(o))throw new Error(`orders in fpOrders[${e}] is not an effective array`);let i=Vt(n,"fpOut","");dn(i)||(i=t.resolve(t.dirname(e),"report.html"));let u=Vt(n,"name","");dn(u)||(u=t.basename(t.dirname(t.resolve(e))));let a=Vt(n,"uIni",null);if(!pn(a)){let t=Xo(o,t=>pn(t.uEquity)&&pn(t.uCumuProfitOrLoss));a=t?t.uEquity-t.uCumuProfitOrLoss:1e3}let s=Vt(n,"timeOhlcStart","");var f;dn(s)||(s=(f=fe(o,"timeStart"))&&f.length?ti(f,rt,ei):void 0);let l=Vt(n,"timeOhlcEnd","");dn(l)||(l=function(t){return t&&t.length?ti(t,rt,ri):void 0}(fe(o,t=>dn(t.timeEnd)?t.timeEnd:t.timeStart)));let c=Vt(n,"withWriteSummary",!1),d=await _o(r,a,o,s,l);return c&&Fo(t.resolve(t.dirname(i),"summary.json"),{name:u,summary:d},{useFormat:!0}),Zo({name:u,orders:o,summary:d},i),{orders:o,summary:d,fpOut:i}},genReportCore:Zo,genKLinesTpSl:ni,buildKLinesTpSl:async(e,n,o,i={})=>{if(!Lo(e))throw new Error(`fdOhlc[${e}] is not a folder`);if(!Lo(n))throw new Error(`fdParam[${n}] is not a folder`);if(!dn(o))throw new Error("invalid fpJson");let u=Vo(e,n),{keyOhlc:a,ts:s,te:f,tps:l=[4,5,6,7,8,9,10],modes:c=["long","short"]}=i;if(!dn(a))throw new Error("invalid opt.keyOhlc");if(!Jo(s))throw new Error("invalid opt.ts");if(!Jo(f))throw new Error("invalid opt.te");let d=await u.getTimeSeriesByTimeRange(a,s,f),h=d.length,p=d.map(t=>t.time),m={};for(let t=0;t<h;t++)m[p[t]]={close:d[t].Close};for(let t of c)for(let r of l){let{win:e,hold:n}=ni(d,{tp:r/100,sl:r/100,mode:t}),o=`${t}_${r}`;for(let t=0;t<h;t++){let r=e[t],i=r>=0&&Number.isFinite(n[t])?p[t+n[t]]:null;m[p[t]][o]={win:r,timeEnd:i}}}let y={meta:{keyOhlc:a,ts:s,te:f,tps:l,modes:c,nBars:h},bars:m},v=t.resolve(o),b=t.dirname(v);return Lo(b)||ko(b,{fs:r}),r.writeFileSync(v,JSON.stringify(y)),y},loadKLinesTpSl:e=>{if(!dn(e))throw new Error("invalid fpJson");if(!xo(e))throw new Error(`fpJson[${e}] is not a file`);let n=JSON.parse(r.readFileSync(t.resolve(e),"utf8")),o=n.meta,i=n.bars;return{meta:o,bars:i,ordersFromBars:(t,r,e,n={})=>{let{uTrade:o=1,uIni:u=1e3,rFee:a=5e-4,maxExitTime:s=null,skipSort:f=!1}=n,l=`${t}_${r}`,c=r/100,d=a*o,h=(f?e:[...e].sort()).filter(t=>i[t]).map(r=>{let e=i[r].close;return{mode:t,timeStart:r,priceStart:e,uTrade:o,rTakeProfit:c,priceTakeProfit:"long"===t?(1+c)*e:(1-c)*e,rStopLoss:c,priceStopLoss:"long"===t?(1-c)*e:(1+c)*e,timeEnd:"",priceEnd:"",modeResult:"",rFee:a,uFee:d,uProfitOrLoss:"",rProfitOrLoss:"",uCumuProfitOrLoss:"",rCumuProfitOrLoss:"",uEquity:"",uTradeAll:"",rTradeAll:""}}),p=u,m=0;for(let t of h){let r=i[t.timeStart][l];!r||r.win<0||!r.timeEnd||(s&&r.timeEnd>=s||(t.timeEnd=r.timeEnd,t.priceEnd=1===r.win?t.priceTakeProfit:t.priceStopLoss,t.uProfitOrLoss="long"===t.mode?t.uTrade*(t.priceEnd/t.priceStart)-t.uTrade-2*t.uFee:(t.priceStart-t.priceEnd)*(t.uTrade/t.priceStart)-2*t.uFee,t.rProfitOrLoss=t.uProfitOrLoss/t.uTrade,m+=t.uProfitOrLoss,t.uCumuProfitOrLoss=m,t.rCumuProfitOrLoss=yo(t.uCumuProfitOrLoss/u*100,2)+"%",p+=t.uProfitOrLoss,t.uEquity=p,t.modeResult=t.uProfitOrLoss<0?"loss":"profit"))}return h}}}};return oi});
|
|
6
|
+
!function(t,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r(require("path"),require("fs"),require("url")):"function"==typeof define&&define.amd?define(["path","fs","url"],r):(t="undefined"!=typeof globalThis?globalThis:t||self)["w-trade-backtest"]=r(t.path,t.fs,t.url)}(this,function(t,r,e){"use strict";var n="undefined"!=typeof document?document.currentScript:null;function o(t,r){for(var e=-1,n=null==t?0:t.length;++e<n&&!1!==r(t[e],e,t););return t}var i,u=function(t,r,e){for(var n=-1,o=Object(t),u=e(t),a=u.length;a--;){var s=u[i?a:++n];if(!1===r(o[s],s,o))break}return t};var a="object"==typeof global&&global&&global.Object===Object&&global,s="object"==typeof self&&self&&self.Object===Object&&self,l=a||s||Function("return this")(),f=l.Symbol,c=Object.prototype,d=c.hasOwnProperty,h=c.toString,p=f?f.toStringTag:void 0;var m=Object.prototype.toString;var y=f?f.toStringTag:void 0;function v(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":y&&y in Object(t)?function(t){var r=d.call(t,p),e=t[p];try{t[p]=void 0;var n=!0}catch(t){}var o=h.call(t);return n&&(r?t[p]=e:delete t[p]),o}(t):function(t){return m.call(t)}(t)}function b(t){return null!=t&&"object"==typeof t}function g(t){return b(t)&&"[object Arguments]"==v(t)}var w=Object.prototype,O=w.hasOwnProperty,j=w.propertyIsEnumerable,S=g(function(){return arguments}())?g:function(t){return b(t)&&O.call(t,"callee")&&!j.call(t,"callee")},$=S,E=Array.isArray;var _="object"==typeof exports&&exports&&!exports.nodeType&&exports,T=_&&"object"==typeof module&&module&&!module.nodeType&&module,P=T&&T.exports===_?l.Buffer:void 0,L=(P?P.isBuffer:void 0)||function(){return!1},A=/^(?:0|[1-9]\d*)$/;function M(t,r){var e=typeof t;return!!(r=null==r?9007199254740991:r)&&("number"==e||"symbol"!=e&&A.test(t))&&t>-1&&t%1==0&&t<r}function k(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}var F={};function D(t){return function(r){return t(r)}}F["[object Float32Array]"]=F["[object Float64Array]"]=F["[object Int8Array]"]=F["[object Int16Array]"]=F["[object Int32Array]"]=F["[object Uint8Array]"]=F["[object Uint8ClampedArray]"]=F["[object Uint16Array]"]=F["[object Uint32Array]"]=!0,F["[object Arguments]"]=F["[object Array]"]=F["[object ArrayBuffer]"]=F["[object Boolean]"]=F["[object DataView]"]=F["[object Date]"]=F["[object Error]"]=F["[object Function]"]=F["[object Map]"]=F["[object Number]"]=F["[object Object]"]=F["[object RegExp]"]=F["[object Set]"]=F["[object String]"]=F["[object WeakMap]"]=!1;var x="object"==typeof exports&&exports&&!exports.nodeType&&exports,C=x&&"object"==typeof module&&module&&!module.nodeType&&module,R=C&&C.exports===x&&a.process,Y=function(){try{var t=C&&C.require&&C.require("util").types;return t||R&&R.binding&&R.binding("util")}catch(t){}}(),I=Y&&Y.isTypedArray,N=I?D(I):function(t){return b(t)&&k(t.length)&&!!F[v(t)]},q=Object.prototype.hasOwnProperty;function z(t,r){var e=E(t),n=!e&&$(t),o=!e&&!n&&L(t),i=!e&&!n&&!o&&N(t),u=e||n||o||i,a=u?function(t,r){for(var e=-1,n=Array(t);++e<t;)n[e]=r(e);return n}(t.length,String):[],s=a.length;for(var l in t)!r&&!q.call(t,l)||u&&("length"==l||o&&("offset"==l||"parent"==l)||i&&("buffer"==l||"byteLength"==l||"byteOffset"==l)||M(l,s))||a.push(l);return a}var H=Object.prototype;function U(t){var r=t&&t.constructor;return t===("function"==typeof r&&r.prototype||H)}function B(t,r){return function(e){return t(r(e))}}var W=B(Object.keys,Object),J=Object.prototype.hasOwnProperty;function V(t){if(!U(t))return W(t);var r=[];for(var e in Object(t))J.call(t,e)&&"constructor"!=e&&r.push(e);return r}function G(t){var r=typeof t;return null!=t&&("object"==r||"function"==r)}function Z(t){if(!G(t))return!1;var r=v(t);return"[object Function]"==r||"[object GeneratorFunction]"==r||"[object AsyncFunction]"==r||"[object Proxy]"==r}function K(t){return null!=t&&k(t.length)&&!Z(t)}function Q(t){return K(t)?z(t):V(t)}var X=function(t,r){return function(e,n){if(null==e)return e;if(!K(e))return t(e,n);for(var o=e.length,i=r?o:-1,u=Object(e);(r?i--:++i<o)&&!1!==n(u[i],i,u););return e}}(function(t,r){return t&&u(t,r,Q)}),tt=X;function rt(t){return t}function et(t,r){var e;return(E(t)?o:tt)(t,"function"==typeof(e=r)?e:rt)}function nt(t){return t&&t.length?t[0]:void 0}function ot(t){return"symbol"==typeof t||b(t)&&"[object Symbol]"==v(t)}var it=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,ut=/^\w*$/;function at(t,r){if(E(t))return!1;var e=typeof t;return!("number"!=e&&"symbol"!=e&&"boolean"!=e&&null!=t&&!ot(t))||(ut.test(t)||!it.test(t)||null!=r&&t in Object(r))}var st,lt=l["__core-js_shared__"],ft=(st=/[^.]+$/.exec(lt&<.keys&<.keys.IE_PROTO||""))?"Symbol(src)_1."+st:"";var ct=Function.prototype.toString;function dt(t){if(null!=t){try{return ct.call(t)}catch(t){}try{return t+""}catch(t){}}return""}var ht=/^\[object .+?Constructor\]$/,pt=Function.prototype,mt=Object.prototype,yt=pt.toString,vt=mt.hasOwnProperty,bt=RegExp("^"+yt.call(vt).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function gt(t){return!(!G(t)||(r=t,ft&&ft in r))&&(Z(t)?bt:ht).test(dt(t));var r}function wt(t,r){var e=function(t,r){return null==t?void 0:t[r]}(t,r);return gt(e)?e:void 0}var Ot=wt(Object,"create");var jt=Object.prototype.hasOwnProperty;var St=Object.prototype.hasOwnProperty;function $t(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r<e;){var n=t[r];this.set(n[0],n[1])}}function Et(t,r){return t===r||t!=t&&r!=r}function _t(t,r){for(var e=t.length;e--;)if(Et(t[e][0],r))return e;return-1}$t.prototype.clear=function(){this.__data__=Ot?Ot(null):{},this.size=0},$t.prototype.delete=function(t){var r=this.has(t)&&delete this.__data__[t];return this.size-=r?1:0,r},$t.prototype.get=function(t){var r=this.__data__;if(Ot){var e=r[t];return"__lodash_hash_undefined__"===e?void 0:e}return jt.call(r,t)?r[t]:void 0},$t.prototype.has=function(t){var r=this.__data__;return Ot?void 0!==r[t]:St.call(r,t)},$t.prototype.set=function(t,r){var e=this.__data__;return this.size+=this.has(t)?0:1,e[t]=Ot&&void 0===r?"__lodash_hash_undefined__":r,this};var Tt=Array.prototype.splice;function Pt(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r<e;){var n=t[r];this.set(n[0],n[1])}}Pt.prototype.clear=function(){this.__data__=[],this.size=0},Pt.prototype.delete=function(t){var r=this.__data__,e=_t(r,t);return!(e<0)&&(e==r.length-1?r.pop():Tt.call(r,e,1),--this.size,!0)},Pt.prototype.get=function(t){var r=this.__data__,e=_t(r,t);return e<0?void 0:r[e][1]},Pt.prototype.has=function(t){return _t(this.__data__,t)>-1},Pt.prototype.set=function(t,r){var e=this.__data__,n=_t(e,t);return n<0?(++this.size,e.push([t,r])):e[n][1]=r,this};var Lt=wt(l,"Map");function At(t,r){var e,n,o=t.__data__;return("string"==(n=typeof(e=r))||"number"==n||"symbol"==n||"boolean"==n?"__proto__"!==e:null===e)?o["string"==typeof r?"string":"hash"]:o.map}function Mt(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r<e;){var n=t[r];this.set(n[0],n[1])}}Mt.prototype.clear=function(){this.size=0,this.__data__={hash:new $t,map:new(Lt||Pt),string:new $t}},Mt.prototype.delete=function(t){var r=At(this,t).delete(t);return this.size-=r?1:0,r},Mt.prototype.get=function(t){return At(this,t).get(t)},Mt.prototype.has=function(t){return At(this,t).has(t)},Mt.prototype.set=function(t,r){var e=At(this,t),n=e.size;return e.set(t,r),this.size+=e.size==n?0:1,this};function kt(t,r){if("function"!=typeof t||null!=r&&"function"!=typeof r)throw new TypeError("Expected a function");var e=function(){var n=arguments,o=r?r.apply(this,n):n[0],i=e.cache;if(i.has(o))return i.get(o);var u=t.apply(this,n);return e.cache=i.set(o,u)||i,u};return e.cache=new(kt.Cache||Mt),e}kt.Cache=Mt;var Ft,Dt,xt,Ct=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Rt=/\\(\\)?/g,Yt=(Ft=function(t){var r=[];return 46===t.charCodeAt(0)&&r.push(""),t.replace(Ct,function(t,e,n,o){r.push(n?o.replace(Rt,"$1"):e||t)}),r},Dt=kt(Ft,function(t){return 500===xt.size&&xt.clear(),t}),xt=Dt.cache,Dt),It=Yt;function Nt(t,r){for(var e=-1,n=null==t?0:t.length,o=Array(n);++e<n;)o[e]=r(t[e],e,t);return o}var qt=f?f.prototype:void 0,zt=qt?qt.toString:void 0;function Ht(t){if("string"==typeof t)return t;if(E(t))return Nt(t,Ht)+"";if(ot(t))return zt?zt.call(t):"";var r=t+"";return"0"==r&&1/t==-1/0?"-0":r}function Ut(t){return null==t?"":Ht(t)}function Bt(t,r){return E(t)?t:at(t,r)?[t]:It(Ut(t))}function Wt(t){if("string"==typeof t||ot(t))return t;var r=t+"";return"0"==r&&1/t==-1/0?"-0":r}function Jt(t,r){for(var e=0,n=(r=Bt(r,t)).length;null!=t&&e<n;)t=t[Wt(r[e++])];return e&&e==n?t:void 0}function Vt(t,r,e){var n=null==t?void 0:Jt(t,r);return void 0===n?e:n}function Gt(t){var r=null==t?0:t.length;return r?t[r-1]:void 0}var Zt=wt(l,"DataView"),Kt=wt(l,"Promise"),Qt=wt(l,"Set"),Xt=wt(l,"WeakMap"),tr="[object Map]",rr="[object Promise]",er="[object Set]",nr="[object WeakMap]",or="[object DataView]",ir=dt(Zt),ur=dt(Lt),ar=dt(Kt),sr=dt(Qt),lr=dt(Xt),fr=v;(Zt&&fr(new Zt(new ArrayBuffer(1)))!=or||Lt&&fr(new Lt)!=tr||Kt&&fr(Kt.resolve())!=rr||Qt&&fr(new Qt)!=er||Xt&&fr(new Xt)!=nr)&&(fr=function(t){var r=v(t),e="[object Object]"==r?t.constructor:void 0,n=e?dt(e):"";if(n)switch(n){case ir:return or;case ur:return tr;case ar:return rr;case sr:return er;case lr:return nr}return r});var cr=fr;function dr(t){return function(r){return null==r?void 0:r[t]}}var hr=dr("length"),pr=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");function mr(t){return pr.test(t)}var yr="\\ud800-\\udfff",vr="["+yr+"]",br="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",gr="\\ud83c[\\udffb-\\udfff]",wr="[^"+yr+"]",Or="(?:\\ud83c[\\udde6-\\uddff]){2}",jr="[\\ud800-\\udbff][\\udc00-\\udfff]",Sr="(?:"+br+"|"+gr+")"+"?",$r="[\\ufe0e\\ufe0f]?",Er=$r+Sr+("(?:\\u200d(?:"+[wr,Or,jr].join("|")+")"+$r+Sr+")*"),_r="(?:"+[wr+br+"?",br,Or,jr,vr].join("|")+")",Tr=RegExp(gr+"(?="+gr+")|"+_r+Er,"g");function Pr(t){return mr(t)?function(t){for(var r=Tr.lastIndex=0;Tr.test(t);)++r;return r}(t):hr(t)}function Lr(t){if(null==t)return 0;if(K(t))return"string"==typeof(r=t)||!E(r)&&b(r)&&"[object String]"==v(r)?Pr(t):t.length;var r,e=cr(t);return"[object Map]"==e||"[object Set]"==e?t.size:V(t).length}function Ar(t){var r=this.__data__=new Pt(t);this.size=r.size}Ar.prototype.clear=function(){this.__data__=new Pt,this.size=0},Ar.prototype.delete=function(t){var r=this.__data__,e=r.delete(t);return this.size=r.size,e},Ar.prototype.get=function(t){return this.__data__.get(t)},Ar.prototype.has=function(t){return this.__data__.has(t)},Ar.prototype.set=function(t,r){var e=this.__data__;if(e instanceof Pt){var n=e.__data__;if(!Lt||n.length<199)return n.push([t,r]),this.size=++e.size,this;e=this.__data__=new Mt(n)}return e.set(t,r),this.size=e.size,this};function Mr(t){var r=-1,e=null==t?0:t.length;for(this.__data__=new Mt;++r<e;)this.add(t[r])}function kr(t,r){for(var e=-1,n=null==t?0:t.length;++e<n;)if(r(t[e],e,t))return!0;return!1}function Fr(t,r){return t.has(r)}Mr.prototype.add=Mr.prototype.push=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this},Mr.prototype.has=function(t){return this.__data__.has(t)};function Dr(t,r,e,n,o,i){var u=1&e,a=t.length,s=r.length;if(a!=s&&!(u&&s>a))return!1;var l=i.get(t),f=i.get(r);if(l&&f)return l==r&&f==t;var c=-1,d=!0,h=2&e?new Mr:void 0;for(i.set(t,r),i.set(r,t);++c<a;){var p=t[c],m=r[c];if(n)var y=u?n(m,p,c,r,t,i):n(p,m,c,t,r,i);if(void 0!==y){if(y)continue;d=!1;break}if(h){if(!kr(r,function(t,r){if(!Fr(h,r)&&(p===t||o(p,t,e,n,i)))return h.push(r)})){d=!1;break}}else if(p!==m&&!o(p,m,e,n,i)){d=!1;break}}return i.delete(t),i.delete(r),d}var xr=l.Uint8Array;function Cr(t){var r=-1,e=Array(t.size);return t.forEach(function(t,n){e[++r]=[n,t]}),e}function Rr(t){var r=-1,e=Array(t.size);return t.forEach(function(t){e[++r]=t}),e}var Yr=f?f.prototype:void 0,Ir=Yr?Yr.valueOf:void 0;function Nr(t,r){for(var e=-1,n=r.length,o=t.length;++e<n;)t[o+e]=r[e];return t}function qr(t,r,e){var n=r(t);return E(t)?n:Nr(n,e(t))}function zr(t,r){for(var e=-1,n=null==t?0:t.length,o=0,i=[];++e<n;){var u=t[e];r(u,e,t)&&(i[o++]=u)}return i}function Hr(){return[]}var Ur=Object.prototype.propertyIsEnumerable,Br=Object.getOwnPropertySymbols,Wr=Br?function(t){return null==t?[]:(t=Object(t),zr(Br(t),function(r){return Ur.call(t,r)}))}:Hr;function Jr(t){return qr(t,Q,Wr)}var Vr=Object.prototype.hasOwnProperty;var Gr="[object Arguments]",Zr="[object Array]",Kr="[object Object]",Qr=Object.prototype.hasOwnProperty;function Xr(t,r,e,n,o,i){var u=E(t),a=E(r),s=u?Zr:cr(t),l=a?Zr:cr(r),f=(s=s==Gr?Kr:s)==Kr,c=(l=l==Gr?Kr:l)==Kr,d=s==l;if(d&&L(t)){if(!L(r))return!1;u=!0,f=!1}if(d&&!f)return i||(i=new Ar),u||N(t)?Dr(t,r,e,n,o,i):function(t,r,e,n,o,i,u){switch(e){case"[object DataView]":if(t.byteLength!=r.byteLength||t.byteOffset!=r.byteOffset)return!1;t=t.buffer,r=r.buffer;case"[object ArrayBuffer]":return!(t.byteLength!=r.byteLength||!i(new xr(t),new xr(r)));case"[object Boolean]":case"[object Date]":case"[object Number]":return Et(+t,+r);case"[object Error]":return t.name==r.name&&t.message==r.message;case"[object RegExp]":case"[object String]":return t==r+"";case"[object Map]":var a=Cr;case"[object Set]":var s=1&n;if(a||(a=Rr),t.size!=r.size&&!s)return!1;var l=u.get(t);if(l)return l==r;n|=2,u.set(t,r);var f=Dr(a(t),a(r),n,o,i,u);return u.delete(t),f;case"[object Symbol]":if(Ir)return Ir.call(t)==Ir.call(r)}return!1}(t,r,s,e,n,o,i);if(!(1&e)){var h=f&&Qr.call(t,"__wrapped__"),p=c&&Qr.call(r,"__wrapped__");if(h||p){var m=h?t.value():t,y=p?r.value():r;return i||(i=new Ar),o(m,y,e,n,i)}}return!!d&&(i||(i=new Ar),function(t,r,e,n,o,i){var u=1&e,a=Jr(t),s=a.length;if(s!=Jr(r).length&&!u)return!1;for(var l=s;l--;){var f=a[l];if(!(u?f in r:Vr.call(r,f)))return!1}var c=i.get(t),d=i.get(r);if(c&&d)return c==r&&d==t;var h=!0;i.set(t,r),i.set(r,t);for(var p=u;++l<s;){var m=t[f=a[l]],y=r[f];if(n)var v=u?n(y,m,f,r,t,i):n(m,y,f,t,r,i);if(!(void 0===v?m===y||o(m,y,e,n,i):v)){h=!1;break}p||(p="constructor"==f)}if(h&&!p){var b=t.constructor,g=r.constructor;b==g||!("constructor"in t)||!("constructor"in r)||"function"==typeof b&&b instanceof b&&"function"==typeof g&&g instanceof g||(h=!1)}return i.delete(t),i.delete(r),h}(t,r,e,n,o,i))}function te(t,r,e,n,o){return t===r||(null==t||null==r||!b(t)&&!b(r)?t!=t&&r!=r:Xr(t,r,e,n,te,o))}function re(t){return t==t&&!G(t)}function ee(t,r){return function(e){return null!=e&&(e[t]===r&&(void 0!==r||t in Object(e)))}}function ne(t){var r=function(t){for(var r=Q(t),e=r.length;e--;){var n=r[e],o=t[n];r[e]=[n,o,re(o)]}return r}(t);return 1==r.length&&r[0][2]?ee(r[0][0],r[0][1]):function(e){return e===t||function(t,r,e,n){var o=e.length,i=o,u=!n;if(null==t)return!i;for(t=Object(t);o--;){var a=e[o];if(u&&a[2]?a[1]!==t[a[0]]:!(a[0]in t))return!1}for(;++o<i;){var s=(a=e[o])[0],l=t[s],f=a[1];if(u&&a[2]){if(void 0===l&&!(s in t))return!1}else{var c=new Ar;if(n)var d=n(l,f,s,t,r,c);if(!(void 0===d?te(f,l,3,n,c):d))return!1}}return!0}(e,t,r)}}function oe(t,r){return null!=t&&r in Object(t)}function ie(t,r){return null!=t&&function(t,r,e){for(var n=-1,o=(r=Bt(r,t)).length,i=!1;++n<o;){var u=Wt(r[n]);if(!(i=null!=t&&e(t,u)))break;t=t[u]}return i||++n!=o?i:!!(o=null==t?0:t.length)&&k(o)&&M(u,o)&&(E(t)||$(t))}(t,r,oe)}function ue(t){return at(t)?dr(Wt(t)):function(t){return function(r){return Jt(r,t)}}(t)}function ae(t){return"function"==typeof t?t:null==t?rt:"object"==typeof t?E(t)?function(t,r){return at(t)&&re(r)?ee(Wt(t),r):function(e){var n=Vt(e,t);return void 0===n&&n===r?ie(e,t):te(r,n,3)}}(t[0],t[1]):ne(t):ue(t)}function se(t,r){var e=-1,n=K(t)?Array(t.length):[];return tt(t,function(t,o,i){n[++e]=r(t,o,i)}),n}function le(t,r){return(E(t)?Nt:se)(t,ae(r))}var fe=f?f.isConcatSpreadable:void 0;function ce(t){return E(t)||$(t)||!!(fe&&t&&t[fe])}function de(t,r,e,n,o){var i=-1,u=t.length;for(e||(e=ce),o||(o=[]);++i<u;){var a=t[i];r>0&&e(a)?r>1?de(a,r-1,e,n,o):Nr(o,a):n||(o[o.length]=a)}return o}function he(t,r){if(t!==r){var e=void 0!==t,n=null===t,o=t==t,i=ot(t),u=void 0!==r,a=null===r,s=r==r,l=ot(r);if(!a&&!l&&!i&&t>r||i&&u&&s&&!a&&!l||n&&u&&s||!e&&s||!o)return 1;if(!n&&!i&&!l&&t<r||l&&e&&o&&!n&&!i||a&&e&&o||!u&&o||!s)return-1}return 0}function pe(t,r,e){r=r.length?Nt(r,function(t){return E(t)?function(r){return Jt(r,1===t.length?t[0]:t)}:t}):[rt];var n=-1;return r=Nt(r,D(ae)),function(t,r){var e=t.length;for(t.sort(r);e--;)t[e]=t[e].value;return t}(se(t,function(t,e,o){return{criteria:Nt(r,function(r){return r(t)}),index:++n,value:t}}),function(t,r){return function(t,r,e){for(var n=-1,o=t.criteria,i=r.criteria,u=o.length,a=e.length;++n<u;){var s=he(o[n],i[n]);if(s)return n>=a?s:s*("desc"==e[n]?-1:1)}return t.index-r.index}(t,r,e)})}var me=Math.max;var ye=function(){try{var t=wt(Object,"defineProperty");return t({},"",{}),t}catch(t){}}(),ve=ye,be=ve?function(t,r){return ve(t,"toString",{configurable:!0,enumerable:!1,value:(e=r,function(){return e}),writable:!0});var e}:rt,ge=be,we=Date.now;var Oe=function(t){var r=0,e=0;return function(){var n=we(),o=16-(n-e);if(e=n,o>0){if(++r>=800)return arguments[0]}else r=0;return t.apply(void 0,arguments)}}(ge),je=Oe;function Se(t,r,e){if(!G(e))return!1;var n=typeof r;return!!("number"==n?K(e)&&M(r,e.length):"string"==n&&r in e)&&Et(e[r],t)}var $e=function(t,r){return je(function(t,r,e){return r=me(void 0===r?t.length-1:r,0),function(){for(var n=arguments,o=-1,i=me(n.length-r,0),u=Array(i);++o<i;)u[o]=n[r+o];o=-1;for(var a=Array(r+1);++o<r;)a[o]=n[o];return a[r]=e(u),function(t,r,e){switch(e.length){case 0:return t.call(r);case 1:return t.call(r,e[0]);case 2:return t.call(r,e[0],e[1]);case 3:return t.call(r,e[0],e[1],e[2])}return t.apply(r,e)}(t,this,a)}}(t,r,rt),t+"")}(function(t,r){if(null==t)return[];var e=r.length;return e>1&&Se(t,r[0],r[1])?r=[]:e>2&&Se(r[0],r[1],r[2])&&(r=[r[0]]),pe(t,de(r,1),[])}),Ee=$e;function _e(t,r,e){"__proto__"==r&&ve?ve(t,r,{configurable:!0,enumerable:!0,value:e,writable:!0}):t[r]=e}var Te=Object.prototype.hasOwnProperty;function Pe(t,r,e){var n=t[r];Te.call(t,r)&&Et(n,e)&&(void 0!==e||r in t)||_e(t,r,e)}function Le(t,r,e,n){var o=!e;e||(e={});for(var i=-1,u=r.length;++i<u;){var a=r[i],s=n?n(e[a],t[a],a,e,t):void 0;void 0===s&&(s=t[a]),o?_e(e,a,s):Pe(e,a,s)}return e}var Ae=Object.prototype.hasOwnProperty;function Me(t){if(!G(t))return function(t){var r=[];if(null!=t)for(var e in Object(t))r.push(e);return r}(t);var r=U(t),e=[];for(var n in t)("constructor"!=n||!r&&Ae.call(t,n))&&e.push(n);return e}function ke(t){return K(t)?z(t,!0):Me(t)}var Fe="object"==typeof exports&&exports&&!exports.nodeType&&exports,De=Fe&&"object"==typeof module&&module&&!module.nodeType&&module,xe=De&&De.exports===Fe?l.Buffer:void 0,Ce=xe?xe.allocUnsafe:void 0;var Re=B(Object.getPrototypeOf,Object),Ye=Object.getOwnPropertySymbols?function(t){for(var r=[];t;)Nr(r,Wr(t)),t=Re(t);return r}:Hr,Ie=Ye;function Ne(t){return qr(t,ke,Ie)}var qe=Object.prototype.hasOwnProperty;function ze(t){var r=new t.constructor(t.byteLength);return new xr(r).set(new xr(t)),r}var He=/\w*$/;var Ue=f?f.prototype:void 0,Be=Ue?Ue.valueOf:void 0;function We(t,r,e){var n,o=t.constructor;switch(r){case"[object ArrayBuffer]":return ze(t);case"[object Boolean]":case"[object Date]":return new o(+t);case"[object DataView]":return function(t,r){var e=r?ze(t.buffer):t.buffer;return new t.constructor(e,t.byteOffset,t.byteLength)}(t,e);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return function(t,r){var e=r?ze(t.buffer):t.buffer;return new t.constructor(e,t.byteOffset,t.length)}(t,e);case"[object Map]":case"[object Set]":return new o;case"[object Number]":case"[object String]":return new o(t);case"[object RegExp]":return function(t){var r=new t.constructor(t.source,He.exec(t));return r.lastIndex=t.lastIndex,r}(t);case"[object Symbol]":return n=t,Be?Object(Be.call(n)):{}}}var Je=Object.create,Ve=function(){function t(){}return function(r){if(!G(r))return{};if(Je)return Je(r);t.prototype=r;var e=new t;return t.prototype=void 0,e}}(),Ge=Ve;var Ze=Y&&Y.isMap,Ke=Ze?D(Ze):function(t){return b(t)&&"[object Map]"==cr(t)};var Qe=Y&&Y.isSet,Xe=Qe?D(Qe):function(t){return b(t)&&"[object Set]"==cr(t)},tn="[object Arguments]",rn="[object Function]",en="[object Object]",nn={};function on(t,r,e,n,i,u){var a,s=1&r,l=2&r,f=4&r;if(e&&(a=i?e(t,n,i,u):e(t)),void 0!==a)return a;if(!G(t))return t;var c=E(t);if(c){if(a=function(t){var r=t.length,e=new t.constructor(r);return r&&"string"==typeof t[0]&&qe.call(t,"index")&&(e.index=t.index,e.input=t.input),e}(t),!s)return function(t,r){var e=-1,n=t.length;for(r||(r=Array(n));++e<n;)r[e]=t[e];return r}(t,a)}else{var d=cr(t),h=d==rn||"[object GeneratorFunction]"==d;if(L(t))return function(t,r){if(r)return t.slice();var e=t.length,n=Ce?Ce(e):new t.constructor(e);return t.copy(n),n}(t,s);if(d==en||d==tn||h&&!i){if(a=l||h?{}:function(t){return"function"!=typeof t.constructor||U(t)?{}:Ge(Re(t))}(t),!s)return l?function(t,r){return Le(t,Ie(t),r)}(t,function(t,r){return t&&Le(r,ke(r),t)}(a,t)):function(t,r){return Le(t,Wr(t),r)}(t,function(t,r){return t&&Le(r,Q(r),t)}(a,t))}else{if(!nn[d])return i?t:{};a=We(t,d,s)}}u||(u=new Ar);var p=u.get(t);if(p)return p;u.set(t,a),Xe(t)?t.forEach(function(n){a.add(on(n,r,e,n,t,u))}):Ke(t)&&t.forEach(function(n,o){a.set(o,on(n,r,e,o,t,u))});var m=c?void 0:(f?l?Ne:Jr:l?ke:Q)(t);return o(m||t,function(n,o){m&&(n=t[o=n]),Pe(a,o,on(n,r,e,o,t,u))}),a}nn[tn]=nn["[object Array]"]=nn["[object ArrayBuffer]"]=nn["[object DataView]"]=nn["[object Boolean]"]=nn["[object Date]"]=nn["[object Float32Array]"]=nn["[object Float64Array]"]=nn["[object Int8Array]"]=nn["[object Int16Array]"]=nn["[object Int32Array]"]=nn["[object Map]"]=nn["[object Number]"]=nn[en]=nn["[object RegExp]"]=nn["[object Set]"]=nn["[object String]"]=nn["[object Symbol]"]=nn["[object Uint8Array]"]=nn["[object Uint8ClampedArray]"]=nn["[object Uint16Array]"]=nn["[object Uint32Array]"]=!0,nn["[object Error]"]=nn[rn]=nn["[object WeakMap]"]=!1;function un(t){return"[object Array]"===Object.prototype.toString.call(t)}function an(t){return"[object Object]"===Object.prototype.toString.call(t)}function sn(t){return"[object String]"===Object.prototype.toString.call(t)}function ln(t){return t!=t}function fn(t){return!!function(t){return"[object Undefined]"===Object.prototype.toString.call(t)}(t)||(!!function(t){return"[object Null]"===Object.prototype.toString.call(t)}(t)||(!!function(t){if(an(t)){for(let r in t)return!1;return!0}return!1}(t)||(!!function(t){return!(!sn(t)||""!==t)}(t)||(!!function(t){return!!un(t)&&0===t.length}(t)||!!ln(t)))))}function cn(t){return!!un(t)&&(0!==t.length&&(1!==t.length||!fn(t[0])))}function dn(t){return!(!sn(t)||""===t)}function hn(t){return!0===(r=t)||!1===r||b(r)&&"[object Boolean]"==v(r);var r}function pn(t){let r=!1;if(dn(t))r=!isNaN(Number(t));else if(function(t){return"[object Number]"===Object.prototype.toString.call(t)}(t)){if(ln(t))return!1;r=!0}return r}var mn=/\s/;var yn=/^\s+/;function vn(t){return t?t.slice(0,function(t){for(var r=t.length;r--&&mn.test(t.charAt(r)););return r}(t)+1).replace(yn,""):t}var bn=/^[-+]0x[0-9a-f]+$/i,gn=/^0b[01]+$/i,wn=/^0o[0-7]+$/i,On=parseInt;function jn(t){if("number"==typeof t)return t;if(ot(t))return NaN;if(G(t)){var r="function"==typeof t.valueOf?t.valueOf():t;t=G(r)?r+"":r}if("string"!=typeof t)return 0===t?t:+t;t=vn(t);var e=gn.test(t);return e||wn.test(t)?On(t.slice(2),e?2:8):bn.test(t)?NaN:+t}var Sn=1/0;function $n(t){return t?(t=jn(t))===Sn||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0}function En(t){if(!pn(t))return 0;return $n(t)}function _n(t){if(!(dn(t)||pn(t)||ot(t)||function(t){return"[object BigInt]"===Object.prototype.toString.call(t)}(t)))return"";let r="";try{r=String(t)}catch(t){}try{r=t.toString()}catch(t){}return r}function Tn(t,r,e){var n=-1,o=t.length;r<0&&(r=-r>o?0:o+r),(e=e>o?o:e)<0&&(e+=o),o=r>e?0:e-r>>>0,r>>>=0;for(var i=Array(o);++n<o;)i[n]=t[n+r];return i}function Pn(t,r,e){var n=t.length;return e=void 0===e?n:e,!r&&e>=n?t:Tn(t,r,e)}function Ln(t,r,e,n){for(var o=t.length,i=e+(n?1:-1);n?i--:++i<o;)if(r(t[i],i,t))return i;return-1}function An(t){return t!=t}function Mn(t,r,e){return r==r?function(t,r,e){for(var n=e-1,o=t.length;++n<o;)if(t[n]===r)return n;return-1}(t,r,e):Ln(t,An,e)}var kn="\\ud800-\\udfff",Fn="["+kn+"]",Dn="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",xn="\\ud83c[\\udffb-\\udfff]",Cn="[^"+kn+"]",Rn="(?:\\ud83c[\\udde6-\\uddff]){2}",Yn="[\\ud800-\\udbff][\\udc00-\\udfff]",In="(?:"+Dn+"|"+xn+")"+"?",Nn="[\\ufe0e\\ufe0f]?",qn=Nn+In+("(?:\\u200d(?:"+[Cn,Rn,Yn].join("|")+")"+Nn+In+")*"),zn="(?:"+[Cn+Dn+"?",Dn,Rn,Yn,Fn].join("|")+")",Hn=RegExp(xn+"(?="+xn+")|"+zn+qn,"g");function Un(t){return mr(t)?function(t){return t.match(Hn)||[]}(t):function(t){return t.split("")}(t)}function Bn(t,r,e){if((t=Ut(t))&&(e||void 0===r))return vn(t);if(!t||!(r=Ht(r)))return t;var n=Un(t),o=Un(r),i=function(t,r){for(var e=-1,n=t.length;++e<n&&Mn(r,t[e],0)>-1;);return e}(n,o),u=function(t,r){for(var e=t.length;e--&&Mn(r,t[e],0)>-1;);return e}(n,o)+1;return Pn(n,i,u).join("")}function Wn(t){var r=$n(t),e=r%1;return r==r?e?r-e:r:0}function Jn(t,r,e){var n=null==t?0:t.length;return n?Tn(t,(r=e||void 0===r?1:Wn(r))<0?0:r,n):[]}var Vn=Array.prototype.reverse;function Gn(t){return!!pn(t)&&(t=En(t),"number"==typeof(r=t)&&r==Wn(r));var r}var Zn=l.isFinite,Kn=Math.min;var Qn=function(t){var r=Math[t];return function(t,e){if(t=jn(t),(e=null==e?0:Kn(Wn(e),292))&&Zn(t)){var n=(Ut(t)+"e").split("e");return+((n=(Ut(r(n[0]+"e"+(+n[1]+e)))+"e").split("e"))[0]+"e"+(+n[1]-e))}return r(t)}}("round"),Xn=Qn;function to(t){if(!pn(t))return 0;t=En(t);let r=Xn(t);return"0"===String(r)?0:r}function ro(t){if(!Gn(t))return!1;return to(t)>=0}function eo(t,r){if(!dn(t))return"";if(!ro(r))return"";if(0===(r=to(r)))return"";let e=t.length-r;return e<0&&(e=0),t.substring(e,e+r)}function no(t,r){return dn(t)&&ro(r)?0===(r=to(r))?t:eo(t,t.length-r):""}function oo(t,r){return dn(t)&&ro(r)?0===(r=to(r))?t:function(t,r){return dn(t)&&ro(r)?0===(r=to(r))?"":t.substring(0,r):""}(t,t.length-r):""}function io(t,r={}){let e=Vt(r,"excludeString");if(hn(e)||(e=!1),!dn(t))return"";let n=t=>t>="0"&&t<="9"||"."===t||"-"===t||"+"===t,o=Bn(t);if(e){let t=o.split("");for(let r=0;r<t.length;r++)if(n(t[r])){o=no(o,r),t=Jn(t,r);break}t=null==(i=t)?i:Vn.call(i);for(let r=0;r<t.length;r++)if(n(t[r])){o=oo(o,r);break}}var i;return o}function uo(t){let r=0,e=0,n=0,o=Lr(t);et(t,t=>{pn(t)?r+=1:sn(t)?e+=1:an(t)&&(n+=1)});let i="";return r===o?i="num":e===o?i="str":n===o?i="obj":r+e===o?i="str":console.log("eles in array are non-homogeneous",t),i}function ao(t,r,e={}){let n=[];if("num"!==r&&"str"!==r&&"files"!==r)throw new Error(`invalid type[${r}]`);if("num"===r)n=le(t,(t,r)=>({key:r,payload:t,value:En(t)}));else if("files"===r)n=le(t,(t,r)=>({key:r,payload:t,value:_n(t)}));else if("str"===r){let r=le(t,t=>io(t,{excludeString:!0})),e=0;et(r,t=>{pn(t)&&e++});let o=e===Lr(r);n=le(t,(t,e)=>{let n=t;return o?(n=r[e],n=En(n)):n=_n(n),{key:e,payload:t,value:n}})}return n}function so(t,r){let e=on(t,5);return e.sort((t,e)=>t[r].localeCompare(e[r],"standard",{numeric:!0})),e}function lo(t,r){let e=Ee(t,"value");return le(e,r?"key":"payload")}function fo(t,r){let e=so(t,"value");return le(e,r?"key":"payload")}function co(t,r){return!!an(t)&&(!(!dn(r)&&!pn(r))&&r in t)}function ho(t){if(an(t)){for(let r in t)return!0;return!1}return!1}function po(t){let r=Object.prototype.toString.call(t);return"[object Function]"===r||"[object AsyncFunction]"===r}function mo(t,r){let e=function(){let t,r,e=new Promise(function(){t=arguments[0],r=arguments[1]});return e.resolve=t,e.reject=r,e}();if(!un(t)&&!an(t))return e.reject("rs is not an array or object"),e;let n=!1;if(an(t)){n=!0;let r=[];et(t,(t,e)=>{r.push({k:e,v:t})}),t=r}po(r)||(r=function(t){return t});let o=-1,i=[];return t.reduce(function(t,e){return t.then(function(t){i.push(t),o+=1;let u=o,a=e;return n&&(u=e.k,a=e.v),po(r)?r(a,u):a})},Promise.resolve()).then(function(t){i.push(t),i=Jn(i),e.resolve(i)}).catch(function(t){e.reject(t)}),e}function yo(t,r=0){if(!pn(t))return"";if(!ro(r))return"";return t=En(t),Xn(t,r).toFixed(r)}let vo=async(t,r,e={})=>{r=Ee(r,"timeStart");let n=Vt(e,"uIni",1e3),o={};et(t,t=>{o[t.time]=t});let i={},u=n,a=0;et(r,(t,r)=>{et(o,e=>{if(e.time<=t.timeStart)return delete o[e.time],!0;if("long"===t.mode){if(e.Low<=t.priceStopLoss)return t.timeEnd=e.time,t.priceEnd=t.priceStopLoss,t.uProfitOrLoss=t.uTrade*(t.priceEnd/t.priceStart)-t.uTrade-2*t.uFee,t.rProfitOrLoss=t.uProfitOrLoss/t.uTrade,a+=t.uProfitOrLoss,t.uCumuProfitOrLoss=a,t.rCumuProfitOrLoss=yo(t.uCumuProfitOrLoss/n*100,2)+"%",u+=t.uProfitOrLoss,t.uEquity=u,t.modeResult=t.uProfitOrLoss<0?"loss":"profit",i[r]=t,!1;if(e.High>=t.priceTakeProfit)return t.timeEnd=e.time,t.priceEnd=t.priceTakeProfit,t.uProfitOrLoss=t.uTrade*(t.priceEnd/t.priceStart)-t.uTrade-2*t.uFee,t.rProfitOrLoss=t.uProfitOrLoss/t.uTrade,a+=t.uProfitOrLoss,t.uCumuProfitOrLoss=a,t.rCumuProfitOrLoss=yo(t.uCumuProfitOrLoss/n*100,2)+"%",u+=t.uProfitOrLoss,t.uEquity=u,t.modeResult=t.uProfitOrLoss<0?"loss":"profit",i[r]=t,!1}else{if(e.High>=t.priceStopLoss)return t.timeEnd=e.time,t.priceEnd=t.priceStopLoss,t.uProfitOrLoss=(t.priceStart-t.priceEnd)*(t.uTrade/t.priceStart)-2*t.uFee,t.rProfitOrLoss=t.uProfitOrLoss/t.uTrade,a+=t.uProfitOrLoss,t.uCumuProfitOrLoss=a,t.rCumuProfitOrLoss=yo(t.uCumuProfitOrLoss/n*100,2)+"%",u+=t.uProfitOrLoss,t.uEquity=u,t.modeResult=t.uProfitOrLoss<0?"loss":"profit",i[r]=t,!1;if(e.Low<=t.priceTakeProfit)return t.timeEnd=e.time,t.priceEnd=t.priceTakeProfit,t.uProfitOrLoss=(t.priceStart-t.priceEnd)*(t.uTrade/t.priceStart)-2*t.uFee,t.rProfitOrLoss=t.uProfitOrLoss/t.uTrade,a+=t.uProfitOrLoss,t.uCumuProfitOrLoss=a,t.rCumuProfitOrLoss=yo(t.uCumuProfitOrLoss/n*100,2)+"%",u+=t.uProfitOrLoss,t.uEquity=u,t.modeResult=t.uProfitOrLoss<0?"loss":"profit",i[r]=t,!1}})});{let t=[];et(r,(r,e)=>{let n=null;n=co(i,e)?i[e]:r,t.push(n)}),r=t}return r},bo=(t,r)=>r=le(r,r=>{if(!dn(r.modeResult))return r;let e=t(r.timeStart),n=t(r.timeEnd),o=e.format("YYYY-MM-DD"),i=n.format("YYYY-MM-DD"),u=t(o,"YYYY-MM-DD"),a=t(i,"YYYY-MM-DD").diff(u,"day")+1;r.dayHold=a;let s=0;return 1+r.rProfitOrLoss>=0&&(s=Math.pow(1+r.rProfitOrLoss,1/r.dayHold)-1),r.rProfitOrLossDay=s,r});function go(t,r){var e=[];return tt(t,function(t,n,o){r(t,n,o)&&e.push(t)}),e}function wo(t,r){return(E(t)?zr:go)(t,ae(r))}function Oo(t){return"number"==typeof t||b(t)&&"[object Number]"==v(t)}function jo(t){if(!pn(t))return!1;return En(t)>0}let So=(t,r,e,n,o)=>{if(!jo(r))throw new Error(`uIni[${r}] is not a positive number`);if(!dn(n))throw new Error(`invalid timeOhlcStart[${n}]`);if(!dn(o))throw new Error(`invalid timeOhlcEnd[${o}]`);e=Ee(e,"timeStart");let i=[],u=[];et(e,t=>{dn(t.modeResult)?i.push(t):u.push(t)});let a=Lr(e),s=Lr(i),l=Lr(u),f=yo(Lr(wo(e,{modeResult:"profit"}))/s*100,2)+"%",c=0,d="",h="",p=0,m="",y="",v="",b=0,g="",w=0,O=0,j=r,S=r,$={},E={};et(e,t=>{if(dn(t.modeResult)){j=Math.max(j,t.uEquity);let r=j-t.uEquity,e=yo(r/j*100,2)+"%";r>c&&(c=r,S=j,d=e)}{let r=null;r=1,dn(t.timeStart)&&(co($,t.timeStart)||($[t.timeStart]=0),$[t.timeStart]+=r*t.uTrade,co(E,t.timeStart)||(E[t.timeStart]=0),E[t.timeStart]+=1),dn(t.timeEnd)&&(co($,t.timeEnd)||($[t.timeEnd]=0),$[t.timeEnd]-=r*t.uTrade,co(E,t.timeEnd)||(E[t.timeEnd]=0),E[t.timeEnd]-=1)}});{let t=[];et($,(r,e)=>{if(!Oo(r))throw console.log("time",e),new Error(`invalid uTradeAll[${r}]`);t.push({time:e,uTradeAll:r})}),t=Ee(t,"time");let r=0,e=le(t,t=>(r+=t.uTradeAll,{...t,uAccm:r})),n={};et(e,t=>{n[t.time]=t.uAccm}),$=n}{let t=[];et(E,(r,e)=>{if(!Oo(r))throw console.log("time",e),new Error(`invalid numTradeAll[${r}]`);t.push({time:e,numTradeAll:r})}),t=Ee(t,"time");let r=0,e=le(t,t=>(r+=t.numTradeAll,{...t,nAccm:r})),n={};et(e,t=>{n[t.time]=t.nAccm}),E=n}e=le(e,t=>{let e=Vt($,t.timeStart,null);if(!Oo(e))throw new Error("invalid uTradeAll");e=Math.abs(e),t.uTradeAll=e;let n=yo(t.uTradeAll/r*100,2)+"%";t.rTradeAll=n,b<t.uTradeAll&&(b=t.uTradeAll,g=t.rTradeAll);let o=Vt(E,t.timeStart,null);if(!Oo(o))throw new Error("invalid numTradeAll");return t.numTradeAll=o,w<t.numTradeAll&&(w=t.numTradeAll),t});{let t=Lr(i)-1;p=Vt(i,`${t}.uEquity`,""),m=Vt(i,`${t}.uCumuProfitOrLoss`,""),y=Vt(i,`${t}.rCumuProfitOrLoss`,"")}{let t;t=S-r+b>0?c/(S-r+b):0,h=yo(100*t,2)+"%"}v=b>0&&Oo(m)?m/b:0,v=yo(100*v,2)+"%";{let t=0,r=0,e=0,n=0;et(i,t=>{let r=t.rProfitOrLossDay*t.dayHold;e+=r;let o=t.dayHold;n+=o}),n>0&&(t=e/n);let o=0;et(i,r=>{let e=r.rProfitOrLossDay-t,n=r.dayHold*(e*e);o+=n}),n>1&&(r=Math.sqrt(o/(n-1))),r>0&&(O=t/r*Math.sqrt(252)),O<-10&&(O=-10),O>10&&(O=10)}let _=t(n),T=t(o).diff(_,"day"),P=T/365,L="";{let t;t=0===r||0===P?0:(p-r)/r/P,L=`${yo(100*t,2)}%`}let A="";{let t;t=0===b||0===P?0:(p-r)/b/P,A=`${yo(100*t,2)}%`}return{btDays:T,btYears:yo(P,1),numTrade:a,numTradeFin:s,numTradeUnsettled:l,uTradeAllMax:b,rTradeAllMax:g,numTradeAllMax:w,uDrawdownMax:c,rDrawdownMax:d,rEquivalentDrawdownMax:h,rSharpe:O,rWin:f,uEquityFinal:p,uCumuProfitOrLossFinal:m,rCumuProfitOrLossFinal:y,rCumuProfitOrLossFinalNormYear:L,rEquivalentCumuProfitOrLossFinal:v,rEquivalentCumuProfitOrLossFinalNormYear:A}},$o=async(t,r,e,n={})=>{let o=Vt(r,"mode","");if("long"!==o&&"short"!==o)throw new Error(`invalid strategy.mode[${o}] not 'long' or 'short'`);let i=Vt(r,"keyOhlc","");if(!dn(i))throw new Error("invalid strategy.keyOhlc");let u=Vt(r,"conds",[]);if(!cn(u))throw new Error("invalid strategy.conds");let a=Lr(u),s=Vt(r,"settings",{});if(ho(s)||(s={uIni:1e3,uTrade:1,rTakeProfit:.05,rStopLoss:.03,rFee:5e-4}),!po(e))throw new Error("funGetSeries is not a function");let l=Vt(n,"withCalcOrderProfitOrLoss",!0),f=Vt(n,"withSummary",!0),c=await e(i),d={},h={};await mo(u,async t=>{let r=await e(t.key);co(h,t.key)||(h[t.key]={}),et(r,r=>{h[t.key][r.time]=r.param,co(d,r.time)||(d[r.time]=0),d[r.time]+=1})});let p=[];et(d,(t,r)=>{t===a&&p.push(r)}),p=function(t,r={}){if(!cn(t))return[];if(1===Lr(t))return t;let e=Vt(r,"localeCompare");hn(e)||(e=!1);let n=Vt(r,"returnIndex");hn(n)||(n=!1);let o=Vt(r,"compareKey",null),i=null;i=e?fo:lo;let u,a=uo(t);if(""===a)return[];if("obj"===a){if(!dn(o))return[];let a=le(t,(t,r)=>Vt(t,o,"")),s=uo(a);if("num"!==s&&"str"!==s)return[];{e&&(s="files");let o=i(ao(a,s,r),!0);u=n?o:le(o,r=>t[r])}}else"num"!==a&&"str"!==a||(e&&(a="files"),u=i(ao(t,a,r),n));return u}(p);let m={};et(p,t=>{m[t]=!0});let y={};et(p,t=>{y[t]={},et(u,r=>{y[t][r.key]=h[r.key][t]})});let v=Vt(nt(c),"time",""),b=Vt(Gt(c),"time",""),g=[];await mo(c,async t=>{let r=Vt(t,"time");if(!co(m,r))return!0;let e=!0;{let t=[];et(u,(e,n)=>{let o=y[r][e.key],i=Vt(e,"sym",">"),u=Vt(e,"th",0),a=Vt(e,"opr",null);"and"!==a&&"or"!==a&&(a="and");let s=!1;s=">"===i?o>u:o<u,t.push({opr:a,b:s})});let n=t.filter(t=>"and"===t.opr).every(t=>t.b),o=t.filter(t=>"or"===t.opr),i=0===o.length||o.some(t=>t.b);e=n&&i}let n=!1,i=!1;if(e&&("long"===o?n=!0:i=!0),n){let e={mode:"long",timeStart:r,priceStart:t.Close,uTrade:s.uTrade,rTakeProfit:s.rTakeProfit,priceTakeProfit:(1+s.rTakeProfit)*t.Close,rStopLoss:s.rStopLoss,priceStopLoss:(1-s.rStopLoss)*t.Close,timeEnd:"",priceEnd:"",modeResult:"",rFee:s.rFee,uFee:s.rFee*s.uTrade,uProfitOrLoss:"",rProfitOrLoss:"",uCumuProfitOrLoss:"",rCumuProfitOrLoss:"",uEquity:"",uTradeAll:"",rTradeAll:""};g.push(e)}else if(i){let e={mode:"short",timeStart:r,priceStart:t.Close,uTrade:s.uTrade,rTakeProfit:s.rTakeProfit,priceTakeProfit:(1-s.rTakeProfit)*t.Close,rStopLoss:s.rStopLoss,priceStopLoss:(1+s.rStopLoss)*t.Close,timeEnd:"",priceEnd:"",modeResult:"",rFee:s.rFee,uFee:s.rFee*s.uTrade,uProfitOrLoss:"",rProfitOrLoss:"",uCumuProfitOrLoss:"",rCumuProfitOrLoss:"",uEquity:"",uTradeAll:"",rTradeAll:""};g.push(e)}}),l&&(g=await vo(c,g,{uIni:s.uIni}));let w={timeTest:t().format("YYYY-MM-DDTHH:mm:ssZ"),timeOhlcStart:v,timeOhlcEnd:b,uIni:Vt(s,"uIni","")};if(f){g=bo(t,g);let r=So(t,s.uIni,g,v,b);w={...w,...r}}return{orders:g,summary:w}};let Eo=async(t,r,e,n,o,i={})=>{if(!jo(r))throw new Error(`uIni[${r}] is not a positive number`);if(!dn(n))throw new Error(`invalid timeOhlcStart[${n}]`);if(!dn(o))throw new Error(`invalid timeOhlcEnd[${o}]`);e=Ee(e,"timeStart");let u=r,a=0;e=le(e,t=>dn(t.modeResult)?(u+=t.uProfitOrLoss,t.uEquity=u,a+=t.uProfitOrLoss,t.uCumuProfitOrLoss=a,t.rCumuProfitOrLoss=yo(t.uCumuProfitOrLoss/r*100,2)+"%",t):t),e=bo(t,e);let s=So(t,r,e,n,o);return{timeTest:t().format("YYYY-MM-DDTHH:mm:ssZ"),timeOhlcStart:n,timeOhlcEnd:o,uIni:r,...s}},_o=async(t,r,e,n={})=>{let o=Vt(n,"withCalcOrderProfitOrLoss",!0),i=Vt(n,"withSummary",!0),u=0,a=[],s=null;var l;await mo(r,async(r,n)=>{try{s=await $o(t,r,e,{withCalcOrderProfitOrLoss:o,withSummary:!1});let n=Vt(r,"settings.uIni","");if(!Oo(n))throw new Error(`uIni[${n}] is not a number`);u+=n,Lr(s.orders)>=1&&(s.orders=le(s.orders,t=>(t.sid=r.sid,t)),a.push(s.orders))}catch(t){}}),a=null!=(l=a)&&l.length?de(l,1):[],Lr(a)>=2&&(a=Ee(a,"timeStart"));let f=Vt(s,"summary.timeOhlcStart",""),c=Vt(s,"summary.timeOhlcEnd","");if(!dn(f))throw new Error("invalid timeOhlcStart");if(!dn(c))throw new Error("invalid timeOhlcEnd");let d={timeTest:t().format("YYYY-MM-DDTHH:mm:ssZ"),timeOhlcStart:f,timeOhlcEnd:c};return i&&(d=await Eo(t,u,a,f,c)),{orders:a,summary:d}};function To(t,r={}){let e=Vt(r,"fs"),n=!1;try{e.statSync(t),n=!0}catch{n=!1}return n}function Po(t,r={}){let e=Vt(r,"fs");if(!To(t,{fs:e}))return!1;let n=e.lstatSync(t);return!n.isFile()&&!n.isSymbolicLink()}function Lo(t){return Po(t,{fs:r})}function Ao(t){if(!dn(t))return{path:"",isRoot:!1};for(;t.indexOf("\\\\")>=0;)t=t.replace("\\\\","\\");for(;t.indexOf("//")>=0;)t=t.replace("//","/");if(":"===eo(t,1))return{path:`${t}\\`,isRoot:!0};if("\\"===eo(t,1)){let r=oo(t,1);return":"===eo(r,1)?{path:t,isRoot:!0}:{path:r,isRoot:!1}}if("/"===eo(t,1)){let r=oo(t,1);return 0===r.length?{path:t,isRoot:!0}:{path:r,isRoot:!1}}return{path:t,isRoot:!1}}function Mo(t){if(!dn(t))return"";let r=Ao(t);if(r.isRoot)return r.path;let e=r.path;try{e=e.split("\\").pop().split("/").pop()}catch(t){}return e}function ko(t,r={}){let e=Vt(r,"fs");if(Po(t,{fs:e}))return{success:"input folder is already exists: "+t};if(To(t,{fs:e}))return{error:"input path already exists: "+t};try{e.mkdirSync(t,{recursive:!0})}catch(t){return{error:t}}return{success:"done: "+t}}function Fo(t,r,e={}){let n=null,o=Vt(e,"fs"),i=function(t){if(!dn(t))return"";let r=Ao(t);if(r.isRoot)return r.path;let e=Mo(t=r.path);if(!dn(e))return t;let n=Ao(t=oo(t,e.length));return n.isRoot,n.path}(t);Po(i,{fs:o})||ko(i,{fs:o});try{o.writeFileSync(t,r,"utf8")}catch(t){n=t}return null!==n?{error:n}:{success:t}}function Do(t,e,n={}){let o=null;if(!an(e)&&!un(e))return{error:"inp is not an object or array"};let i=Vt(n,"useFormat",null);hn(i)||(i=!1);let u="";try{u=i?JSON.stringify(e,null,2):JSON.stringify(e)}catch(t){o=t}return null!==o?{error:o}:Fo(t,u,{fs:r})}function xo(t){return function(t,r={}){let e=Vt(r,"fs");return!!To(t,{fs:e})&&!e.lstatSync(t).isDirectory()&&!e.lstatSync(t).isSymbolicLink()}(t,{fs:r})}function Co(t){let e=null,n=function(t,r={}){let e=null,n=Vt(r,"fs"),o="";try{o=n.readFileSync(t,"utf8")}catch(t){e=t}return null!==e?{error:e}:{success:o}}(t,{fs:r});if(n.error)return n;let o=n.success,i=null;try{i=JSON.parse(o)}catch(t){e=t}return null!==e?{error:e}:{success:i}}function Ro(t,r=1,e={}){let n=1,o=Vt(e,"path"),i=Vt(e,"fs");if(!Po(t,{fs:i}))throw new Error(`fd[${t}] is not a folder`);var u;return null!==r&&(Gn(u=r)&&to(u)>0)&&(r=to(r))<1&&(r=1),function t(e){let u=[];return Po(e,{fs:i})?(et(i.readdirSync(e),function(a){let s=o.resolve(e,a),l=null;try{l=i.statSync(s)}catch(t){}l&&l.isDirectory()?(u.push({isFolder:!0,level:n,path:s,name:o.basename(s)}),n+=1,(n<=r||null===r)&&(u=u.concat(t(s))),n-=1):u.push({isFolder:!1,level:n,path:s,name:o.basename(s)})}),u):u}(t)}function Yo(e,n=1){return Ro(e,n,{path:t,fs:r})}var Io=Y&&Y.isRegExp,No=Io?D(Io):function(t){return b(t)&&"[object RegExp]"==v(t)};function qo(t,r,e){return e&&"number"!=typeof e&&Se(t,r,e)&&(r=e=void 0),(e=void 0===e?4294967295:e>>>0)?(t=Ut(t))&&("string"==typeof r||null!=r&&!No(r))&&!(r=Ht(r))&&mr(t)?Pn(Un(t),0,e):t.split(r,e):[]}var zo=Array.prototype.join;function Ho(t){if(!dn(t))return"";let r=Mo(t),e=qo(r,".");if(Lr(e)<=1)return r;let n="";try{e=(a=null==(o=e)?0:o.length)?Tn(o,0,(i=a-(i=u||void 0===i?1:Wn(i)))<0?0:i):[],n=function(t,r){return null==t?"":zo.call(t,r)}(e,".")}catch(t){}var o,i,u,a;return n}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function Uo(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var Bo={exports:{}};!function(t){t.exports=function(){var t=1e3,r=6e4,e=36e5,n="millisecond",o="second",i="minute",u="hour",a="day",s="week",l="month",f="quarter",c="year",d="date",h="Invalid Date",p=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,m=/\[([^\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,y={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(t){var r=["th","st","nd","rd"],e=t%100;return"["+t+(r[(e-20)%10]||r[e]||r[0])+"]"}},v=function(t,r,e){var n=String(t);return!n||n.length>=r?t:""+Array(r+1-n.length).join(e)+t},b={s:v,z:function(t){var r=-t.utcOffset(),e=Math.abs(r),n=Math.floor(e/60),o=e%60;return(r<=0?"+":"-")+v(n,2,"0")+":"+v(o,2,"0")},m:function t(r,e){if(r.date()<e.date())return-t(e,r);var n=12*(e.year()-r.year())+(e.month()-r.month()),o=r.clone().add(n,l),i=e-o<0,u=r.clone().add(n+(i?-1:1),l);return+(-(n+(e-o)/(i?o-u:u-o))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:l,y:c,w:s,d:a,D:d,h:u,m:i,s:o,ms:n,Q:f}[t]||String(t||"").toLowerCase().replace(/s$/,"")},u:function(t){return void 0===t}},g="en",w={};w[g]=y;var O="$isDayjsObject",j=function(t){return t instanceof _||!(!t||!t[O])},S=function t(r,e,n){var o;if(!r)return g;if("string"==typeof r){var i=r.toLowerCase();w[i]&&(o=i),e&&(w[i]=e,o=i);var u=r.split("-");if(!o&&u.length>1)return t(u[0])}else{var a=r.name;w[a]=r,o=a}return!n&&o&&(g=o),o||!n&&g},$=function(t,r){if(j(t))return t.clone();var e="object"==typeof r?r:{};return e.date=t,e.args=arguments,new _(e)},E=b;E.l=S,E.i=j,E.w=function(t,r){return $(t,{locale:r.$L,utc:r.$u,x:r.$x,$offset:r.$offset})};var _=function(){function y(t){this.$L=S(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[O]=!0}var v=y.prototype;return v.parse=function(t){this.$d=function(t){var r=t.date,e=t.utc;if(null===r)return new Date(NaN);if(E.u(r))return new Date;if(r instanceof Date)return new Date(r);if("string"==typeof r&&!/Z$/i.test(r)){var n=r.match(p);if(n){var o=n[2]-1||0,i=(n[7]||"0").substring(0,3);return e?new Date(Date.UTC(n[1],o,n[3]||1,n[4]||0,n[5]||0,n[6]||0,i)):new Date(n[1],o,n[3]||1,n[4]||0,n[5]||0,n[6]||0,i)}}return new Date(r)}(t),this.init()},v.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},v.$utils=function(){return E},v.isValid=function(){return!(this.$d.toString()===h)},v.isSame=function(t,r){var e=$(t);return this.startOf(r)<=e&&e<=this.endOf(r)},v.isAfter=function(t,r){return $(t)<this.startOf(r)},v.isBefore=function(t,r){return this.endOf(r)<$(t)},v.$g=function(t,r,e){return E.u(t)?this[r]:this.set(e,t)},v.unix=function(){return Math.floor(this.valueOf()/1e3)},v.valueOf=function(){return this.$d.getTime()},v.startOf=function(t,r){var e=this,n=!!E.u(r)||r,f=E.p(t),h=function(t,r){var o=E.w(e.$u?Date.UTC(e.$y,r,t):new Date(e.$y,r,t),e);return n?o:o.endOf(a)},p=function(t,r){return E.w(e.toDate()[t].apply(e.toDate("s"),(n?[0,0,0,0]:[23,59,59,999]).slice(r)),e)},m=this.$W,y=this.$M,v=this.$D,b="set"+(this.$u?"UTC":"");switch(f){case c:return n?h(1,0):h(31,11);case l:return n?h(1,y):h(0,y+1);case s:var g=this.$locale().weekStart||0,w=(m<g?m+7:m)-g;return h(n?v-w:v+(6-w),y);case a:case d:return p(b+"Hours",0);case u:return p(b+"Minutes",1);case i:return p(b+"Seconds",2);case o:return p(b+"Milliseconds",3);default:return this.clone()}},v.endOf=function(t){return this.startOf(t,!1)},v.$set=function(t,r){var e,s=E.p(t),f="set"+(this.$u?"UTC":""),h=(e={},e[a]=f+"Date",e[d]=f+"Date",e[l]=f+"Month",e[c]=f+"FullYear",e[u]=f+"Hours",e[i]=f+"Minutes",e[o]=f+"Seconds",e[n]=f+"Milliseconds",e)[s],p=s===a?this.$D+(r-this.$W):r;if(s===l||s===c){var m=this.clone().set(d,1);m.$d[h](p),m.init(),this.$d=m.set(d,Math.min(this.$D,m.daysInMonth())).$d}else h&&this.$d[h](p);return this.init(),this},v.set=function(t,r){return this.clone().$set(t,r)},v.get=function(t){return this[E.p(t)]()},v.add=function(n,f){var d,h=this;n=Number(n);var p=E.p(f),m=function(t){var r=$(h);return E.w(r.date(r.date()+Math.round(t*n)),h)};if(p===l)return this.set(l,this.$M+n);if(p===c)return this.set(c,this.$y+n);if(p===a)return m(1);if(p===s)return m(7);var y=(d={},d[i]=r,d[u]=e,d[o]=t,d)[p]||1,v=this.$d.getTime()+n*y;return E.w(v,this)},v.subtract=function(t,r){return this.add(-1*t,r)},v.format=function(t){var r=this,e=this.$locale();if(!this.isValid())return e.invalidDate||h;var n=t||"YYYY-MM-DDTHH:mm:ssZ",o=E.z(this),i=this.$H,u=this.$m,a=this.$M,s=e.weekdays,l=e.months,f=e.meridiem,c=function(t,e,o,i){return t&&(t[e]||t(r,n))||o[e].slice(0,i)},d=function(t){return E.s(i%12||12,t,"0")},p=f||function(t,r,e){var n=t<12?"AM":"PM";return e?n.toLowerCase():n};return n.replace(m,function(t,n){return n||function(t){switch(t){case"YY":return String(r.$y).slice(-2);case"YYYY":return E.s(r.$y,4,"0");case"M":return a+1;case"MM":return E.s(a+1,2,"0");case"MMM":return c(e.monthsShort,a,l,3);case"MMMM":return c(l,a);case"D":return r.$D;case"DD":return E.s(r.$D,2,"0");case"d":return String(r.$W);case"dd":return c(e.weekdaysMin,r.$W,s,2);case"ddd":return c(e.weekdaysShort,r.$W,s,3);case"dddd":return s[r.$W];case"H":return String(i);case"HH":return E.s(i,2,"0");case"h":return d(1);case"hh":return d(2);case"a":return p(i,u,!0);case"A":return p(i,u,!1);case"m":return String(u);case"mm":return E.s(u,2,"0");case"s":return String(r.$s);case"ss":return E.s(r.$s,2,"0");case"SSS":return E.s(r.$ms,3,"0");case"Z":return o}return null}(t)||o.replace(":","")})},v.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},v.diff=function(n,d,h){var p,m=this,y=E.p(d),v=$(n),b=(v.utcOffset()-this.utcOffset())*r,g=this-v,w=function(){return E.m(m,v)};switch(y){case c:p=w()/12;break;case l:p=w();break;case f:p=w()/3;break;case s:p=(g-b)/6048e5;break;case a:p=(g-b)/864e5;break;case u:p=g/e;break;case i:p=g/r;break;case o:p=g/t;break;default:p=g}return h?p:E.a(p)},v.daysInMonth=function(){return this.endOf(l).$D},v.$locale=function(){return w[this.$L]},v.locale=function(t,r){if(!t)return this.$L;var e=this.clone(),n=S(t,r,!0);return n&&(e.$L=n),e},v.clone=function(){return E.w(this.$d,this)},v.toDate=function(){return new Date(this.valueOf())},v.toJSON=function(){return this.isValid()?this.toISOString():null},v.toISOString=function(){return this.$d.toISOString()},v.toString=function(){return this.$d.toUTCString()},y}(),T=_.prototype;return $.prototype=T,[["$ms",n],["$s",o],["$m",i],["$H",u],["$W",a],["$M",l],["$y",c],["$D",d]].forEach(function(t){T[t[1]]=function(r){return this.$g(r,t[0],t[1])}}),$.extend=function(t,r){return t.$i||(t(r,_,$),t.$i=!0),$},$.locale=S,$.isDayjs=j,$.unix=function(t){return $(1e3*t)},$.en=w[g],$.Ls=w,$.p={},$}()}(Bo);var Wo=Uo(Bo.exports);function Jo(t){if(!dn(t))return!1;let r="YYYY-MM-DDTHH:mm:ss";return t===Wo(t,r).format(r)}let Vo=(r,e)=>{let n={},o=async o=>{if(co(n,o))return n[o];let i=await(async n=>{let o=t.resolve(e,`${n}.json`),i=t.resolve(r,`${n}.json`),u="";if(xo(o))u=o;else{if(!xo(i))throw console.log(`fpParam[${o}] or fpOhlc[${i}] do not exist`),new Error(`invalid key[${n}]`);u=i}let a=Vt(Co(u),"success",null);if(!cn(a))throw new Error(`fp[${u}] no data`);return a})(o);return n[o]=i,i},i=[],u=async()=>{if(Lr(i)>0)return i;let t=t=>{let r=Yo(t);return r=wo(r,t=>"json"===function(t){if(!dn(t))return"";let r=qo(Mo(t),".");if(Lr(r)<=1)return"";let e="";try{e=Gt(r)}catch(t){}return e}(t.name)),r},n=[],u=t(r);await mo(u,async t=>{let r=Ho(t.name),e=await o(r);n.push({type:"ohlc",key:r,arr:e})});let a=t(e);return await mo(a,async t=>{let r=Ho(t.name),e=await o(r);n.push({type:"param",key:r,arr:e})}),i=n,n},a={},s=async(t,r)=>{if(!Jo(t))throw new Error("invalid timeStart");if(!Jo(r))throw new Error("invalid timeEnd");let e=`${t}:${r}`;if(co(a,e))return a[e];let n=await u(),o="1000-01-01T00:00:00",i="9999-01-01T00:00:00";if(et(n,t=>{let r=nt(t.arr),e=Gt(t.arr),n=Vt(r,"time",""),u=Vt(e,"time","");"ohlc"===t.type&&o<n&&(o=n),i>u&&(i=u)}),t<o)throw new Error(`timeStart[${t}] < timeStartData[${o}]`);if(r>i)throw new Error(`timeEnd[${r}] > timeEndData[${i}]`);let s=[];return et(n,e=>{let n=wo(e.arr,e=>e.time>=t&&e.time<=r);s.push({key:e.key,arr:n})}),a[e]=s,s},l={getKeysParam:()=>le(Yo(e),t=>Ho(t.name)),getTimeSeries:o,getTimeSeriesByTimeRange:async(t,r,e)=>{let n=await o(t);return n=wo(n,t=>t.time>=r&&t.time<=e),n},getTimeSeriesFull:u,getTimeSeriesFullByTimeRange:s,buildGetTimeSeriesByTimeRange:async(t,r)=>{let e=await s(t,r),n={};et(e,t=>{n[t.key]=t.arr});return async e=>{let o=Vt(n,e,[]);if(!cn(o))throw new Error(`can not get series by key[${e}] bewteen timeStart[${t}] and timeEnd[${r}]`);return o}},buildGetTimeValueByTimeRange:async(t,r)=>{let e=await s(t,r),n={};et(e,t=>{et(t.arr,r=>{let e=`${t.key}_${r.time}`;n[e]=r})});return async(e,o)=>{let i=Vt(n,`${e}_${o}`,{});if(!ho(i))throw new Error(`can not get value by key[${e}] and time[${o}] bewteen timeStart[${t}] and timeEnd[${r}]`);return i}}};return l};let Go=t.dirname(e.fileURLToPath("undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(__filename).href:"undefined"==typeof document?location.href:n&&"SCRIPT"===n.tagName.toUpperCase()&&n.src||new URL("w-trade-backtest.umd.js",document.baseURI).href)),Zo=(e,n)=>{let o=e=>{let n=t.resolve(Go,e);return r.readFileSync(n,"utf8")},i=o("tmp.html"),u=o("renderProfitPlot.js"),a=o("renderOrdersTable.js"),s=o("renderOrdersTimeline.js"),l=o("renderSummary.js");i=i.replace("{renderProfitPlot}",u),i=i.replace("{renderOrdersTable}",a),i=i.replace("{renderOrdersTimeline}",s),i=i.replace("{renderSummary}",l),i=i.replace("{name}",e.name),i=i.replace("{orders}",JSON.stringify(e.orders)),i=i.replace("{summary}",JSON.stringify(e.summary)),Fo(n,i,{fs:r})},Ko=(t,r,e,n,o,i={})=>{i&&i.skipSort||(e=e.slice().sort((t,r)=>t.timeStart<r.timeStart?-1:t.timeStart>r.timeStart?1:0));let u=e.length,a=0,s=0,l="",f=new Map;for(let t of e)dn(t.modeResult)&&(a++,"profit"===t.modeResult&&s++,l=t.uEquity),f.set(t.timeStart,(f.get(t.timeStart)||0)+t.uTrade),dn(t.timeEnd)&&f.set(t.timeEnd,(f.get(t.timeEnd)||0)-t.uTrade);let c=[...f.keys()].sort(),d=0,h=new Map;for(let t of c)d+=f.get(t),h.set(t,d);let p=0,m="";for(let t of e){let e=Math.abs(h.get(t.timeStart));e>p&&(p=e,m=yo(p/r*100,2)+"%")}let y,v=yo(s/a*100,2)+"%",b=t(o).diff(t(n),"day"),g=b/365;y=`${yo(100*(0===p||0===g?0:(l-r)/p/g),2)}%`;return{numTrade:u,numTradeFin:a,rWin:v,uTradeAllMax:p,rTradeAllMax:m,uEquityFinal:l,btDays:b,btYears:yo(g,1),rEquivalentCumuProfitOrLossFinalNormYear:y,timeOhlcStart:n,timeOhlcEnd:o}};var Qo=Math.max;var Xo,ti=(Xo=function(t,r,e){var n=null==t?0:t.length;if(!n)return-1;var o=null==e?0:Wn(e);return o<0&&(o=Qo(n+o,0)),Ln(t,ae(r),o)},function(t,r,e){var n=Object(t);if(!K(t)){var o=ae(r);t=Q(t),r=function(t){return o(n[t],t,n)}}var i=Xo(t,r,e);return i>-1?n[o?t[i]:i]:void 0});function ri(t,r,e){for(var n=-1,o=t.length;++n<o;){var i=t[n],u=r(i);if(null!=u&&(void 0===a?u==u&&!ot(u):e(u,a)))var a=u,s=i}return s}function ei(t,r){return t>r}function ni(t,r){return t<r}let oi=(t,r={})=>{let e=r.tp,n=r.sl,o=r.mode||"long";if(!(e>0&&n>0))throw new Error(`genKLinesTpSl: invalid tp[${e}] / sl[${n}]`);let i=t.length,u=new Array(i),a=new Float64Array(i),s=new Float64Array(i),l=new Float64Array(i);for(let r=0;r<i;r++){let e=t[r];u[r]=e.time,a[r]=e.Close,s[r]=e.High,l[r]=e.Low}let f=new Float64Array(i).fill(NaN),c=new Int8Array(i).fill(-1),d=new Float64Array(i).fill(NaN);for(let t=0;t<i-1;t++){let r=a[t];if(!(r>0))continue;let u=r*(1+e),h=r*(1-n);for(let a=t+1;a<i;a++)if("long"===o){if(l[a]<=h){f[t]=-n,c[t]=0,d[t]=a-t;break}if(s[a]>=u){f[t]=e,c[t]=1,d[t]=a-t;break}}else{let o=r*(1+n),i=r*(1-e);if(s[a]>=o){f[t]=-n,c[t]=0,d[t]=a-t;break}if(l[a]<=i){f[t]=e,c[t]=1,d[t]=a-t;break}}}return{time:u,pnl:f,win:c,hold:d}};let ii=(t,r,e,n,o)=>"long"===t?r*(n/e)-r-2*o:r/e*(e-n)-2*o,ui={runStrategy:$o,runStrategies:_o,runStrategiesAndBacktest:async(r,e,n,o,i,u,a,s={})=>{if(!Lo(e))throw new Error(`fdOhlc[${e}] is not a forder`);if(!Lo(n))throw new Error(`fdParam[${n}] is not a forder`);if(!cn(o))throw new Error("invalid strategies");let l=Vt(s,"writeOrders",!0),f=Vt(s,"writeSummary",!0),c=Vt(s,"writeReport",!0),d=Vo(e,n),h=await d.buildGetTimeSeriesByTimeRange(i,u),p=await _o(r,o,h,{});if(p.name="全部策略",l){let r="orders.json";Do(t.resolve(a,r),p.orders,{useFormat:!0})}if(f){let r="summary.json";Do(t.resolve(a,r),{name:p.name,summary:p.summary},{useFormat:!0}),console.log("summary",p.summary,Lr(p.orders))}if(c){let r="report.html",e=t.resolve(a,r);Zo(p,e)}return p},calcOrders:vo,calcOrdersRatio:bo,calcOrdersSummary:So,calcOrdersSummarySimple:Ko,calcSummary:Eo,closeAndSummaryOrders:async(r,e,n,o,i,u,a,s,l,f={})=>{if(!Lo(e))throw new Error(`fdOhlc[${e}] is not a forder`);if(!Lo(n))throw new Error(`fdParam[${n}] is not a forder`);if(!jo(o))throw new Error(`uIni[${o}] is not a positive number`);if(!dn(i))throw new Error(`invalid timeOhlcStart[${i}]`);if(!dn(u))throw new Error(`invalid timeOhlcEnd[${u}]`);if(!dn(a))throw new Error(`invalid keyOhlc[${a}]`);if(!un(s))throw new Error(`invalid ordersSubmit[${s}]`);if(!dn(l))throw new Error(`invalid fdTest[${l}]`);let c=Vt(f,"writeOrders",!0),d=Vt(f,"writeSummary",!0),h=Vt(f,"writeReport",!0),p=Vo(e,n),m=r(i),y=r(u).diff(m,"hour")/4;if(y!==to(y))throw new Error(`timeOhlcStart[${i}] to timeOhlcEnd[${u}] are not hour intervals`);let v=await p.buildGetTimeSeriesByTimeRange(i,u),b=await v(a),g=await vo(b,s,{uIni:o}),w=await Eo(r,o,g,i,u);console.log("summary",w,Lr(g));let O={name:"全部策略",orders:g,summary:w};if(c){let r="orders.json";Do(t.resolve(l,r),O.orders,{useFormat:!0})}if(d){let r="summary.json";Do(t.resolve(l,r),{name:O.name,summary:O.summary},{useFormat:!0}),console.log("summary",O.summary,Lr(O.orders))}if(h){let r="report.html",e=t.resolve(l,r);Zo(O,e)}},genReport:async(r,e,n={})=>{if(!dn(e))throw new Error("invalid fpOrders");if(!xo(e))throw new Error(`fpOrders[${e}] is not a file`);let o=Vt(Co(e),"success",null);if(!cn(o))throw new Error(`orders in fpOrders[${e}] is not an effective array`);let i=Vt(n,"fpOut","");dn(i)||(i=t.resolve(t.dirname(e),"report.html"));let u=Vt(n,"name","");dn(u)||(u=t.basename(t.dirname(t.resolve(e))));let a=Vt(n,"uIni",null);if(!pn(a)){let t=ti(o,t=>pn(t.uEquity)&&pn(t.uCumuProfitOrLoss));a=t?t.uEquity-t.uCumuProfitOrLoss:1e3}let s=Vt(n,"timeOhlcStart","");var l;dn(s)||(s=(l=le(o,"timeStart"))&&l.length?ri(l,rt,ni):void 0);let f=Vt(n,"timeOhlcEnd","");dn(f)||(f=function(t){return t&&t.length?ri(t,rt,ei):void 0}(le(o,t=>dn(t.timeEnd)?t.timeEnd:t.timeStart)));let c=Vt(n,"withWriteSummary",!1),d=await Eo(r,a,o,s,f);return c&&Do(t.resolve(t.dirname(i),"summary.json"),{name:u,summary:d},{useFormat:!0}),Zo({name:u,orders:o,summary:d},i),{orders:o,summary:d,fpOut:i}},genReportCore:Zo,genKLinesTpSl:oi,buildKLinesTpSl:async(e,n,o,i={})=>{if(!Lo(e))throw new Error(`fdOhlc[${e}] is not a folder`);if(!Lo(n))throw new Error(`fdParam[${n}] is not a folder`);if(!dn(o))throw new Error("invalid fpJson");let u=Vo(e,n),{keyOhlc:a,ts:s,te:l,tps:f=[4,5,6,7,8,9,10],modes:c=["long","short"]}=i;if(!dn(a))throw new Error("invalid opt.keyOhlc");if(!Jo(s))throw new Error("invalid opt.ts");if(!Jo(l))throw new Error("invalid opt.te");let d=await u.getTimeSeriesByTimeRange(a,s,l),h=d.length,p=d.map(t=>t.time),m={};for(let t=0;t<h;t++)m[p[t]]={close:d[t].Close};for(let t of c)for(let r of f){let{win:e,hold:n}=oi(d,{tp:r/100,sl:r/100,mode:t}),o=`${t}_${r}`;for(let t=0;t<h;t++){let r=e[t],i=r>=0&&Number.isFinite(n[t])?p[t+n[t]]:null;m[p[t]][o]={win:r,timeEnd:i}}}let y={meta:{keyOhlc:a,ts:s,te:l,tps:f,modes:c,nBars:h},bars:m},v=t.resolve(o),b=t.dirname(v);return Lo(b)||ko(b,{fs:r}),r.writeFileSync(v,JSON.stringify(y)),y},loadKLinesTpSl:e=>{if(!dn(e))throw new Error("invalid fpJson");if(!xo(e))throw new Error(`fpJson[${e}] is not a file`);let n=JSON.parse(r.readFileSync(t.resolve(e),"utf8")),o=n.meta,i=n.bars;return{meta:o,bars:i,ordersFromBars:(t,r,e,n={})=>{let{uTrade:o=1,uIni:u=1e3,rFee:a=5e-4,maxExitTime:s=null,skipSort:l=!1}=n,f=`${t}_${r}`,c=r/100,d=a*o,h=(l?e:[...e].sort()).filter(t=>i[t]).map(r=>{let e=i[r].close;return{mode:t,timeStart:r,priceStart:e,uTrade:o,rTakeProfit:c,priceTakeProfit:"long"===t?(1+c)*e:(1-c)*e,rStopLoss:c,priceStopLoss:"long"===t?(1-c)*e:(1+c)*e,timeEnd:"",priceEnd:"",modeResult:"",rFee:a,uFee:d,uProfitOrLoss:"",rProfitOrLoss:"",uCumuProfitOrLoss:"",rCumuProfitOrLoss:"",uEquity:"",uTradeAll:"",rTradeAll:""}}),p=u,m=0;for(let t of h){let r=i[t.timeStart][f];!r||r.win<0||!r.timeEnd||(s&&r.timeEnd>=s||(t.timeEnd=r.timeEnd,t.priceEnd=1===r.win?t.priceTakeProfit:t.priceStopLoss,t.uProfitOrLoss=ii(t.mode,t.uTrade,t.priceStart,t.priceEnd,t.uFee),t.rProfitOrLoss=t.uProfitOrLoss/t.uTrade,m+=t.uProfitOrLoss,t.uCumuProfitOrLoss=m,t.rCumuProfitOrLoss=yo(t.uCumuProfitOrLoss/u*100,2)+"%",p+=t.uProfitOrLoss,t.uEquity=p,t.modeResult=t.uProfitOrLoss<0?"loss":"profit"))}return h}}},buildStrategyFastSession:(t,r={})=>{let e=Vt(r,"mode","");if("long"!==e&&"short"!==e)throw new Error(`invalid opt.mode[${e}] not 'long' or 'short'`);let n=Vt(r,"arrOhlc",null);if(!cn(n))throw new Error("invalid opt.arrOhlc");let o=Vt(r,"serieses",null);if(!ho(o))throw new Error("invalid opt.serieses");let i=n.length,u=new Array(i),a=new Float64Array(i),s=new Map;for(let t=0;t<i;t++){let r=n[t];u[t]=r.time,a[t]=r.Close,s.set(r.time,t)}let l=i>0?u[0]:"",f=i>0?u[i-1]:"",c={};for(let t of Object.keys(o)){let r=new Float64Array(i).fill(NaN);for(let e of o[t]){let t=s.get(e.time);void 0!==t&&(r[t]=e.param)}c[t]=r}let d=new Map,h=(t,r)=>{let o=`${t}_${r}`,i=d.get(o);return i||(i=oi(n,{tp:t,sl:r,mode:e}),d.set(o,i)),i},p=Vt(r,"tpsls",[]);if(cn(p))for(let t of p)h(t.tp,t.sl);return{evaluate:(r={},n={})=>{let o=Vt(r,"conds",[]);if(!cn(o))throw new Error("invalid conds");let s=Vt(r,"tp",null),d=Vt(r,"sl",null),p=Vt(r,"settings",{}),m=Vt(p,"uIni",1e3),y=Vt(p,"uTrade",1),v=Vt(p,"rFee",5e-4),b=v*y,g=Vt(n,"withOrders",!1),w=h(s,d),O=w.win,j=w.hold,S=o.map(t=>{let r=Vt(t,"key",""),e=c[r];if(!e)throw new Error(`invalid cond.key[${r}] not in opt.serieses`);let n=Vt(t,"sym",">"),o=Vt(t,"th",0),i=Vt(t,"opr",null);return"and"!==i&&"or"!==i&&(i="and"),{arr:e,gt:">"===n,th:o,isOr:"or"===i}}),$=[],E=m,_=0;for(let t=0;t<i;t++){let r=!1,n=!0,o=!1,i=!1;for(let e of S){let u=e.arr[t];if(Number.isNaN(u)){r=!0;break}let a=e.gt?u>e.th:u<e.th;e.isOr?(o=!0,i=i||a):n=n&&a}if(r||!n||o&&!i)continue;let l,f=a[t],c=O[t];if(l=g?{mode:e,timeStart:u[t],priceStart:f,uTrade:y,rTakeProfit:s,priceTakeProfit:"long"===e?(1+s)*f:(1-s)*f,rStopLoss:d,priceStopLoss:"long"===e?(1-d)*f:(1+d)*f,timeEnd:"",priceEnd:"",modeResult:"",rFee:v,uFee:b,uProfitOrLoss:"",rProfitOrLoss:"",uCumuProfitOrLoss:"",rCumuProfitOrLoss:"",uEquity:"",uTradeAll:"",rTradeAll:""}:{timeStart:u[t],timeEnd:"",uTrade:y,uProfitOrLoss:"",uEquity:"",modeResult:""},c>=0){let r;r=1===c?"long"===e?(1+s)*f:(1-s)*f:"long"===e?(1-d)*f:(1+d)*f;let n=ii(e,y,f,r,b);_+=n,E+=n,l.timeEnd=u[t+j[t]],l.uProfitOrLoss=n,l.uEquity=E,l.modeResult=n<0?"loss":"profit",g&&(l.priceEnd=r,l.rProfitOrLoss=n/y,l.uCumuProfitOrLoss=_,l.rCumuProfitOrLoss=yo(_/m*100,2)+"%")}$.push(l)}let T=Ko(t,m,$,l,f,{skipSort:!0});return g?{orders:$,summary:T}:T}}}};return ui});
|
|
7
7
|
//# sourceMappingURL=w-trade-backtest.umd.js.map
|