w-trade-backtest 1.1.17 → 1.1.19
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 +1 -1
- package/docs/buildStrategyFastSession.mjs.html +1 -1
- package/docs/calcOrders.mjs.html +1 -1
- package/docs/calcOrdersRatio.mjs.html +1 -1
- package/docs/calcOrdersSummary.mjs.html +1 -1
- package/docs/calcOrdersSummarySimple.mjs.html +1 -1
- package/docs/calcSummary.mjs.html +1 -1
- package/docs/closeAndSummaryOrders.mjs.html +1 -1
- package/docs/genKLinesTpSl.mjs.html +1 -1
- package/docs/genReport.mjs.html +1 -1
- package/docs/genReportCore.mjs.html +1 -1
- package/docs/global.html +1 -1
- package/docs/index.html +1 -1
- package/docs/loadKLinesTpSl.mjs.html +1 -1
- package/docs/runStrategies.mjs.html +1 -1
- package/docs/runStrategiesAndBacktest.mjs.html +1 -1
- package/docs/runStrategy.mjs.html +1 -1
- package/docs/settleOrderPnl.mjs.html +1 -1
- package/package.json +4 -4
- package/toolg/gDistRollup.mjs +4 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* w-trade-backtest v1.1.
|
|
2
|
+
* w-trade-backtest v1.1.19
|
|
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,l=a||s||Function("return this")(),f=l.Symbol,c=Object.prototype,d=c.hasOwnProperty,h=c.toString,m=f?f.toStringTag:void 0;var p=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,m),e=t[m];try{t[m]=void 0;var n=!0}catch(t){}var o=h.call(t);return n&&(r?t[m]=e:delete t[m]),o}(t):function(t){return p.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,S=w.propertyIsEnumerable,j=g(function(){return arguments}())?g:function(t){return b(t)&&O.call(t,"callee")&&!S.call(t,"callee")},E=j,_=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){}}(),N=Y&&Y.isTypedArray,I=N?D(N):function(t){return b(t)&&k(t.length)&&!!F[v(t)]},q=Object.prototype.hasOwnProperty;function z(t,r){var e=_(t),n=!e&&E(t),o=!e&&!n&&L(t),i=!e&&!n&&!o&&I(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 G(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 V(t){var r=typeof t;return null!=t&&("object"==r||"function"==r)}function Z(t){if(!V(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 X(t){return K(t)?z(t):G(t)}var Q=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,X)}),tt=Q;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,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\]$/,mt=Function.prototype,pt=Object.prototype,yt=mt.toString,vt=pt.hasOwnProperty,bt=RegExp("^"+yt.call(vt).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function gt(t){return!(!V(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 St=Object.prototype.hasOwnProperty;var jt=Object.prototype.hasOwnProperty;function Et(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 $t(t,r){for(var e=t.length;e--;)if(_t(t[e][0],r))return e;return-1}Et.prototype.clear=function(){this.__data__=Ot?Ot(null):{},this.size=0},Et.prototype.delete=function(t){var r=this.has(t)&&delete this.__data__[t];return this.size-=r?1:0,r},Et.prototype.get=function(t){var r=this.__data__;if(Ot){var e=r[t];return"__lodash_hash_undefined__"===e?void 0:e}return St.call(r,t)?r[t]:void 0},Et.prototype.has=function(t){var r=this.__data__;return Ot?void 0!==r[t]:jt.call(r,t)},Et.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 Et,map:new(Lt||Pt),string:new Et}},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),Nt=Yt;function It(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(_(t))return It(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]:Nt(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 Gt(t,r,e){var n=null==t?void 0:Jt(t,r);return void 0===n?e:n}function Vt(t){var r=null==t?0:t.length;return r?t[r-1]:void 0}var Zt=wt(l,"DataView"),Kt=wt(l,"Promise"),Xt=wt(l,"Set"),Qt=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(Xt),lr=dt(Qt),fr=v;(Zt&&fr(new Zt(new ArrayBuffer(1)))!=or||Lt&&fr(new Lt)!=tr||Kt&&fr(Kt.resolve())!=rr||Xt&&fr(new Xt)!=er||Qt&&fr(new Qt)!=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"),mr=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");function pr(t){return mr.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}",Sr="[\\ud800-\\udbff][\\udc00-\\udfff]",jr="(?:"+br+"|"+gr+")"+"?",Er="[\\ufe0e\\ufe0f]?",_r=Er+jr+("(?:\\u200d(?:"+[wr,Or,Sr].join("|")+")"+Er+jr+")*"),$r="(?:"+[wr+br+"?",br,Or,Sr,vr].join("|")+")",Tr=RegExp(gr+"(?="+gr+")|"+$r+_r,"g");function Pr(t){return pr(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:G(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 m=t[c],p=r[c];if(n)var y=u?n(p,m,c,r,t,i):n(m,p,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)&&(m===t||o(m,t,e,n,i)))return h.push(r)})){d=!1;break}}else if(m!==p&&!o(m,p,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,Nr=Yr?Yr.valueOf:void 0;function Ir(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:Ir(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,X,Wr)}var Gr=Object.prototype.hasOwnProperty;var Vr="[object Arguments]",Zr="[object Array]",Kr="[object Object]",Xr=Object.prototype.hasOwnProperty;function Qr(t,r,e,n,o,i){var u=_(t),a=_(r),s=u?Zr:cr(t),l=a?Zr:cr(r),f=(s=s==Vr?Kr:s)==Kr,c=(l=l==Vr?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||I(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 _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=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(Nr)return Nr.call(t)==Nr.call(r)}return!1}(t,r,s,e,n,o,i);if(!(1&e)){var h=f&&Xr.call(t,"__wrapped__"),m=c&&Xr.call(r,"__wrapped__");if(h||m){var p=h?t.value():t,y=m?r.value():r;return i||(i=new Ar),o(p,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:Gr.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 m=u;++l<s;){var p=t[f=a[l]],y=r[f];if(n)var v=u?n(y,p,f,r,t,i):n(p,y,f,t,r,i);if(!(void 0===v?p===y||o(p,y,e,n,i):v)){h=!1;break}m||(m="constructor"==f)}if(h&&!m){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:Qr(t,r,e,n,te,o))}function re(t){return t==t&&!V(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=X(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)&&(_(t)||E(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=Gt(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(_(t)?It:se)(t,ae(r))}var fe=f?f.isConcatSpreadable:void 0;function ce(t){return _(t)||E(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):Ir(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 me(t,r,e){r=r.length?It(r,function(t){return _(t)?function(r){return Jt(r,1===t.length?t[0]:t)}:t}):[rt];var n=-1;return r=It(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:It(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 pe=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),Se=Oe;function je(t,r,e){if(!V(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 Ee=function(t,r){return Se(function(t,r,e){return r=pe(void 0===r?t.length-1:r,0),function(){for(var n=arguments,o=-1,i=pe(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&&je(t,r[0],r[1])?r=[]:e>2&&je(r[0],r[1],r[2])&&(r=[r[0]]),me(t,de(r,1),[])}),_e=Ee;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)&&_t(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(!V(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;)Ir(r,Wr(t)),t=Re(t);return r}:Hr,Ne=Ye;function Ie(t){return qr(t,ke,Ne)}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,Ge=function(){function t(){}return function(r){if(!V(r))return{};if(Je)return Je(r);t.prototype=r;var e=new t;return t.prototype=void 0,e}}(),Ve=Ge;var Ze=Y&&Y.isMap,Ke=Ze?D(Ze):function(t){return b(t)&&"[object Map]"==cr(t)};var Xe=Y&&Y.isSet,Qe=Xe?D(Xe):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(!V(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=l||h?{}:function(t){return"function"!=typeof t.constructor||U(t)?{}:Ve(Re(t))}(t),!s)return l?function(t,r){return Le(t,Ne(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,X(r),t)}(a,t))}else{if(!nn[d])return i?t:{};a=We(t,d,s)}}u||(u=new Ar);var m=u.get(t);if(m)return m;u.set(t,a),Qe(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 p=c?void 0:(f?l?Ie:Jr:l?ke:X)(t);return o(p||t,function(n,o){p&&(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 mn(t){let r=!1;if(dn(t)){if(""===t.trim())return!1;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 pn=/\s/;var yn=/^\s+/;function vn(t){return t?t.slice(0,function(t){for(var r=t.length;r--&&pn.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 Sn(t){if("number"==typeof t)return t;if(ot(t))return NaN;if(V(t)){var r="function"==typeof t.valueOf?t.valueOf():t;t=V(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 jn=1/0;function En(t){return t?(t=Sn(t))===jn||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0}function _n(t){if(!mn(t))return 0;return En(t)}function $n(t){if(!(dn(t)||mn(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]",Nn="(?:"+Dn+"|"+xn+")"+"?",In="[\\ufe0e\\ufe0f]?",qn=In+Nn+("(?:\\u200d(?:"+[Cn,Rn,Yn].join("|")+")"+In+Nn+")*"),zn="(?:"+[Cn+Dn+"?",Dn,Rn,Yn,Fn].join("|")+")",Hn=RegExp(xn+"(?="+xn+")|"+zn+qn,"g");function Un(t){return pr(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=En(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 Gn=Array.prototype.reverse;function Vn(t,r={}){let e=Gt(r,"useLimitSafe",null);return hn(e)||(e=!1),!!mn(t)&&(t=_n(t),e?Number.isSafeInteger(t):"number"==typeof(n=t)&&n==Wn(n));var n}var Zn=l.isFinite,Kn=Math.min;var Xn=function(t){var r=Math[t];return function(t,e){if(t=Sn(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"),Qn=Xn;function to(t,r={}){let e=Gt(r,"useClampSafe",null);hn(e)||(e=!1);let n=Gt(r,"useLimitSafe",null);hn(n)||(n=!1);let o=Gt(r,"returnWithStateAndMsg",null);hn(o)||(o=!1);let i=t=>o?{state:"success",msg:t}:t,u=t=>{if(o)return{state:"error",msg:t};throw new Error(t)};if(!mn(t))return i(0);let a=null;try{t=_n(t),a=Qn(t),e&&(a>Number.MAX_SAFE_INTEGER?a=Number.MAX_SAFE_INTEGER:a<Number.MIN_SAFE_INTEGER&&(a=Number.MIN_SAFE_INTEGER))}catch(t){return u(t.toString())}return n&&!Number.isSafeInteger(Number(a))?u(`v[${t}] is not a safe integer`):("0"===String(a)&&(a=0),i(a))}function ro(t,r={}){if(!Vn(t,r))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=Gt(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:Gn.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,r){let e=le(r,r=>({key:r,value:_n(t[r])}));return le(_e(e,"value"),"key")}function ao(t,r){let e=le(r,r=>io(t[r],{excludeString:!0})),n=Lr(e)>0&&e.every(t=>mn(t)),o=le(r,(r,o)=>({key:r,value:n?_n(e[o]):$n(t[r])}));return le(_e(o,"value"),"key")}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=le(r,r=>({key:r,value:$n(t[r])}));return le(so(e,"value"),"key")}function fo(t,r){let{nums:e,strs:n,others:o}=function(t){let r=[],e=[],n=[];return et(t,(t,o)=>{mn(t)?r.push(o):dn(t)&&""!==t.trim()?e.push(o):n.push(o)}),{nums:r,strs:e,others:n}}(t);if(r){return[...lo(t,[...e,...n].sort((t,r)=>t-r)),...o]}return[...uo(t,e),...ao(t,n),...o]}function co(t,r){return!!an(t)&&(!(!dn(r)&&!mn(r))&&r in t)}function ho(t){if(an(t)){for(let r in t)return!0;return!1}return!1}function mo(t){return Z(t)}function po(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}mo(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),mo(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(!mn(t))return"";if(!ro(r))return"";return t=_n(t),Qn(t,r).toFixed(r)}let vo=async(t,r,e={})=>{r=_e(r,"timeStart");let n=Gt(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(_(t)?zr:go)(t,ae(r))}function Oo(t){return"number"==typeof t||b(t)&&"[object Number]"==v(t)}function So(t){if(!mn(t))return!1;return _n(t)>0}let jo=(t,r,e,n,o)=>{if(!So(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),l=Lr(u),f=yo(Lr(wo(e,{modeResult:"profit"}))/s*100,2)+"%",c=0,d="",h="",m=0,p="",y="",v="",b=0,g="",w=0,O=0,S=r,j=r,E={},_={};et(e,t=>{if(dn(t.modeResult)){S=Math.max(S,t.uEquity);let r=S-t.uEquity,e=yo(r/S*100,2)+"%";r>c&&(c=r,j=S,d=e)}{let r=null;r=1,dn(t.timeStart)&&(co(E,t.timeStart)||(E[t.timeStart]=0),E[t.timeStart]+=r*t.uTrade,co(_,t.timeStart)||(_[t.timeStart]=0),_[t.timeStart]+=1),dn(t.timeEnd)&&(co(E,t.timeEnd)||(E[t.timeEnd]=0),E[t.timeEnd]-=r*t.uTrade,co(_,t.timeEnd)||(_[t.timeEnd]=0),_[t.timeEnd]-=1)}});{let t=[];et(E,(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=le(t,t=>(r+=t.uTradeAll,{...t,uAccm:r})),n={};et(e,t=>{n[t.time]=t.uAccm}),E=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=le(t,t=>(r+=t.numTradeAll,{...t,nAccm:r})),n={};et(e,t=>{n[t.time]=t.nAccm}),_=n}e=le(e,t=>{let e=Gt(E,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=Gt(_,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;m=Gt(i,`${t}.uEquity`,""),p=Gt(i,`${t}.uCumuProfitOrLoss`,""),y=Gt(i,`${t}.rCumuProfitOrLoss`,"")}{let t;t=j-r+b>0?c/(j-r+b):0,h=yo(100*t,2)+"%"}v=b>0&&Oo(p)?p/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:(m-r)/r/P,L=`${yo(100*t,2)}%`}let A="";{let t;t=0===b||0===P?0:(m-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:m,uCumuProfitOrLossFinal:p,rCumuProfitOrLossFinal:y,rCumuProfitOrLossFinalNormYear:L,rEquivalentCumuProfitOrLossFinal:v,rEquivalentCumuProfitOrLossFinalNormYear:A}},Eo=async(t,r,e,n={})=>{let o=Gt(r,"mode","");if("long"!==o&&"short"!==o)throw new Error(`invalid strategy.mode[${o}] not 'long' or 'short'`);let i=Gt(r,"keyOhlc","");if(!dn(i))throw new Error("invalid strategy.keyOhlc");let u=Gt(r,"conds",[]);if(!cn(u))throw new Error("invalid strategy.conds");let a=Lr(u),s=Gt(r,"settings",{});if(ho(s)||(s={uIni:1e3,uTrade:1,rTakeProfit:.05,rStopLoss:.03,rFee:5e-4}),!mo(e))throw new Error("funGetSeries is not a function");let l=Gt(n,"withCalcOrderProfitOrLoss",!0),f=Gt(n,"withSummary",!0),c=await e(i),d={},h={};await po(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 m=[];et(d,(t,r)=>{t===a&&m.push(r)}),m=function(t,r={}){if(!cn(t))return[];let e=Gt(r,"localeCompare");hn(e)||(e=!1);let n=Gt(r,"returnIndex");if(hn(n)||(n=!1),1===Lr(t))return n?[0]:t;let o=Gt(r,"compareKey",null),i=t;if(t.every(t=>an(t))){if(!dn(o))return[];i=le(t,t=>Gt(t,o,""))}let u=fo(i,e);return n?u:le(u,r=>t[r])}(m);let p={};et(m,t=>{p[t]=!0});let y={};et(m,t=>{y[t]={},et(u,r=>{y[t][r.key]=h[r.key][t]})});let v=Gt(nt(c),"time",""),b=Gt(Vt(c),"time",""),g=[];await po(c,async t=>{let r=Gt(t,"time");if(!co(p,r))return!0;let e=!0;{let t=[];et(u,(e,n)=>{let o=y[r][e.key],i=Gt(e,"sym",">"),u=Gt(e,"th",0),a=Gt(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:Gt(s,"uIni","")};if(f){g=bo(t,g);let r=jo(t,s.uIni,g,v,b);w={...w,...r}}return{orders:g,summary:w}};let _o=async(t,r,e,n,o,i={})=>{if(!So(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=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=jo(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=Gt(n,"withCalcOrderProfitOrLoss",!0),i=Gt(n,"withSummary",!0),u=0,a=[],s=null;var l;await po(r,async(r,n)=>{try{s=await Eo(t,r,e,{withCalcOrderProfitOrLoss:o,withSummary:!1});let n=Gt(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=_e(a,"timeStart"));let f=Gt(s,"summary.timeOhlcStart",""),c=Gt(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 _o(t,u,a,f,c)),{orders:a,summary:d}};function To(t,r={}){let e=Gt(r,"fs"),n=!1;try{e.statSync(t),n=!0}catch{n=!1}return n}function Po(t,r={}){let e=Gt(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=Gt(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=Gt(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=Gt(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=Gt(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=Gt(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=Gt(e,"path"),i=Gt(e,"fs");if(!Po(t,{fs:i}))throw new Error(`fd[${t}] is not a folder`);return null!==r&&function(t,r={}){return!!Vn(t,r)&&to(t)>0}(r)&&(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 No=Y&&Y.isRegExp,Io=No?D(No):function(t){return b(t)&&"[object RegExp]"==v(t)};function qo(t,r,e){return e&&"number"!=typeof e&&je(t,r,e)&&(r=e=void 0),(e=void 0===e?4294967295:e>>>0)?(t=Ut(t))&&("string"==typeof r||null!=r&&!Io(r))&&!(r=Ht(r))&&pr(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",m=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,p=/\[([^\]]+)]|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",S=function(t){return t instanceof $||!(!t||!t[O])},j=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},E=function(t,r){if(S(t))return t.clone();var e="object"==typeof r?r:{};return e.date=t,e.args=arguments,new $(e)},_=b;_.l=j,_.i=S,_.w=function(t,r){return E(t,{locale:r.$L,utc:r.$u,x:r.$x,$offset:r.$offset})};var $=function(){function y(t){this.$L=j(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(m);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=E(t);return this.startOf(r)<=e&&e<=this.endOf(r)},v.isAfter=function(t,r){return E(t)<this.startOf(r)},v.isBefore=function(t,r){return this.endOf(r)<E(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,f=_.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)},m=function(t,r){return _.w(e.toDate()[t].apply(e.toDate("s"),(n?[0,0,0,0]:[23,59,59,999]).slice(r)),e)},p=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=(p<g?p+7:p)-g;return h(n?v-w:v+(6-w),y);case a:case d:return m(b+"Hours",0);case u:return m(b+"Minutes",1);case i:return m(b+"Seconds",2);case o:return m(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),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],m=s===a?this.$D+(r-this.$W):r;if(s===l||s===c){var p=this.clone().set(d,1);p.$d[h](m),p.init(),this.$d=p.set(d,Math.min(this.$D,p.daysInMonth())).$d}else h&&this.$d[h](m);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,f){var d,h=this;n=Number(n);var m=_.p(f),p=function(t){var r=E(h);return _.w(r.date(r.date()+Math.round(t*n)),h)};if(m===l)return this.set(l,this.$M+n);if(m===c)return this.set(c,this.$y+n);if(m===a)return p(1);if(m===s)return p(7);var y=(d={},d[i]=r,d[u]=e,d[o]=t,d)[m]||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,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 _.s(i%12||12,t,"0")},m=f||function(t,r,e){var n=t<12?"AM":"PM";return e?n.toLowerCase():n};return n.replace(p,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,l,3);case"MMMM":return c(l,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 m(i,u,!0);case"A":return m(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 m,p=this,y=_.p(d),v=E(n),b=(v.utcOffset()-this.utcOffset())*r,g=this-v,w=function(){return _.m(p,v)};switch(y){case c:m=w()/12;break;case l:m=w();break;case f:m=w()/3;break;case s:m=(g-b)/6048e5;break;case a:m=(g-b)/864e5;break;case u:m=g/e;break;case i:m=g/r;break;case o:m=g/t;break;default:m=g}return h?m:_.a(m)},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=j(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=$.prototype;return E.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])}}),E.extend=function(t,r){return t.$i||(t(r,$,E),t.$i=!0),E},E.locale=j,E.isDayjs=S,E.unix=function(t){return E(1e3*t)},E.en=w[g],E.Ls=w,E.p={},E}()}(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 Go=(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=Gt(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=Vt(r)}catch(t){}return e}(t.name)),r},n=[],u=t(r);await po(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 po(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=Vt(t.arr),n=Gt(r,"time",""),u=Gt(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=Gt(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=Gt(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 Vo=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(Vo,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 m=0,p="";for(let t of e){let e=Math.abs(h.get(t.timeStart));e>m&&(m=e,p=yo(m/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===m||0===g?0:(l-r)/m/g),2)}%`;return{numTrade:u,numTradeFin:a,rWin:v,uTradeAllMax:m,rTradeAllMax:p,uEquityFinal:l,btDays:b,btYears:yo(g,1),rEquivalentCumuProfitOrLossFinalNormYear:y,timeOhlcStart:n,timeOhlcEnd:o}};var Xo=Math.max;var Qo,ti=(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=Xo(n+o,0)),Ln(t,ae(r),o)},function(t,r,e){var n=Object(t);if(!K(t)){var o=ae(r);t=X(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 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:Eo,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=Gt(s,"writeOrders",!0),f=Gt(s,"writeSummary",!0),c=Gt(s,"writeReport",!0),d=Go(e,n),h=await d.buildGetTimeSeriesByTimeRange(i,u),m=await $o(r,o,h,{});if(m.name="全部策略",l){let r="orders.json";Do(t.resolve(a,r),m.orders,{useFormat:!0})}if(f){let r="summary.json";Do(t.resolve(a,r),{name:m.name,summary:m.summary},{useFormat:!0}),console.log("summary",m.summary,Lr(m.orders))}if(c){let r="report.html",e=t.resolve(a,r);Zo(m,e)}return m},calcOrders:vo,calcOrdersRatio:bo,calcOrdersSummary:jo,calcOrdersSummarySimple:Ko,calcSummary:_o,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(!So(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=Gt(f,"writeOrders",!0),d=Gt(f,"writeSummary",!0),h=Gt(f,"writeReport",!0),m=Go(e,n),p=r(i),y=r(u).diff(p,"hour")/4;if(y!==to(y))throw new Error(`timeOhlcStart[${i}] to timeOhlcEnd[${u}] are not hour intervals`);let v=await m.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";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=Gt(Co(e),"success",null);if(!cn(o))throw new Error(`orders in fpOrders[${e}] is not an effective array`);let i=Gt(n,"fpOut","");dn(i)||(i=t.resolve(t.dirname(e),"report.html"));let u=Gt(n,"name","");dn(u)||(u=t.basename(t.dirname(t.resolve(e))));let a=Gt(n,"uIni",null);if(!mn(a)){let t=ti(o,t=>mn(t.uEquity)&&mn(t.uCumuProfitOrLoss));a=t?t.uEquity-t.uCumuProfitOrLoss:1e3}let s=Gt(n,"timeOhlcStart","");var l;dn(s)||(s=(l=le(o,"timeStart"))&&l.length?ri(l,rt,ni):void 0);let f=Gt(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=Gt(n,"withWriteSummary",!1),d=await _o(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=Go(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,m=d.map(t=>t.time),p={};for(let t=0;t<h;t++)p[m[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])?m[t+n[t]]:null;p[m[t]][o]={win:r,timeEnd:i}}}let y={meta:{keyOhlc:a,ts:s,te:l,tps:f,modes:c,nBars:h},bars:p},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:""}}),m=u,p=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,p+=t.uProfitOrLoss,t.uCumuProfitOrLoss=p,t.rCumuProfitOrLoss=yo(t.uCumuProfitOrLoss/u*100,2)+"%",m+=t.uProfitOrLoss,t.uEquity=m,t.modeResult=t.uProfitOrLoss<0?"loss":"profit"))}return h}}},buildStrategyFastSession:(t,r={})=>{let e=Gt(r,"mode","");if("long"!==e&&"short"!==e)throw new Error(`invalid opt.mode[${e}] not 'long' or 'short'`);let n=Gt(r,"arrOhlc",null);if(!cn(n))throw new Error("invalid opt.arrOhlc");let o=Gt(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},m=Gt(r,"tpsls",[]);if(cn(m))for(let t of m)h(t.tp,t.sl);return{evaluate:(r={},n={})=>{let o=Gt(r,"conds",[]);if(!cn(o))throw new Error("invalid conds");let s=Gt(r,"tp",null),d=Gt(r,"sl",null),m=Gt(r,"settings",{}),p=Gt(m,"uIni",1e3),y=Gt(m,"uTrade",1),v=Gt(m,"rFee",5e-4),b=v*y,g=Gt(n,"withOrders",!1),w=h(s,d),O=w.win,S=w.hold,j=o.map(t=>{let r=Gt(t,"key",""),e=c[r];if(!e)throw new Error(`invalid cond.key[${r}] not in opt.serieses`);let n=Gt(t,"sym",">"),o=Gt(t,"th",0),i=Gt(t,"opr",null);return"and"!==i&&"or"!==i&&(i="and"),{arr:e,gt:">"===n,th:o,isOr:"or"===i}}),E=[],_=p,$=0;for(let t=0;t<i;t++){let r=!1,n=!0,o=!1,i=!1;for(let e of j){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,_+=n,l.timeEnd=u[t+S[t]],l.uProfitOrLoss=n,l.uEquity=_,l.modeResult=n<0?"loss":"profit",g&&(l.priceEnd=r,l.rProfitOrLoss=n/y,l.uCumuProfitOrLoss=$,l.rCumuProfitOrLoss=yo($/p*100,2)+"%")}E.push(l)}let T=Ko(t,p,E,l,f,{skipSort:!0});return g?{orders:E,summary:T}:T}}}};return ui});
|
|
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,S=w.propertyIsEnumerable,j=g(function(){return arguments}())?g:function(t){return b(t)&&O.call(t,"callee")&&!S.call(t,"callee")},E=j,_=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,N=function(){try{var t=C&&C.require&&C.require("util").types;return t||R&&R.binding&&R.binding("util")}catch(t){}}(),Y=N&&N.isTypedArray,I=Y?D(Y):function(t){return b(t)&&k(t.length)&&!!F[v(t)]},q=Object.prototype.hasOwnProperty;function z(t,r){var e=_(t),n=!e&&E(t),o=!e&&!n&&L(t),i=!e&&!n&&!o&&I(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 G(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 V(t){var r=typeof t;return null!=t&&("object"==r||"function"==r)}function Z(t){if(!V(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 X(t){return K(t)?z(t):G(t)}var Q=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,X)}),tt=Q;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,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!(!V(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 St=Object.prototype.hasOwnProperty;var jt=Object.prototype.hasOwnProperty;function Et(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 $t(t,r){for(var e=t.length;e--;)if(_t(t[e][0],r))return e;return-1}Et.prototype.clear=function(){this.__data__=Ot?Ot(null):{},this.size=0},Et.prototype.delete=function(t){var r=this.has(t)&&delete this.__data__[t];return this.size-=r?1:0,r},Et.prototype.get=function(t){var r=this.__data__;if(Ot){var e=r[t];return"__lodash_hash_undefined__"===e?void 0:e}return St.call(r,t)?r[t]:void 0},Et.prototype.has=function(t){var r=this.__data__;return Ot?void 0!==r[t]:jt.call(r,t)},Et.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 Et,map:new(Lt||Pt),string:new Et}},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,Nt=(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),Yt=Nt;function It(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(_(t))return It(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]:Yt(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 Gt(t,r,e){var n=null==t?void 0:Jt(t,r);return void 0===n?e:n}function Vt(t){var r=null==t?0:t.length;return r?t[r-1]:void 0}var Zt=wt(l,"DataView"),Kt=wt(l,"Promise"),Xt=wt(l,"Set"),Qt=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(Xt),lr=dt(Qt),fr=v;(Zt&&fr(new Zt(new ArrayBuffer(1)))!=or||Lt&&fr(new Lt)!=tr||Kt&&fr(Kt.resolve())!=rr||Xt&&fr(new Xt)!=er||Qt&&fr(new Qt)!=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}",Sr="[\\ud800-\\udbff][\\udc00-\\udfff]",jr="(?:"+br+"|"+gr+")"+"?",Er="[\\ufe0e\\ufe0f]?",_r=Er+jr+("(?:\\u200d(?:"+[wr,Or,Sr].join("|")+")"+Er+jr+")*"),$r="(?:"+[wr+br+"?",br,Or,Sr,vr].join("|")+")",Tr=RegExp(gr+"(?="+gr+")|"+$r+_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:G(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 Nr=f?f.prototype:void 0,Yr=Nr?Nr.valueOf:void 0;function Ir(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:Ir(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,X,Wr)}var Gr=Object.prototype.hasOwnProperty;var Vr="[object Arguments]",Zr="[object Array]",Kr="[object Object]",Xr=Object.prototype.hasOwnProperty;function Qr(t,r,e,n,o,i){var u=_(t),a=_(r),s=u?Zr:cr(t),l=a?Zr:cr(r),f=(s=s==Vr?Kr:s)==Kr,c=(l=l==Vr?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||I(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 _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=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(Yr)return Yr.call(t)==Yr.call(r)}return!1}(t,r,s,e,n,o,i);if(!(1&e)){var h=f&&Xr.call(t,"__wrapped__"),p=c&&Xr.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:Gr.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:Qr(t,r,e,n,te,o))}function re(t){return t==t&&!V(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=X(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)&&(_(t)||E(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=Gt(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(_(t)?It:se)(t,ae(r))}var fe=f?f.isConcatSpreadable:void 0;function ce(t){return _(t)||E(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):Ir(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?It(r,function(t){return _(t)?function(r){return Jt(r,1===t.length?t[0]:t)}:t}):[rt];var n=-1;return r=It(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:It(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),Se=Oe;function je(t,r,e){if(!V(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 Ee=function(t,r){return Se(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&&je(t,r[0],r[1])?r=[]:e>2&&je(r[0],r[1],r[2])&&(r=[r[0]]),pe(t,de(r,1),[])}),_e=Ee;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)&&_t(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(!V(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),Ne=Object.getOwnPropertySymbols?function(t){for(var r=[];t;)Ir(r,Wr(t)),t=Re(t);return r}:Hr,Ye=Ne;function Ie(t){return qr(t,ke,Ye)}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,Ge=function(){function t(){}return function(r){if(!V(r))return{};if(Je)return Je(r);t.prototype=r;var e=new t;return t.prototype=void 0,e}}(),Ve=Ge;var Ze=N&&N.isMap,Ke=Ze?D(Ze):function(t){return b(t)&&"[object Map]"==cr(t)};var Xe=N&&N.isSet,Qe=Xe?D(Xe):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(!V(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=l||h?{}:function(t){return"function"!=typeof t.constructor||U(t)?{}:Ve(Re(t))}(t),!s)return l?function(t,r){return Le(t,Ye(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,X(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),Qe(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?Ie:Jr:l?ke:X)(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){if(t!=t)return!0;if(null!==t&&"object"==typeof t)try{let r=Number.prototype.valueOf.call(t);return Number.isNaN(r)}catch(t){return!1}return!1}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)||0!==t.length)}(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.length>0)}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)){if(""===t.trim())return!1;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 Sn(t){if("number"==typeof t)return t;if(ot(t))return NaN;if(V(t)){var r="function"==typeof t.valueOf?t.valueOf():t;t=V(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 jn=1/0;function En(t){return t?(t=Sn(t))===jn||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 En(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}",Nn="[\\ud800-\\udbff][\\udc00-\\udfff]",Yn="(?:"+Dn+"|"+xn+")"+"?",In="[\\ufe0e\\ufe0f]?",qn=In+Yn+("(?:\\u200d(?:"+[Cn,Rn,Nn].join("|")+")"+In+Yn+")*"),zn="(?:"+[Cn+Dn+"?",Dn,Rn,Nn,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=En(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 Gn=Array.prototype.reverse;function Vn(t,r={}){let e=Gt(r,"useLimitSafe",null);return hn(e)||(e=!1),!!pn(t)&&(t=_n(t),e?Number.isSafeInteger(t):"number"==typeof(n=t)&&n==Wn(n));var n}var Zn=l.isFinite,Kn=Math.min;var Xn=function(t){var r=Math[t];return function(t,e){if(t=Sn(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"),Qn=Xn;function to(t,r={}){let e=Gt(r,"useClampSafe",null);hn(e)||(e=!1);let n=Gt(r,"useLimitSafe",null);hn(n)||(n=!1);let o=Gt(r,"returnWithStateAndMsg",null);hn(o)||(o=!1);let i=t=>o?{state:"success",msg:t}:t,u=t=>{if(o)return{state:"error",msg:t};throw new Error(t)};if(!pn(t))return i(0);let a=null;try{t=_n(t),a=Qn(t),e&&(a>Number.MAX_SAFE_INTEGER?a=Number.MAX_SAFE_INTEGER:a<Number.MIN_SAFE_INTEGER&&(a=Number.MIN_SAFE_INTEGER))}catch(t){return u(t.toString())}return n&&!Number.isSafeInteger(Number(a))?u(`v[${t}] is not a safe integer`):("0"===String(a)&&(a=0),i(a))}function ro(t,r={}){if(!Vn(t,r))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=Gt(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:Gn.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,r){let e=le(r,r=>({key:r,value:_n(t[r])}));return le(_e(e,"value"),"key")}function ao(t,r){let e=le(r,r=>io(t[r],{excludeString:!0})),n=Lr(e)>0&&e.every(t=>pn(t)),o=le(r,(r,o)=>({key:r,value:n?_n(e[o]):$n(t[r])}));return le(_e(o,"value"),"key")}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=le(r,r=>({key:r,value:$n(t[r])}));return le(so(e,"value"),"key")}function fo(t,r){let{nums:e,strs:n,others:o}=function(t){let r=[],e=[],n=[];return et(t,(t,o)=>{pn(t)?r.push(o):dn(t)&&""!==t.trim()?e.push(o):n.push(o)}),{nums:r,strs:e,others:n}}(t);if(r){return[...lo(t,[...e,...n].sort((t,r)=>t-r)),...o]}return[...uo(t,e),...ao(t,n),...o]}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){return Z(t)}function mo(t){try{t instanceof Promise&&Promise.prototype.then.call(t,void 0,()=>{})}catch(t){}}function yo(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}(),n=!1;try{let r=function(t,r=!1){let e=[],n=!1;try{if(Array.isArray(t)){let r=t.length;e.length=r;for(let n=0;n<r;n++)n in t&&(e[n]=t[n])}else{if(r||!an(t)&&!un(t))return null;{n=!0;let r=Object.keys(t);for(let n=0;n<r.length;n++)e.push({k:r[n],v:t[r[n]]})}}}catch(t){throw e.forEach(t=>{mo(n?t.v:t)}),t}return{items:e,useObj:n}}(t);if(null===r)return e.reject("rs is not an array or object"),e;t=r.items,n=r.useObj}catch(t){return e.reject(t),e}po(r)||(et(t,t=>{mo(n?t.v:t)}),r=function(t){return t});let o=po(r),i=-1,u=[];return t.reduce(function(t,e){return t.then(function(t){u.push(t),i+=1;let a=i,s=e;return n&&(a=e.k,s=e.v),o?r(s,a):s})},Promise.resolve()).then(function(t){u.push(t),u=Jn(u),e.resolve(u)}).catch(function(t){e.reject(t)}),e}function vo(t,r=0){if(!pn(t))return"";if(!ro(r))return"";return t=_n(t),Qn(t,r).toFixed(r)}let bo=async(t,r,e={})=>{r=_e(r,"timeStart");let n=Gt(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=vo(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=vo(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=vo(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=vo(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},go=(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 wo(t,r){var e=[];return tt(t,function(t,n,o){r(t,n,o)&&e.push(t)}),e}function Oo(t,r){return(_(t)?zr:wo)(t,ae(r))}function So(t){return"number"==typeof t||b(t)&&"[object Number]"==v(t)}function jo(t){if(!pn(t))return!1;return _n(t)>0}let Eo=(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),l=Lr(u),f=vo(Lr(Oo(e,{modeResult:"profit"}))/s*100,2)+"%",c=0,d="",h="",p=0,m="",y="",v="",b=0,g="",w=0,O=0,S=r,j=r,E={},_={};et(e,t=>{if(dn(t.modeResult)){S=Math.max(S,t.uEquity);let r=S-t.uEquity,e=vo(r/S*100,2)+"%";r>c&&(c=r,j=S,d=e)}{let r=null;r=1,dn(t.timeStart)&&(co(E,t.timeStart)||(E[t.timeStart]=0),E[t.timeStart]+=r*t.uTrade,co(_,t.timeStart)||(_[t.timeStart]=0),_[t.timeStart]+=1),dn(t.timeEnd)&&(co(E,t.timeEnd)||(E[t.timeEnd]=0),E[t.timeEnd]-=r*t.uTrade,co(_,t.timeEnd)||(_[t.timeEnd]=0),_[t.timeEnd]-=1)}});{let t=[];et(E,(r,e)=>{if(!So(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=le(t,t=>(r+=t.uTradeAll,{...t,uAccm:r})),n={};et(e,t=>{n[t.time]=t.uAccm}),E=n}{let t=[];et(_,(r,e)=>{if(!So(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=le(t,t=>(r+=t.numTradeAll,{...t,nAccm:r})),n={};et(e,t=>{n[t.time]=t.nAccm}),_=n}e=le(e,t=>{let e=Gt(E,t.timeStart,null);if(!So(e))throw new Error("invalid uTradeAll");e=Math.abs(e),t.uTradeAll=e;let n=vo(t.uTradeAll/r*100,2)+"%";t.rTradeAll=n,b<t.uTradeAll&&(b=t.uTradeAll,g=t.rTradeAll);let o=Gt(_,t.timeStart,null);if(!So(o))throw new Error("invalid numTradeAll");return t.numTradeAll=o,w<t.numTradeAll&&(w=t.numTradeAll),t});{let t=Lr(i)-1;p=Gt(i,`${t}.uEquity`,""),m=Gt(i,`${t}.uCumuProfitOrLoss`,""),y=Gt(i,`${t}.rCumuProfitOrLoss`,"")}{let t;t=j-r+b>0?c/(j-r+b):0,h=vo(100*t,2)+"%"}v=b>0&&So(m)?m/b:0,v=vo(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=`${vo(100*t,2)}%`}let A="";{let t;t=0===b||0===P?0:(p-r)/b/P,A=`${vo(100*t,2)}%`}return{btDays:T,btYears:vo(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=Gt(r,"mode","");if("long"!==o&&"short"!==o)throw new Error(`invalid strategy.mode[${o}] not 'long' or 'short'`);let i=Gt(r,"keyOhlc","");if(!dn(i))throw new Error("invalid strategy.keyOhlc");let u=Gt(r,"conds",[]);if(!cn(u))throw new Error("invalid strategy.conds");let a=Lr(u),s=Gt(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=Gt(n,"withCalcOrderProfitOrLoss",!0),f=Gt(n,"withSummary",!0),c=await e(i),d={},h={};await yo(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[];let e=Gt(r,"localeCompare");hn(e)||(e=!1);let n=Gt(r,"returnIndex");if(hn(n)||(n=!1),1===Lr(t))return n?[0]:t;let o=Gt(r,"compareKey",null),i=t;if(t.every(t=>an(t))){if(!dn(o))return[];i=le(t,t=>Gt(t,o,""))}let u=fo(i,e);return n?u:le(u,r=>t[r])}(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=Gt(nt(c),"time",""),b=Gt(Vt(c),"time",""),g=[];await yo(c,async t=>{let r=Gt(t,"time");if(!co(m,r))return!0;let e=!0;{let t=[];et(u,(e,n)=>{let o=y[r][e.key],i=Gt(e,"sym",">"),u=Gt(e,"th",0),a=Gt(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 bo(c,g,{uIni:s.uIni}));let w={timeTest:t().format("YYYY-MM-DDTHH:mm:ssZ"),timeOhlcStart:v,timeOhlcEnd:b,uIni:Gt(s,"uIni","")};if(f){g=go(t,g);let r=Eo(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=le(e,t=>dn(t.modeResult)?(u+=t.uProfitOrLoss,t.uEquity=u,a+=t.uProfitOrLoss,t.uCumuProfitOrLoss=a,t.rCumuProfitOrLoss=vo(t.uCumuProfitOrLoss/r*100,2)+"%",t):t),e=go(t,e);let s=Eo(t,r,e,n,o);return{timeTest:t().format("YYYY-MM-DDTHH:mm:ssZ"),timeOhlcStart:n,timeOhlcEnd:o,uIni:r,...s}},To=async(t,r,e,n={})=>{let o=Gt(n,"withCalcOrderProfitOrLoss",!0),i=Gt(n,"withSummary",!0),u=0,a=[],s=null;var l;await yo(r,async(r,n)=>{try{s=await _o(t,r,e,{withCalcOrderProfitOrLoss:o,withSummary:!1});let n=Gt(r,"settings.uIni","");if(!So(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=_e(a,"timeStart"));let f=Gt(s,"summary.timeOhlcStart",""),c=Gt(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 $o(t,u,a,f,c)),{orders:a,summary:d}};function Po(t,r={}){let e=Gt(r,"fs"),n=!1;try{e.statSync(t),n=!0}catch{n=!1}return n}function Lo(t,r={}){let e=Gt(r,"fs");if(!Po(t,{fs:e}))return!1;let n=e.lstatSync(t);return!n.isFile()&&!n.isSymbolicLink()}function Ao(t){return Lo(t,{fs:r})}function Mo(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 ko(t){if(!dn(t))return"";let r=Mo(t);if(r.isRoot)return r.path;let e=r.path;try{e=e.split("\\").pop().split("/").pop()}catch(t){}return e}function Fo(t){let r=!1;try{r=function(t){if(null===t||"object"!=typeof t)return!1;if(t instanceof Error)return!0;if("function"==typeof Error.isError)return Error.isError(t);if(Symbol.toStringTag in t)return!1;let r=Object.prototype.toString.call(t);return"[object Error]"===r||"[object DOMException]"===r}(t)}catch(t){}if(r)return t;if("string"==typeof t&&""!==t)return t;let e=function(t){try{return String(t)}catch(t){}try{let r=t.message;if("string"==typeof r&&""!==r)return r}catch(t){}return"unknown error"}(t);return""!==e?e:"unknown error"}function Do(t,r={}){try{let e=Gt(r,"fs");if(Lo(t,{fs:e}))return{success:"input folder is already exists: "+t};if(Po(t,{fs:e}))return{error:"input path already exists: "+t};e.mkdirSync(t,{recursive:!0})}catch(t){return{error:Fo(t)}}return{success:"done: "+t}}function xo(t,r,e={}){let n=!1,o=null;try{let n=Gt(e,"fs"),o=function(t){if(!dn(t))return"";let r=Mo(t);if(r.isRoot)return r.path;let e=ko(t=r.path);if(!dn(e))return t;let n=Mo(t=oo(t,e.length));return n.isRoot,n.path}(t);Lo(o,{fs:n})||Do(o,{fs:n}),n.writeFileSync(t,r,"utf8")}catch(t){n=!0,o=t}return n?{error:Fo(o)}:{success:t}}function Co(t,e,n={}){let o=!1,i=null;if(!an(e)&&!un(e))return{error:"inp is not an object or array"};let u="";try{let t=Gt(n,"useFormat",null);hn(t)||(t=!1),u=t?JSON.stringify(e,null,2):JSON.stringify(e)}catch(t){o=!0,i=t}return o?{error:Fo(i)}:xo(t,u,{fs:r})}function Ro(t){return function(t,r={}){let e=Gt(r,"fs");return!!Po(t,{fs:e})&&!e.lstatSync(t).isDirectory()&&!e.lstatSync(t).isSymbolicLink()}(t,{fs:r})}function No(t){let e=null,n=function(t,r={}){let e=!1,n=null,o="";try{o=Gt(r,"fs").readFileSync(t,"utf8")}catch(t){e=!0,n=t}return e?{error:Fo(n)}:{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=Gt(e,"path"),i=Gt(e,"fs");if(!Lo(t,{fs:i}))throw new Error(`fd[${t}] is not a folder`);return null!==r&&function(t,r={}){return!!Vn(t,r)&&to(t)>0}(r)&&(r=to(r))<1&&(r=1),function t(e){let u=[];return Lo(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 Io(e,n=1){return Yo(e,n,{path:t,fs:r})}var qo=N&&N.isRegExp,zo=qo?D(qo):function(t){return b(t)&&"[object RegExp]"==v(t)};function Ho(t,r,e){return e&&"number"!=typeof e&&je(t,r,e)&&(r=e=void 0),(e=void 0===e?4294967295:e>>>0)?(t=Ut(t))&&("string"==typeof r||null!=r&&!zo(r))&&!(r=Ht(r))&&mr(t)?Pn(Un(t),0,e):t.split(r,e):[]}var Uo=Array.prototype.join;function Bo(t){if(!dn(t))return"";let r=ko(t),e=Ho(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?"":Uo.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 Wo(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var Jo={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",S=function(t){return t instanceof $||!(!t||!t[O])},j=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},E=function(t,r){if(S(t))return t.clone();var e="object"==typeof r?r:{};return e.date=t,e.args=arguments,new $(e)},_=b;_.l=j,_.i=S,_.w=function(t,r){return E(t,{locale:r.$L,utc:r.$u,x:r.$x,$offset:r.$offset})};var $=function(){function y(t){this.$L=j(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=E(t);return this.startOf(r)<=e&&e<=this.endOf(r)},v.isAfter=function(t,r){return E(t)<this.startOf(r)},v.isBefore=function(t,r){return this.endOf(r)<E(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,f=_.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(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=_.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[_.p(t)]()},v.add=function(n,f){var d,h=this;n=Number(n);var p=_.p(f),m=function(t){var r=E(h);return _.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 _.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,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 _.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 _.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,l,3);case"MMMM":return c(l,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=E(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 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:_.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=j(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=$.prototype;return E.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])}}),E.extend=function(t,r){return t.$i||(t(r,$,E),t.$i=!0),E},E.locale=j,E.isDayjs=S,E.unix=function(t){return E(1e3*t)},E.en=w[g],E.Ls=w,E.p={},E}()}(Jo);var Go=Wo(Jo.exports);function Vo(t){if(!dn(t))return!1;let r="YYYY-MM-DDTHH:mm:ss";return t===Go(t,r).format(r)}let Zo=(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(Ro(o))u=o;else{if(!Ro(i))throw console.log(`fpParam[${o}] or fpOhlc[${i}] do not exist`),new Error(`invalid key[${n}]`);u=i}let a=Gt(No(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=Io(t);return r=Oo(r,t=>"json"===function(t){if(!dn(t))return"";let r=Ho(ko(t),".");if(Lr(r)<=1)return"";let e="";try{e=Vt(r)}catch(t){}return e}(t.name)),r},n=[],u=t(r);await yo(u,async t=>{let r=Bo(t.name),e=await o(r);n.push({type:"ohlc",key:r,arr:e})});let a=t(e);return await yo(a,async t=>{let r=Bo(t.name),e=await o(r);n.push({type:"param",key:r,arr:e})}),i=n,n},a={},s=async(t,r)=>{if(!Vo(t))throw new Error("invalid timeStart");if(!Vo(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=Vt(t.arr),n=Gt(r,"time",""),u=Gt(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=Oo(e.arr,e=>e.time>=t&&e.time<=r);s.push({key:e.key,arr:n})}),a[e]=s,s},l={getKeysParam:()=>le(Io(e),t=>Bo(t.name)),getTimeSeries:o,getTimeSeriesByTimeRange:async(t,r,e)=>{let n=await o(t);return n=Oo(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=Gt(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=Gt(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 Ko=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)),Xo=(e,n)=>{let o=e=>{let n=t.resolve(Ko,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)),xo(n,i,{fs:r})},Qo=(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=vo(p/r*100,2)+"%")}let y,v=vo(s/a*100,2)+"%",b=t(o).diff(t(n),"day"),g=b/365;y=`${vo(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:vo(g,1),rEquivalentCumuProfitOrLossFinalNormYear:y,timeOhlcStart:n,timeOhlcEnd:o}};var ti=Math.max;var ri,ei=(ri=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=ti(n+o,0)),Ln(t,ae(r),o)},function(t,r,e){var n=Object(t);if(!K(t)){var o=ae(r);t=X(t),r=function(t){return o(n[t],t,n)}}var i=ri(t,r,e);return i>-1?n[o?t[i]:i]:void 0});function ni(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 oi(t,r){return t>r}function ii(t,r){return t<r}let ui=(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 ai=(t,r,e,n,o)=>"long"===t?r*(n/e)-r-2*o:r/e*(e-n)-2*o,si={runStrategy:_o,runStrategies:To,runStrategiesAndBacktest:async(r,e,n,o,i,u,a,s={})=>{if(!Ao(e))throw new Error(`fdOhlc[${e}] is not a forder`);if(!Ao(n))throw new Error(`fdParam[${n}] is not a forder`);if(!cn(o))throw new Error("invalid strategies");let l=Gt(s,"writeOrders",!0),f=Gt(s,"writeSummary",!0),c=Gt(s,"writeReport",!0),d=Zo(e,n),h=await d.buildGetTimeSeriesByTimeRange(i,u),p=await To(r,o,h,{});if(p.name="全部策略",l){let r="orders.json";Co(t.resolve(a,r),p.orders,{useFormat:!0})}if(f){let r="summary.json";Co(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);Xo(p,e)}return p},calcOrders:bo,calcOrdersRatio:go,calcOrdersSummary:Eo,calcOrdersSummarySimple:Qo,calcSummary:$o,closeAndSummaryOrders:async(r,e,n,o,i,u,a,s,l,f={})=>{if(!Ao(e))throw new Error(`fdOhlc[${e}] is not a forder`);if(!Ao(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=Gt(f,"writeOrders",!0),d=Gt(f,"writeSummary",!0),h=Gt(f,"writeReport",!0),p=Zo(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 bo(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";Co(t.resolve(l,r),O.orders,{useFormat:!0})}if(d){let r="summary.json";Co(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);Xo(O,e)}},genReport:async(r,e,n={})=>{if(!dn(e))throw new Error("invalid fpOrders");if(!Ro(e))throw new Error(`fpOrders[${e}] is not a file`);let o=Gt(No(e),"success",null);if(!cn(o))throw new Error(`orders in fpOrders[${e}] is not an effective array`);let i=Gt(n,"fpOut","");dn(i)||(i=t.resolve(t.dirname(e),"report.html"));let u=Gt(n,"name","");dn(u)||(u=t.basename(t.dirname(t.resolve(e))));let a=Gt(n,"uIni",null);if(!pn(a)){let t=ei(o,t=>pn(t.uEquity)&&pn(t.uCumuProfitOrLoss));a=t?t.uEquity-t.uCumuProfitOrLoss:1e3}let s=Gt(n,"timeOhlcStart","");var l;dn(s)||(s=(l=le(o,"timeStart"))&&l.length?ni(l,rt,ii):void 0);let f=Gt(n,"timeOhlcEnd","");dn(f)||(f=function(t){return t&&t.length?ni(t,rt,oi):void 0}(le(o,t=>dn(t.timeEnd)?t.timeEnd:t.timeStart)));let c=Gt(n,"withWriteSummary",!1),d=await $o(r,a,o,s,f);return c&&Co(t.resolve(t.dirname(i),"summary.json"),{name:u,summary:d},{useFormat:!0}),Xo({name:u,orders:o,summary:d},i),{orders:o,summary:d,fpOut:i}},genReportCore:Xo,genKLinesTpSl:ui,buildKLinesTpSl:async(e,n,o,i={})=>{if(!Ao(e))throw new Error(`fdOhlc[${e}] is not a folder`);if(!Ao(n))throw new Error(`fdParam[${n}] is not a folder`);if(!dn(o))throw new Error("invalid fpJson");let u=Zo(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(!Vo(s))throw new Error("invalid opt.ts");if(!Vo(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}=ui(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 Ao(b)||Do(b,{fs:r}),r.writeFileSync(v,JSON.stringify(y)),y},loadKLinesTpSl:e=>{if(!dn(e))throw new Error("invalid fpJson");if(!Ro(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=ai(t.mode,t.uTrade,t.priceStart,t.priceEnd,t.uFee),t.rProfitOrLoss=t.uProfitOrLoss/t.uTrade,m+=t.uProfitOrLoss,t.uCumuProfitOrLoss=m,t.rCumuProfitOrLoss=vo(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=Gt(r,"mode","");if("long"!==e&&"short"!==e)throw new Error(`invalid opt.mode[${e}] not 'long' or 'short'`);let n=Gt(r,"arrOhlc",null);if(!cn(n))throw new Error("invalid opt.arrOhlc");let o=Gt(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=ui(n,{tp:t,sl:r,mode:e}),d.set(o,i)),i},p=Gt(r,"tpsls",[]);if(cn(p))for(let t of p)h(t.tp,t.sl);return{evaluate:(r={},n={})=>{let o=Gt(r,"conds",[]);if(!cn(o))throw new Error("invalid conds");let s=Gt(r,"tp",null),d=Gt(r,"sl",null),p=Gt(r,"settings",{}),m=Gt(p,"uIni",1e3),y=Gt(p,"uTrade",1),v=Gt(p,"rFee",5e-4),b=v*y,g=Gt(n,"withOrders",!1),w=h(s,d),O=w.win,S=w.hold,j=o.map(t=>{let r=Gt(t,"key",""),e=c[r];if(!e)throw new Error(`invalid cond.key[${r}] not in opt.serieses`);let n=Gt(t,"sym",">"),o=Gt(t,"th",0),i=Gt(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 j){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=ai(e,y,f,r,b);$+=n,_+=n,l.timeEnd=u[t+S[t]],l.uProfitOrLoss=n,l.uEquity=_,l.modeResult=n<0?"loss":"profit",g&&(l.priceEnd=r,l.rProfitOrLoss=n/y,l.uCumuProfitOrLoss=$,l.rCumuProfitOrLoss=vo($/m*100,2)+"%")}E.push(l)}let T=Qo(t,m,E,l,f,{skipSort:!0});return g?{orders:E,summary:T}:T}}}};return si});
|
|
7
7
|
//# sourceMappingURL=w-trade-backtest.umd.js.map
|