codifx 0.1.10 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/cli/commands/explain.js +1 -179
  2. package/dist/cli/commands/profile.js +1 -55
  3. package/dist/cli/commands/scan.js +1 -300
  4. package/dist/cli/commands/simulate.js +1 -109
  5. package/dist/cli/commands/validate.js +1 -26
  6. package/dist/cli/index.js +1 -94
  7. package/dist/config/loader.js +1 -124
  8. package/dist/config/schema.js +1 -49
  9. package/dist/core/engine.js +1 -169
  10. package/dist/core/filters.js +1 -70
  11. package/dist/core/oscillator-engine.js +1 -224
  12. package/dist/core/scoring.js +1 -101
  13. package/dist/core/timeframe.js +1 -52
  14. package/dist/core/trend-engine.js +1 -137
  15. package/dist/data/mock.js +1 -111
  16. package/dist/data/provider.js +1 -29
  17. package/dist/data/yahoo.js +1 -200
  18. package/dist/index.js +1 -19
  19. package/dist/indicators/oscillator/adx.js +1 -118
  20. package/dist/indicators/oscillator/atr.js +1 -31
  21. package/dist/indicators/oscillator/cci.js +1 -39
  22. package/dist/indicators/oscillator/macd.js +1 -73
  23. package/dist/indicators/oscillator/momentum.js +1 -35
  24. package/dist/indicators/oscillator/rsi.js +1 -93
  25. package/dist/indicators/oscillator/stochastic.js +1 -89
  26. package/dist/indicators/oscillator/williams.js +1 -44
  27. package/dist/indicators/trend/ema.js +1 -36
  28. package/dist/indicators/trend/hma.js +1 -48
  29. package/dist/indicators/trend/sma.js +1 -30
  30. package/dist/indicators/trend/vwma.js +1 -23
  31. package/dist/types/index.js +1 -5
  32. package/dist/utils/constants.js +1 -105
  33. package/dist/utils/explain.js +1 -83
  34. package/dist/utils/formatter.js +1 -104
  35. package/dist/utils/html-generator.js +1 -107
  36. package/dist/utils/indicators.js +1 -106
  37. package/dist/utils/levels.js +1 -82
  38. package/dist/utils/logger.js +1 -238
  39. package/dist/utils/paths.js +1 -32
  40. package/dist/utils/symbols.js +1 -44
  41. package/dist/utils/trading-type-config.js +1 -96
  42. package/dist/utils/version-checker.js +1 -76
  43. package/package.json +1 -2
package/dist/cli/index.js CHANGED
@@ -1,94 +1 @@
1
- /**
2
- * CLI entry point
3
- */
4
- import { Command } from "commander";
5
- import { scanCommand } from "./commands/scan.js";
6
- import { simulateCommand } from "./commands/simulate.js";
7
- import { profileCommand } from "./commands/profile.js";
8
- import { validateCommand } from "./commands/validate.js";
9
- import { explainCommand } from "./commands/explain.js";
10
- import { readFileSync } from "fs";
11
- import { join, dirname } from "path";
12
- import { fileURLToPath } from "url";
13
- import { checkForUpdates, displayUpdateNotification, } from "../utils/version-checker.js";
14
- // Get package version
15
- const __dirname = dirname(fileURLToPath(import.meta.url));
16
- const packageJson = JSON.parse(readFileSync(join(__dirname, "../../package.json"), "utf-8"));
17
- // Check for updates (async, non-blocking for program setup)
18
- checkForUpdates(packageJson.version).then((latestVersion) => {
19
- if (latestVersion) {
20
- displayUpdateNotification(packageJson.version, latestVersion);
21
- }
22
- });
23
- const program = new Command();
24
- program
25
- .name("codifx")
26
- .description("Professional multi-type trading scanner CLI")
27
- .version(packageJson.version);
28
- // Global options
29
- program
30
- .option("--trade-type <type>", "Trading type: scalp, day, or swing")
31
- .option("--profile <path>", "Path to custom profile configuration")
32
- .option("--verbose", "Show detailed output");
33
- // Scan command
34
- program
35
- .command("scan")
36
- .description("Scan live market data for trading signals")
37
- .option("-s, --symbol <symbol>", "Single symbol to scan")
38
- .option("-l, --symbols <symbols...>", "Multiple symbols to scan")
39
- .option("-t, --trade-type <type>", "Trading type: scalp, day, or swing")
40
- .option("-p, --profile <path>", "Path to custom profile configuration")
41
- .option("-w, --watchlist <path>", "Path to custom watchlist JSON file")
42
- .option("-m, --market <market>", "Market: IDX, NASDAQ, NYSE, CRYPTO", "IDX")
43
- .option("-d, --direction <direction>", "Filter by signal direction: buy, sell, or both", "both")
44
- .option("--date <date>", "Historical date for backtesting (YYYY-MM-DD, max 7 days back)")
45
- .option("--log [filepath]", "Save detailed scan log to file (auto-location if no path specified)")
46
- .option("--html [filepath]", "Generate HTML dashboard and open in browser")
47
- .action(async (options) => {
48
- try {
49
- const globalOpts = program.opts();
50
- await scanCommand({ ...globalOpts, ...options });
51
- }
52
- catch (error) {
53
- console.error("✗ Scan failed");
54
- console.error(`✗ ${error instanceof Error ? error.message : String(error)}`);
55
- process.exit(1);
56
- }
57
- });
58
- // Simulate command
59
- program
60
- .command("simulate")
61
- .description("Run scanner simulation with mock data")
62
- .action(async () => {
63
- const globalOpts = program.opts();
64
- await simulateCommand(globalOpts);
65
- });
66
- // Profile command
67
- program
68
- .command("profile")
69
- .description("Manage configuration profiles")
70
- .option("-l, --list", "List available profiles")
71
- .option("-s, --show <name>", "Show profile details")
72
- .option("-v, --validate <path>", "Validate profile file")
73
- .action(async (options) => {
74
- await profileCommand(options);
75
- });
76
- // Validate command
77
- program
78
- .command("validate")
79
- .description("Validate configuration file")
80
- .option("-p, --profile <path>", "Path to profile file (default: profiles/day.profile.json)")
81
- .action(async (options) => {
82
- await validateCommand(options);
83
- });
84
- // Explain command
85
- program
86
- .command("explain")
87
- .description("Explain indicator logic and concepts")
88
- .option("-i, --indicator <name>", "Indicator or concept to explain")
89
- .action(async (options) => {
90
- await explainCommand(options);
91
- });
92
- // Parse arguments
93
- program.parse();
94
- //# sourceMappingURL=index.js.map
1
+ const a0_0x1dd339=a0_0x3343;(function(_0x2a6f06,_0x27cd2a){const _0x456c93=a0_0x3343,_0x436470=_0x2a6f06();while(!![]){try{const _0x594227=parseInt(_0x456c93(0x133))/0x1*(-parseInt(_0x456c93(0x15b))/0x2)+parseInt(_0x456c93(0x164))/0x3+parseInt(_0x456c93(0x15c))/0x4+-parseInt(_0x456c93(0x147))/0x5*(-parseInt(_0x456c93(0x139))/0x6)+parseInt(_0x456c93(0x14c))/0x7+-parseInt(_0x456c93(0x13d))/0x8*(-parseInt(_0x456c93(0x13b))/0x9)+parseInt(_0x456c93(0x137))/0xa*(-parseInt(_0x456c93(0x134))/0xb);if(_0x594227===_0x27cd2a)break;else _0x436470['push'](_0x436470['shift']());}catch(_0x52636f){_0x436470['push'](_0x436470['shift']());}}}(a0_0x41b1,0x25c15));const a0_0x47f7dc=(function(){let _0x2764ff=!![];return function(_0x25dd54,_0x198506){const _0xa38a16=_0x2764ff?function(){const _0x3cbc4a=a0_0x3343;if(_0x198506){const _0x12328b=_0x198506[_0x3cbc4a(0x162)](_0x25dd54,arguments);return _0x198506=null,_0x12328b;}}:function(){};return _0x2764ff=![],_0xa38a16;};}()),a0_0x111c07=a0_0x47f7dc(this,function(){const _0x79a613=a0_0x3343,_0x18333a={'ZoQQx':_0x79a613(0x150)};return a0_0x111c07[_0x79a613(0x151)]()[_0x79a613(0x14e)](_0x18333a[_0x79a613(0x142)])[_0x79a613(0x151)]()[_0x79a613(0x13e)](a0_0x111c07)['search'](_0x18333a[_0x79a613(0x142)]);});function a0_0x3343(_0x5b658a,_0x508694){_0x5b658a=_0x5b658a-0x132;const _0x1e049b=a0_0x41b1();let _0x111c07=_0x1e049b[_0x5b658a];if(a0_0x3343['tLfDPx']===undefined){var _0x47f7dc=function(_0xe7f2be){const _0x323896='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1e5f2e='',_0x4214e2='',_0x57271c=_0x1e5f2e+_0x47f7dc;for(let _0x3ea743=0x0,_0x224e1d,_0x241da9,_0x49420b=0x0;_0x241da9=_0xe7f2be['charAt'](_0x49420b++);~_0x241da9&&(_0x224e1d=_0x3ea743%0x4?_0x224e1d*0x40+_0x241da9:_0x241da9,_0x3ea743++%0x4)?_0x1e5f2e+=_0x57271c['charCodeAt'](_0x49420b+0xa)-0xa!==0x0?String['fromCharCode'](0xff&_0x224e1d>>(-0x2*_0x3ea743&0x6)):_0x3ea743:0x0){_0x241da9=_0x323896['indexOf'](_0x241da9);}for(let _0x41edca=0x0,_0x1361d5=_0x1e5f2e['length'];_0x41edca<_0x1361d5;_0x41edca++){_0x4214e2+='%'+('00'+_0x1e5f2e['charCodeAt'](_0x41edca)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4214e2);};a0_0x3343['UyRSRS']=_0x47f7dc,a0_0x3343['qZwghY']={},a0_0x3343['tLfDPx']=!![];}const _0x41b15f=_0x1e049b[0x0],_0x33437a=_0x5b658a+_0x41b15f,_0x4eacbd=a0_0x3343['qZwghY'][_0x33437a];if(!_0x4eacbd){const _0x72d793=function(_0x3ef091){this['MArvMq']=_0x3ef091,this['TTWETE']=[0x1,0x0,0x0],this['XCNmFg']=function(){return'newState';},this['oxMDAn']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['IdDTyD']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x72d793['prototype']['HxecFn']=function(){const _0x590295=new RegExp(this['oxMDAn']+this['IdDTyD']),_0x33d8f9=_0x590295['test'](this['XCNmFg']['toString']())?--this['TTWETE'][0x1]:--this['TTWETE'][0x0];return this['pAHPZa'](_0x33d8f9);},_0x72d793['prototype']['pAHPZa']=function(_0x162857){if(!Boolean(~_0x162857))return _0x162857;return this['yMsbXv'](this['MArvMq']);},_0x72d793['prototype']['yMsbXv']=function(_0xb376dd){for(let _0x3d5466=0x0,_0x2e7aa1=this['TTWETE']['length'];_0x3d5466<_0x2e7aa1;_0x3d5466++){this['TTWETE']['push'](Math['round'](Math['random']())),_0x2e7aa1=this['TTWETE']['length'];}return _0xb376dd(this['TTWETE'][0x0]);},new _0x72d793(a0_0x3343)['HxecFn'](),_0x111c07=a0_0x3343['UyRSRS'](_0x111c07),a0_0x3343['qZwghY'][_0x33437a]=_0x111c07;}else _0x111c07=_0x4eacbd;return _0x111c07;}a0_0x111c07();import{Command}from'commander';import{scanCommand}from'./commands/scan.js';import{simulateCommand}from'./commands/simulate.js';import{profileCommand}from'./commands/profile.js';import{validateCommand}from'./commands/validate.js';import{explainCommand}from'./commands/explain.js';import{readFileSync}from'fs';function a0_0x41b1(){const _0x358cc9=['lwqSic0TzgLYzwn0Aw9UidXKAxjLy3rPB24+','txvSDgLWBguGC3LTyM9SCYb0BYbZy2fU','uhjVzMvZC2LVBMfSig11BhrPlxr5CguGDhjHzgLUzYbZy2fUBMvYienmsq','ndmWotuWtgvrvKD1','mti0odC2AwPLuKDo','rxHWBgfPBIbPBMrPy2f0B3iGBg9NAwmGyw5KignVBMnLChrZ','BfPos1C','lxqSic0TDhjHzguTDhLWzsa8DhLWzt4','ls10CMfKzs10ExbLidX0ExbLpG','sgLZDg9YAwnHBcbKyxrLigzVCIbIywnRDgvZDgLUzYaOwvLzws1nts1ercWGBwf4idCGzgf5CYbIywnRkq','yxbWBhK','BKfwy0O','mZi2ntK4zLLQvwPX','ugf0Acb0BYbJDxn0B20GChjVzMLSzsbJB25MAwD1CMf0Aw9U','r2vUzxjHDguGsfrntcbKyxnOyM9HCMqGyw5Kig9Wzw4GAw4GyNjVD3nLCG','BMfTzq','ChjVzMLSzq','rMLSDgvYigj5ihnPz25HBcbKAxjLy3rPB246igj1EsWGC2vSBcWGB3iGyM90Aa','B3b0CW','lwKSic0TAw5KAwnHDg9YidXUyw1LpG','u2HVDYbKzxrHAwXLzcbVDxrWDxq','4PYxifnJyw4GzMfPBgvK','lxaSic0TChjVzMLSzsa8Cgf0Ad4','ELjmBMe','EeXfsxi','ywn0Aw9U','ls12zxjIB3nL','uNLYqKu','yM90Aa','sury','BwvZC2fNzq','sw5KAwnHDg9Yig9YignVBMnLChqGDg8GzxHWBgfPBG','lwWSic0TBgLZDa','vMfSAwrHDguGy29UzMLNDxjHDgLVBIbMAwXL','ugf0Acb0BYbJDxn0B20GD2f0y2HSAxn0iePtt04GzMLSzq','uNvUihnJyw5UzxiGC2LTDwXHDgLVBIb3AxrOig1Vy2SGzgf0yq','zxHWBgfPBG','u2HVDYbWCM9MAwXLigrLDgfPBhm','twfUywDLignVBMzPz3vYyxrPB24GChjVzMLSzxm','mvPJD3bzAq','nZe5oda3zuTov1HY','twfYA2v0oIbjrfGSie5bu0rbusWGtLLtrsWGq1jzufrp','yxntEem','ntb5wu90uge','lI4VlI4VCgfJA2fNzs5QC29U','nNnpDKjbBq','u2f2zsbKzxrHAwXLzcbZy2fUigXVzYb0BYbMAwXLicHHDxrVlwXVy2f0Aw9UigLMig5VihbHDgGGC3bLy2LMAwvKkq','mtm0mxr2v3b2Aq','zxjYB3i','mtuWmtzWrhvZqKC','y29UC3rYDwn0B3i','DgHLBG','ls1WCM9MAwXLidXWyxrOpG','lxCSic0TD2f0y2HSAxn0idXWyxrOpG','wM9ruxG','zxHPDa','lxySic0TDMfSAwrHDguGphbHDgG+','lxmSic0TC2HVDYa8BMfTzt4','lw0Sic0TBwfYA2v0idXTyxjRzxq+','mti5mZa1nuzrDLntDq','runIq04','vhjHzgLUzYb0ExbLoIbZy2fSCcWGzgf5lcbVCIbZD2LUzW','B3b0Aw9U','CgfYC2u','mtmYntuYqKDXEunf','vunqsKi','C2vHCMnO','y29KAwz4','kcGOlISPkYKRksSK','Dg9tDhjPBMC','y29TBwfUza','zgvZy3jPChrPB24','DMvYC2LVBG','ls1ODg1SifTMAwXLCgf0Af0','tgLZDcbHDMfPBgfIBguGChjVzMLSzxm','tKjjwvC'];a0_0x41b1=function(){return _0x358cc9;};return a0_0x41b1();}import{join,dirname}from'path';import{fileURLToPath}from'url';import{checkForUpdates,displayUpdateNotification}from'../utils/version-checker.js';const __dirname=dirname(fileURLToPath(import.meta.url)),packageJson=JSON[a0_0x1dd339(0x14b)](readFileSync(join(__dirname,a0_0x1dd339(0x138)),'utf-8'));checkForUpdates(packageJson[a0_0x1dd339(0x154)])[a0_0x1dd339(0x13f)](_0x598531=>{_0x598531&&displayUpdateNotification(packageJson['version'],_0x598531);});const program=new Command();program[a0_0x1dd339(0x167)](a0_0x1dd339(0x14f))[a0_0x1dd339(0x153)](a0_0x1dd339(0x15a))[a0_0x1dd339(0x154)](packageJson[a0_0x1dd339(0x154)]),program[a0_0x1dd339(0x14a)](a0_0x1dd339(0x160),a0_0x1dd339(0x149))[a0_0x1dd339(0x14a)](a0_0x1dd339(0x140),a0_0x1dd339(0x165))['option'](a0_0x1dd339(0x172),a0_0x1dd339(0x16c)),program[a0_0x1dd339(0x152)]('scan')[a0_0x1dd339(0x153)]('Scan\x20live\x20market\x20data\x20for\x20trading\x20signals')['option']('-s,\x20--symbol\x20<symbol>','Single\x20symbol\x20to\x20scan')['option']('-l,\x20--symbols\x20<symbols...>',a0_0x1dd339(0x159))[a0_0x1dd339(0x14a)](a0_0x1dd339(0x15f),a0_0x1dd339(0x149))[a0_0x1dd339(0x14a)]('-p,\x20--profile\x20<path>','Path\x20to\x20custom\x20profile\x20configuration')['option'](a0_0x1dd339(0x141),a0_0x1dd339(0x17a))['option'](a0_0x1dd339(0x146),a0_0x1dd339(0x135),a0_0x1dd339(0x175))[a0_0x1dd339(0x14a)](a0_0x1dd339(0x158),a0_0x1dd339(0x169),a0_0x1dd339(0x174))[a0_0x1dd339(0x14a)]('--date\x20<date>',a0_0x1dd339(0x161))['option']('--log\x20[filepath]',a0_0x1dd339(0x13a))[a0_0x1dd339(0x14a)](a0_0x1dd339(0x155),a0_0x1dd339(0x166))[a0_0x1dd339(0x171)](async _0x5b7c16=>{const _0x392bec=a0_0x1dd339,_0x4fd583={'lZNKW':function(_0x2d1bd4,_0x35f2cc,_0x284db6){return _0x2d1bd4(_0x35f2cc,_0x284db6);},'NBIYW':function(_0x1d0af6,_0xc2bdb3){return _0x1d0af6===_0xc2bdb3;},'zRLna':'YWvDH','RyrBE':function(_0xded9a8,_0x570d5c){return _0xded9a8!==_0x570d5c;},'UCPJB':'asSxC','ECbCN':function(_0x1f2295,_0x48b82f){return _0x1f2295 instanceof _0x48b82f;},'xLEIr':function(_0x47aa23,_0x1c71cf){return _0x47aa23(_0x1c71cf);}};try{if(_0x4fd583[_0x392bec(0x157)](_0x4fd583[_0x392bec(0x16f)],_0x4fd583[_0x392bec(0x16f)])){const _0x42a1c4=program[_0x392bec(0x16a)]();await scanCommand({..._0x42a1c4,..._0x5b7c16});}else{if(_0x29b899){const _0x2d8e50=_0x3e965d['apply'](_0x40f773,arguments);return _0x454f6b=null,_0x2d8e50;}}}catch(_0x416c36){_0x4fd583[_0x392bec(0x173)](_0x392bec(0x136),_0x4fd583[_0x392bec(0x14d)])?_0x4fd583[_0x392bec(0x15e)](_0xb7fe31,_0x50e39f[_0x392bec(0x154)],_0x26da36):(console[_0x392bec(0x13c)](_0x392bec(0x16d)),console[_0x392bec(0x13c)]('✗\x20'+(_0x4fd583[_0x392bec(0x148)](_0x416c36,Error)?_0x416c36[_0x392bec(0x176)]:_0x4fd583[_0x392bec(0x170)](String,_0x416c36))),process[_0x392bec(0x143)](0x1));}}),program['command']('simulate')[a0_0x1dd339(0x153)](a0_0x1dd339(0x17b))[a0_0x1dd339(0x171)](async()=>{const _0x50feed=program['opts']();await simulateCommand(_0x50feed);}),program[a0_0x1dd339(0x152)](a0_0x1dd339(0x168))[a0_0x1dd339(0x153)](a0_0x1dd339(0x132))[a0_0x1dd339(0x14a)](a0_0x1dd339(0x178),a0_0x1dd339(0x156))[a0_0x1dd339(0x14a)](a0_0x1dd339(0x145),a0_0x1dd339(0x17d))[a0_0x1dd339(0x14a)](a0_0x1dd339(0x144),'Validate\x20profile\x20file')[a0_0x1dd339(0x171)](async _0x44094b=>{const _0x3d7427={'BnCCx':function(_0x17a258,_0x167afe){return _0x17a258(_0x167afe);}};await _0x3d7427['BnCCx'](profileCommand,_0x44094b);}),program[a0_0x1dd339(0x152)]('validate')['description'](a0_0x1dd339(0x179))[a0_0x1dd339(0x14a)](a0_0x1dd339(0x16e),'Path\x20to\x20profile\x20file\x20(default:\x20profiles/day.profile.json)')[a0_0x1dd339(0x171)](async _0x3ea838=>{await validateCommand(_0x3ea838);}),program[a0_0x1dd339(0x152)](a0_0x1dd339(0x17c))[a0_0x1dd339(0x153)](a0_0x1dd339(0x15d))['option'](a0_0x1dd339(0x16b),a0_0x1dd339(0x177))[a0_0x1dd339(0x171)](async _0x38c58a=>{const _0x57252f=a0_0x1dd339,_0x493c65={'nAVcJ':function(_0x3ff37f,_0x3e9199){return _0x3ff37f(_0x3e9199);}};await _0x493c65[_0x57252f(0x163)](explainCommand,_0x38c58a);}),program[a0_0x1dd339(0x14b)]();
@@ -1,124 +1 @@
1
- /**
2
- * Configuration profile loader
3
- */
4
- import { readFile } from "fs/promises";
5
- import { resolve, join } from "path";
6
- import { ProfileSchema } from "./schema.js";
7
- const DEFAULT_PROFILE = "day.profile.json";
8
- const PROFILE_DIR = "profiles";
9
- /**
10
- * Load and validate a configuration profile
11
- */
12
- export async function loadProfile(profilePath) {
13
- let configPath;
14
- if (profilePath) {
15
- // Use provided path
16
- configPath = resolve(profilePath);
17
- }
18
- else {
19
- // Use default profile from package root
20
- // In production (npm install -g), profiles are in the package directory
21
- const packageRoot = new URL("../../", import.meta.url).pathname;
22
- configPath = join(packageRoot, PROFILE_DIR, DEFAULT_PROFILE);
23
- }
24
- try {
25
- const content = await readFile(configPath, "utf-8");
26
- const data = JSON.parse(content);
27
- // Load global watchlist config if not specified in profile
28
- if (!data.dataSource) {
29
- const packageRoot = new URL("../../", import.meta.url).pathname;
30
- const watchlistPath = join(packageRoot, "config", "watchlist.json");
31
- try {
32
- const watchlistContent = await readFile(watchlistPath, "utf-8");
33
- const watchlists = JSON.parse(watchlistContent);
34
- // Default market preference: IDX > NASDAQ
35
- const defaultMarket = "IDX";
36
- // Find watchlist for the default market
37
- const watchlist = Array.isArray(watchlists)
38
- ? watchlists.find((w) => w.market === defaultMarket) ||
39
- watchlists[0]
40
- : watchlists;
41
- if (watchlist) {
42
- data.dataSource = {
43
- provider: watchlist.provider,
44
- market: watchlist.market,
45
- defaultSymbols: watchlist.symbols || watchlist.defaultSymbols,
46
- };
47
- }
48
- }
49
- catch (error) {
50
- // If global watchlist doesn't exist, it's okay - profile can have its own
51
- }
52
- }
53
- // Validate with Zod schema
54
- const validated = ProfileSchema.parse(data);
55
- return validated;
56
- }
57
- catch (error) {
58
- if (error instanceof Error) {
59
- throw new Error(`Failed to load profile from ${configPath}: ${error.message}`);
60
- }
61
- throw error;
62
- }
63
- }
64
- /**
65
- * Validate a profile without loading
66
- */
67
- export async function validateProfile(profilePath) {
68
- try {
69
- await loadProfile(profilePath);
70
- return true;
71
- }
72
- catch {
73
- return false;
74
- }
75
- }
76
- /**
77
- * Get profile path by trading type
78
- */
79
- export function getProfilePathByType(tradingType) {
80
- const packageRoot = new URL("../../", import.meta.url).pathname;
81
- return join(packageRoot, PROFILE_DIR, `${tradingType}.profile.json`);
82
- }
83
- /**
84
- * Load watchlist from JSON file
85
- * Supports multiple formats:
86
- * - Simple array: ["BBCA", "TLKM"]
87
- * - Object: { "market": "IDX", "symbols": [...] }
88
- * - Multi-market array: [{ "market": "IDX", "symbols": [...] }, ...]
89
- */
90
- export async function loadWatchlist(path) {
91
- try {
92
- const content = await readFile(path, "utf-8");
93
- const data = JSON.parse(content);
94
- // Simple array format
95
- if (Array.isArray(data) && typeof data[0] === "string") {
96
- return { symbols: data };
97
- }
98
- // Multi-market array (use first watchlist)
99
- if (Array.isArray(data) && data[0]?.symbols) {
100
- const first = data[0];
101
- return {
102
- name: first.name,
103
- market: first.market,
104
- symbols: first.symbols,
105
- };
106
- }
107
- // Single watchlist object
108
- if (data.symbols && Array.isArray(data.symbols)) {
109
- return {
110
- name: data.name,
111
- market: data.market,
112
- symbols: data.symbols,
113
- };
114
- }
115
- throw new Error("Invalid watchlist format. Expected array of symbols or object with 'symbols' property");
116
- }
117
- catch (error) {
118
- if (error instanceof Error) {
119
- throw new Error(`Failed to load watchlist from ${path}: ${error.message}`);
120
- }
121
- throw error;
122
- }
123
- }
124
- //# sourceMappingURL=loader.js.map
1
+ const a0_0x3039db=a0_0x258b;(function(_0x5b683d,_0x286ca1){const _0x2b0443=a0_0x258b,_0x21248e=_0x5b683d();while(!![]){try{const _0x5e1085=-parseInt(_0x2b0443(0x1af))/0x1+-parseInt(_0x2b0443(0x1a7))/0x2+-parseInt(_0x2b0443(0x19c))/0x3*(parseInt(_0x2b0443(0x198))/0x4)+parseInt(_0x2b0443(0x19a))/0x5*(parseInt(_0x2b0443(0x195))/0x6)+-parseInt(_0x2b0443(0x19e))/0x7+parseInt(_0x2b0443(0x1bc))/0x8+-parseInt(_0x2b0443(0x192))/0x9*(-parseInt(_0x2b0443(0x1a3))/0xa);if(_0x5e1085===_0x286ca1)break;else _0x21248e['push'](_0x21248e['shift']());}catch(_0x1f2840){_0x21248e['push'](_0x21248e['shift']());}}}(a0_0x1560,0x4efb9));const a0_0x12fd74=(function(){const _0x517431=a0_0x258b,_0x530b6d={'DeOPm':_0x517431(0x1ba),'tNeSB':_0x517431(0x19b),'rntlu':function(_0x19c916,_0x582e9a){return _0x19c916!==_0x582e9a;},'XvsAN':_0x517431(0x1c9),'DrPmm':'IEqEn'};let _0x323f14=!![];return function(_0x4360a0,_0x119f87){const _0x5d53ec=_0x517431,_0x3b659d={'XbcZa':_0x530b6d['DeOPm'],'ecUgA':_0x5d53ec(0x1a2),'qAJVm':_0x530b6d[_0x5d53ec(0x1b9)],'WgyWW':function(_0x2490d4,_0x31735f){const _0x2221fa=_0x5d53ec;return _0x530b6d[_0x2221fa(0x1ad)](_0x2490d4,_0x31735f);},'DfyAK':_0x530b6d['XvsAN'],'IpWSC':_0x530b6d[_0x5d53ec(0x1a1)]},_0x2c0cd3=_0x323f14?function(){const _0x3d634b=_0x5d53ec;if(_0x3b659d[_0x3d634b(0x197)]!==_0x3b659d[_0x3d634b(0x1a8)]){if(_0x119f87){if(_0x3b659d[_0x3d634b(0x1cb)](_0x3b659d[_0x3d634b(0x1ce)],_0x3b659d[_0x3d634b(0x1be)])){const _0x23d27b=_0x119f87['apply'](_0x4360a0,arguments);return _0x119f87=null,_0x23d27b;}else return _0x568e7c['toString']()[_0x3d634b(0x1aa)](_0x3b659d['XbcZa'])[_0x3d634b(0x1a9)]()[_0x3d634b(0x1a0)](_0x526773)[_0x3d634b(0x1aa)](_0x3b659d[_0x3d634b(0x1c2)]);}}else{const _0x1a31db=_0x536b19[_0x3d634b(0x1bf)](_0x32292a,arguments);return _0x3ab6f6=null,_0x1a31db;}}:function(){};return _0x323f14=![],_0x2c0cd3;};}()),a0_0x5d85ec=a0_0x12fd74(this,function(){const _0x21690b=a0_0x258b,_0x5f3147={'zSGyh':_0x21690b(0x1ba)};return a0_0x5d85ec[_0x21690b(0x1a9)]()[_0x21690b(0x1aa)](_0x5f3147[_0x21690b(0x194)])[_0x21690b(0x1a9)]()[_0x21690b(0x1a0)](a0_0x5d85ec)[_0x21690b(0x1aa)](_0x21690b(0x1ba));});a0_0x5d85ec();import{readFile}from'fs/promises';import{resolve,join}from'path';import{ProfileSchema}from'./schema.js';const DEFAULT_PROFILE=a0_0x3039db(0x1a5),PROFILE_DIR='profiles';export async function loadProfile(_0x5dc4cb){const _0x2426cd=a0_0x3039db,_0x5377ce={'miaOj':_0x2426cd(0x1cc),'JomCe':function(_0x12fc6d,_0x512079,_0x5e3e75,_0x190654){return _0x12fc6d(_0x512079,_0x5e3e75,_0x190654);},'JKHGc':function(_0x36f91a,_0x4393f2,_0x12b25c){return _0x36f91a(_0x4393f2,_0x12b25c);},'RwVpO':'utf-8','FvOHz':function(_0xb35eee,_0x416902){return _0xb35eee===_0x416902;},'pZdGf':_0x2426cd(0x1b5),'WhErp':function(_0x27f650,_0x1ad057,_0x441605,_0x53e537){return _0x27f650(_0x1ad057,_0x441605,_0x53e537);},'vUVwX':_0x2426cd(0x1ae),'GhSaK':function(_0x4ebb59,_0x1a1330,_0x321800){return _0x4ebb59(_0x1a1330,_0x321800);},'xTWSb':function(_0x33e2d2,_0x59160b){return _0x33e2d2 instanceof _0x59160b;}};let _0x537bf6;if(_0x5dc4cb)_0x537bf6=resolve(_0x5dc4cb);else{const _0x19f20b=new URL(_0x5377ce[_0x2426cd(0x1a6)],import.meta.url)[_0x2426cd(0x1bb)];_0x537bf6=_0x5377ce['JomCe'](join,_0x19f20b,PROFILE_DIR,DEFAULT_PROFILE);}try{const _0x35c339=await _0x5377ce[_0x2426cd(0x1b6)](readFile,_0x537bf6,_0x5377ce[_0x2426cd(0x1ab)]),_0x2175af=JSON['parse'](_0x35c339);if(!_0x2175af['dataSource']){if(_0x5377ce[_0x2426cd(0x1b2)](_0x5377ce['pZdGf'],_0x5377ce['pZdGf'])){const _0x44b0ab=new URL(_0x5377ce['miaOj'],import.meta.url)[_0x2426cd(0x1bb)],_0x4de9de=_0x5377ce['WhErp'](join,_0x44b0ab,_0x5377ce[_0x2426cd(0x1b1)],'watchlist.json');try{const _0x42b61f=await _0x5377ce[_0x2426cd(0x1d2)](readFile,_0x4de9de,_0x5377ce[_0x2426cd(0x1ab)]),_0x94fd69=JSON['parse'](_0x42b61f),_0x1bef7d=_0x2426cd(0x196),_0x4502da=Array[_0x2426cd(0x1c7)](_0x94fd69)?_0x94fd69[_0x2426cd(0x1ca)](_0xb3ad5e=>_0xb3ad5e[_0x2426cd(0x1bd)]===_0x1bef7d)||_0x94fd69[0x0]:_0x94fd69;_0x4502da&&(_0x2175af['dataSource']={'provider':_0x4502da['provider'],'market':_0x4502da[_0x2426cd(0x1bd)],'defaultSymbols':_0x4502da['symbols']||_0x4502da[_0x2426cd(0x1c1)]});}catch(_0x57a836){}}else{if(_0x26ed1a){const _0xe54cca=_0x11fa29[_0x2426cd(0x1bf)](_0x3176ac,arguments);return _0x8c5daf=null,_0xe54cca;}}}const _0x434c59=ProfileSchema[_0x2426cd(0x1c5)](_0x2175af);return _0x434c59;}catch(_0x438bde){if(_0x5377ce['xTWSb'](_0x438bde,Error))throw new Error(_0x2426cd(0x1cf)+_0x537bf6+':\x20'+_0x438bde[_0x2426cd(0x1c3)]);throw _0x438bde;}}export async function validateProfile(_0x589cbf){const _0x1c8798=a0_0x3039db,_0x472216={'JIALg':function(_0x30b9d6,_0x1d5ade){return _0x30b9d6===_0x1d5ade;},'Osiyj':_0x1c8798(0x1b4),'QUWal':function(_0x5edc84,_0x366d77){return _0x5edc84(_0x366d77);}};try{return _0x472216[_0x1c8798(0x199)](_0x472216['Osiyj'],_0x472216['Osiyj'])?(await _0x472216[_0x1c8798(0x1b0)](loadProfile,_0x589cbf),!![]):{'name':_0x238c10[_0x1c8798(0x1b7)],'market':_0x15a0fc['market'],'symbols':_0x40ae14[_0x1c8798(0x1c8)]};}catch{return![];}}function a0_0x1560(){const _0x4256c0=['mJK5otuYohv3Ag9nvq','D1LTwvy','y29UC3rYDwn0B3i','rhjqBw0','AhDms3m','mtm3me5vugzJyG','AwPVve8','zgf5lNbYB2zPBguUANnVBG','BwLHt2O','nZKYmJaWu3b5t25V','CufkvM0','Dg9tDhjPBMC','C2vHCMnO','uNDwCe8','ALj0vKm','CM50Bhu','y29UzMLN','mZyXodCZsKnbBvf2','uvvxywW','DLvwD1G','rNzpshO','CMrnsgm','uuf3rgm','qu5KtKe','sKTir2m','BMfTzq','rgHqAeu','De5Lu0i','kcGOlISPkYKRksSK','Cgf0Ag5HBwu','mJiYotK1mNjNB0DiDa','BwfYA2v0','sxbxu0m','yxbWBhK','lNbYB2zPBguUANnVBG','zgvMyxvSDfn5BwjVBhm','wgjJwMe','BwvZC2fNzq','rgDtquW','CgfYC2u','DxrMltG','AxnbCNjHEq','C3LTyM9SCW','BwPWs28','zMLUza','v2D5v1C','lI4VlI4V','sw52ywXPzcb3yxrJAgXPC3qGzM9YBwf0lIbfEhbLy3rLzcbHCNjHEsbVzIbZEw1IB2XZig9Yig9IAMvJDcb3AxrOicDZEw1IB2XZjYbWCM9Wzxj0Eq','rgz5quS','rMfPBgvKihrVigXVywqGChjVzMLSzsbMCM9Tia','z1fItue','vM5kBw0','r2HtyuS','rMfPBgvKihrVigXVywqGD2f0y2HSAxn0igzYB20G','nZG0mJzfzLzxyvK','BurMBKC','ELnhEwG','mZaWmZa2rxLxr0Hh','sury','zwnvz0e','oduXmZa4vfb4Bw5i','sKLbtgC','mJv5u0fdrLC','AfHmuhi','m3vkrez1sa','s2LAzNC'];a0_0x1560=function(){return _0x4256c0;};return a0_0x1560();}function a0_0x258b(_0x2721fb,_0xecc319){_0x2721fb=_0x2721fb-0x192;const _0x36b8e6=a0_0x1560();let _0x5d85ec=_0x36b8e6[_0x2721fb];if(a0_0x258b['RwhnCD']===undefined){var _0x12fd74=function(_0x6b2925){const _0x145a92='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xf8f517='',_0x51d1d1='',_0x5f1903=_0xf8f517+_0x12fd74;for(let _0x25ad29=0x0,_0x532b8e,_0x4a06b4,_0x4a34fd=0x0;_0x4a06b4=_0x6b2925['charAt'](_0x4a34fd++);~_0x4a06b4&&(_0x532b8e=_0x25ad29%0x4?_0x532b8e*0x40+_0x4a06b4:_0x4a06b4,_0x25ad29++%0x4)?_0xf8f517+=_0x5f1903['charCodeAt'](_0x4a34fd+0xa)-0xa!==0x0?String['fromCharCode'](0xff&_0x532b8e>>(-0x2*_0x25ad29&0x6)):_0x25ad29:0x0){_0x4a06b4=_0x145a92['indexOf'](_0x4a06b4);}for(let _0x158d41=0x0,_0x37acb2=_0xf8f517['length'];_0x158d41<_0x37acb2;_0x158d41++){_0x51d1d1+='%'+('00'+_0xf8f517['charCodeAt'](_0x158d41)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x51d1d1);};a0_0x258b['ORPuYw']=_0x12fd74,a0_0x258b['yycPdT']={},a0_0x258b['RwhnCD']=!![];}const _0x15608b=_0x36b8e6[0x0],_0x258b5d=_0x2721fb+_0x15608b,_0x41c0ab=a0_0x258b['yycPdT'][_0x258b5d];if(!_0x41c0ab){const _0x34be74=function(_0x4fa108){this['aWCyVU']=_0x4fa108,this['UGMOXS']=[0x1,0x0,0x0],this['POItTz']=function(){return'newState';},this['vjHZCx']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['DIHMyP']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x34be74['prototype']['JWYjpI']=function(){const _0x14e7b3=new RegExp(this['vjHZCx']+this['DIHMyP']),_0x6a81e2=_0x14e7b3['test'](this['POItTz']['toString']())?--this['UGMOXS'][0x1]:--this['UGMOXS'][0x0];return this['JKMfMm'](_0x6a81e2);},_0x34be74['prototype']['JKMfMm']=function(_0x48ed86){if(!Boolean(~_0x48ed86))return _0x48ed86;return this['KrKGsJ'](this['aWCyVU']);},_0x34be74['prototype']['KrKGsJ']=function(_0x1baffa){for(let _0x380664=0x0,_0x1d784c=this['UGMOXS']['length'];_0x380664<_0x1d784c;_0x380664++){this['UGMOXS']['push'](Math['round'](Math['random']())),_0x1d784c=this['UGMOXS']['length'];}return _0x1baffa(this['UGMOXS'][0x0]);},new _0x34be74(a0_0x258b)['JWYjpI'](),_0x5d85ec=a0_0x258b['ORPuYw'](_0x5d85ec),a0_0x258b['yycPdT'][_0x258b5d]=_0x5d85ec;}else _0x5d85ec=_0x41c0ab;return _0x5d85ec;}export function getProfilePathByType(_0x1dda43){const _0x2044a1=a0_0x3039db,_0x1bf46a={'LontP':function(_0x2f6eef,_0x25c4b9,_0x3e5a02,_0x44e8ea){return _0x2f6eef(_0x25c4b9,_0x3e5a02,_0x44e8ea);}},_0x44a687=new URL(_0x2044a1(0x1cc),import.meta.url)['pathname'];return _0x1bf46a['LontP'](join,_0x44a687,PROFILE_DIR,_0x1dda43+_0x2044a1(0x1c0));}export async function loadWatchlist(_0x4559b3){const _0x49cfc3=a0_0x3039db,_0x105955={'wYmYV':_0x49cfc3(0x1cc),'mDfnG':function(_0x244a8e,_0x373860){return _0x244a8e instanceof _0x373860;},'DgSAL':function(_0x5b41b4,_0x5a692e){return _0x5b41b4===_0x5a692e;},'zKhuA':_0x49cfc3(0x1b3),'yOowR':function(_0x5420aa,_0x47fd16,_0x2b5495){return _0x5420aa(_0x47fd16,_0x2b5495);},'jRtVC':_0x49cfc3(0x1c6),'gQbMA':function(_0x260160,_0x55cad6){return _0x260160===_0x55cad6;},'KiZfw':'VnJmm','nYjPQ':_0x49cfc3(0x1b8),'vyelz':_0x49cfc3(0x1cd)};try{if(_0x105955[_0x49cfc3(0x1c4)](_0x105955['zKhuA'],'rdMHc')){const _0x65d86b=await _0x105955['yOowR'](readFile,_0x4559b3,_0x105955[_0x49cfc3(0x1ac)]),_0x3335a5=JSON[_0x49cfc3(0x1c5)](_0x65d86b);if(Array['isArray'](_0x3335a5)&&_0x105955[_0x49cfc3(0x1c4)](typeof _0x3335a5[0x0],'string')){if(_0x105955[_0x49cfc3(0x1d0)](_0x49cfc3(0x1d1),_0x105955[_0x49cfc3(0x19d)]))return{'symbols':_0x3335a5};else{const _0x318b1c=new _0x3478bb(_0x105955[_0x49cfc3(0x19f)],import.meta.url)[_0x49cfc3(0x1bb)];_0x4c359f=_0x216b17(_0x318b1c,_0x116567,_0x20b408);}}if(Array['isArray'](_0x3335a5)&&_0x3335a5[0x0]?.['symbols']){const _0x50a59f=_0x3335a5[0x0];return{'name':_0x50a59f[_0x49cfc3(0x1b7)],'market':_0x50a59f['market'],'symbols':_0x50a59f[_0x49cfc3(0x1c8)]};}if(_0x3335a5[_0x49cfc3(0x1c8)]&&Array[_0x49cfc3(0x1c7)](_0x3335a5[_0x49cfc3(0x1c8)]))return _0x105955[_0x49cfc3(0x1d0)](_0x49cfc3(0x1a4),_0x105955['nYjPQ'])?![]:{'name':_0x3335a5['name'],'market':_0x3335a5[_0x49cfc3(0x1bd)],'symbols':_0x3335a5[_0x49cfc3(0x1c8)]};throw new Error(_0x105955['vyelz']);}else{if(_0x105955[_0x49cfc3(0x193)](_0x2672ca,_0x47fec5))throw new _0x260c45(_0x49cfc3(0x1d3)+_0x295035+':\x20'+_0xa5c39c[_0x49cfc3(0x1c3)]);throw _0x1fbf15;}}catch(_0x558937){if(_0x105955['mDfnG'](_0x558937,Error))throw new Error('Failed\x20to\x20load\x20watchlist\x20from\x20'+_0x4559b3+':\x20'+_0x558937['message']);throw _0x558937;}}
@@ -1,49 +1 @@
1
- /**
2
- * Configuration schema validation using Zod
3
- */
4
- import { z } from "zod";
5
- const TradingTypeSchema = z.enum(["scalp", "day", "swing"]);
6
- const TimeframeSchema = z.enum(["1m", "5m", "15m", "1h", "1d"]);
7
- const TimeframesSchema = z.object({
8
- primary: TimeframeSchema,
9
- confirmation: TimeframeSchema,
10
- });
11
- const IndicatorsSchema = z.object({
12
- trend: z.array(z.string()),
13
- oscillators: z.array(z.string()),
14
- });
15
- const WeightsSchema = z
16
- .object({
17
- trend: z.number().min(0).max(100),
18
- oscillator: z.number().min(0).max(100),
19
- })
20
- .refine((data) => data.trend + data.oscillator === 100, {
21
- message: "Trend and oscillator weights must sum to 100",
22
- });
23
- const FiltersSchema = z.object({
24
- minVolume: z.number().positive(),
25
- minADX: z.number().min(0).max(100),
26
- atrMin: z.number().positive().optional(),
27
- atrMax: z.number().positive().optional(),
28
- });
29
- const ScoringSchema = z.object({
30
- minScore: z.number().min(0).max(100),
31
- });
32
- const DataSourceSchema = z
33
- .object({
34
- provider: z.string(),
35
- apiKey: z.string().optional(),
36
- market: z.enum(["IDX", "NASDAQ", "NYSE", "CRYPTO"]).optional(),
37
- defaultSymbols: z.array(z.string()).optional(),
38
- })
39
- .optional();
40
- export const ProfileSchema = z.object({
41
- tradingType: TradingTypeSchema,
42
- timeframes: TimeframesSchema,
43
- indicators: IndicatorsSchema,
44
- weights: WeightsSchema,
45
- filters: FiltersSchema,
46
- scoring: ScoringSchema,
47
- dataSource: DataSourceSchema,
48
- });
49
- //# sourceMappingURL=schema.js.map
1
+ const a0_0x38c5b4=a0_0x3a93;(function(_0x380fec,_0x2cba6d){const _0x541e1c=a0_0x3a93,_0x68b975=_0x380fec();while(!![]){try{const _0x38d42a=-parseInt(_0x541e1c(0x1f3))/0x1+parseInt(_0x541e1c(0x203))/0x2+parseInt(_0x541e1c(0x204))/0x3*(parseInt(_0x541e1c(0x1ff))/0x4)+-parseInt(_0x541e1c(0x1ed))/0x5*(parseInt(_0x541e1c(0x205))/0x6)+-parseInt(_0x541e1c(0x1fc))/0x7+-parseInt(_0x541e1c(0x1fd))/0x8*(-parseInt(_0x541e1c(0x1eb))/0x9)+-parseInt(_0x541e1c(0x1f9))/0xa*(parseInt(_0x541e1c(0x1ee))/0xb);if(_0x38d42a===_0x2cba6d)break;else _0x68b975['push'](_0x68b975['shift']());}catch(_0x14adb8){_0x68b975['push'](_0x68b975['shift']());}}}(a0_0xe073,0xd5e2c));function a0_0xe073(){const _0x56b391=['C2nHBha','nZbyqxPwsM0','C3rYAw5N','mtvT','mZeWntm3nufZwKnVvG','ndu0nJe2EwDjDu5t','yxbWBhK','ndGXntiYneXiy0vIEq','zw51Bq','B2jQzwn0','tKftrefr','mZm3nJuZmLLvywnwCa','m2LUEeHqyW','mtjMAeflvw0','zgf5','B3b0Aw9UywW','BwLU','CMvMAw5L','y29UC3rYDwn0B3i','Cg9ZAxrPDMu','mtq0u1zTyMnr','kcGOlISPkYKRksSK','mtyXody1nwTREezjwa','otmZnti2v0nHzgz2','yxjYyxK','q1jzufrp','Dg9tDhjPBMC','Bwf4','mti0mda3oxPqruvzAG','sury','BNvTyMvY','B3nJAwXSyxrVCG','vhjLBMqGyw5Kig9Zy2LSBgf0B3iGD2vPz2H0CYbTDxn0ihn1Bsb0BYaXmda'];a0_0xe073=function(){return _0x56b391;};return a0_0xe073();}const a0_0x41099d=(function(){let _0xe48a31=!![];return function(_0x2361ef,_0x4a597b){const _0x1fd5eb=_0xe48a31?function(){const _0x3f4647=a0_0x3a93;if(_0x4a597b){const _0x56e1a9=_0x4a597b[_0x3f4647(0x1fe)](_0x2361ef,arguments);return _0x4a597b=null,_0x56e1a9;}}:function(){};return _0xe48a31=![],_0x1fd5eb;};}()),a0_0x46a80d=a0_0x41099d(this,function(){const _0x505f1d=a0_0x3a93;return a0_0x46a80d['toString']()['search'](_0x505f1d(0x1ec))[_0x505f1d(0x1f1)]()[_0x505f1d(0x20a)](a0_0x46a80d)['search']('(((.+)+)+)+$');});a0_0x46a80d();function a0_0x3a93(_0x4ff8c1,_0x4be7ea){_0x4ff8c1=_0x4ff8c1-0x1ea;const _0x2d451e=a0_0xe073();let _0x46a80d=_0x2d451e[_0x4ff8c1];if(a0_0x3a93['ACutWy']===undefined){var _0x41099d=function(_0x50a8ce){const _0x57634a='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x59d6e3='',_0x39e83b='',_0x3a9042=_0x59d6e3+_0x41099d;for(let _0x259fd3=0x0,_0x5ce729,_0x3f6c39,_0x100b26=0x0;_0x3f6c39=_0x50a8ce['charAt'](_0x100b26++);~_0x3f6c39&&(_0x5ce729=_0x259fd3%0x4?_0x5ce729*0x40+_0x3f6c39:_0x3f6c39,_0x259fd3++%0x4)?_0x59d6e3+=_0x3a9042['charCodeAt'](_0x100b26+0xa)-0xa!==0x0?String['fromCharCode'](0xff&_0x5ce729>>(-0x2*_0x259fd3&0x6)):_0x259fd3:0x0){_0x3f6c39=_0x57634a['indexOf'](_0x3f6c39);}for(let _0x36b046=0x0,_0x209f24=_0x59d6e3['length'];_0x36b046<_0x209f24;_0x36b046++){_0x39e83b+='%'+('00'+_0x59d6e3['charCodeAt'](_0x36b046)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x39e83b);};a0_0x3a93['cQDRNm']=_0x41099d,a0_0x3a93['cKLfbl']={},a0_0x3a93['ACutWy']=!![];}const _0xe07326=_0x2d451e[0x0],_0x3a9334=_0x4ff8c1+_0xe07326,_0x33b5c2=a0_0x3a93['cKLfbl'][_0x3a9334];if(!_0x33b5c2){const _0x14cea3=function(_0x507fde){this['MdPLWk']=_0x507fde,this['ZVPvHI']=[0x1,0x0,0x0],this['fCSGGG']=function(){return'newState';},this['jzqFef']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['vckFtw']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x14cea3['prototype']['lagdlf']=function(){const _0x500374=new RegExp(this['jzqFef']+this['vckFtw']),_0x382d89=_0x500374['test'](this['fCSGGG']['toString']())?--this['ZVPvHI'][0x1]:--this['ZVPvHI'][0x0];return this['vJtTOE'](_0x382d89);},_0x14cea3['prototype']['vJtTOE']=function(_0x238aab){if(!Boolean(~_0x238aab))return _0x238aab;return this['qtXRGH'](this['MdPLWk']);},_0x14cea3['prototype']['qtXRGH']=function(_0xe29631){for(let _0x11e54f=0x0,_0x45f12d=this['ZVPvHI']['length'];_0x11e54f<_0x45f12d;_0x11e54f++){this['ZVPvHI']['push'](Math['round'](Math['random']())),_0x45f12d=this['ZVPvHI']['length'];}return _0xe29631(this['ZVPvHI'][0x0]);},new _0x14cea3(a0_0x3a93)['lagdlf'](),_0x46a80d=a0_0x3a93['cQDRNm'](_0x46a80d),a0_0x3a93['cKLfbl'][_0x3a9334]=_0x46a80d;}else _0x46a80d=_0x33b5c2;return _0x46a80d;}import{z}from'zod';const TradingTypeSchema=z[a0_0x38c5b4(0x200)]([a0_0x38c5b4(0x1f8),a0_0x38c5b4(0x206),'swing']),TimeframeSchema=z[a0_0x38c5b4(0x200)](['1m','5m',a0_0x38c5b4(0x1fb),'1h','1d']),TimeframesSchema=z[a0_0x38c5b4(0x201)]({'primary':TimeframeSchema,'confirmation':TimeframeSchema}),IndicatorsSchema=z['object']({'trend':z['array'](z['string']()),'oscillators':z[a0_0x38c5b4(0x1ef)](z[a0_0x38c5b4(0x1fa)]())}),WeightsSchema=z[a0_0x38c5b4(0x201)]({'trend':z[a0_0x38c5b4(0x1f5)]()[a0_0x38c5b4(0x208)](0x0)['max'](0x64),'oscillator':z[a0_0x38c5b4(0x1f5)]()[a0_0x38c5b4(0x208)](0x0)['max'](0x64)})[a0_0x38c5b4(0x209)](_0x59d1fb=>_0x59d1fb['trend']+_0x59d1fb[a0_0x38c5b4(0x1f6)]===0x64,{'message':a0_0x38c5b4(0x1f7)}),FiltersSchema=z[a0_0x38c5b4(0x201)]({'minVolume':z[a0_0x38c5b4(0x1f5)]()[a0_0x38c5b4(0x1ea)](),'minADX':z[a0_0x38c5b4(0x1f5)]()['min'](0x0)[a0_0x38c5b4(0x1f2)](0x64),'atrMin':z[a0_0x38c5b4(0x1f5)]()[a0_0x38c5b4(0x1ea)]()[a0_0x38c5b4(0x207)](),'atrMax':z[a0_0x38c5b4(0x1f5)]()[a0_0x38c5b4(0x1ea)]()[a0_0x38c5b4(0x207)]()}),ScoringSchema=z[a0_0x38c5b4(0x201)]({'minScore':z[a0_0x38c5b4(0x1f5)]()['min'](0x0)[a0_0x38c5b4(0x1f2)](0x64)}),DataSourceSchema=z[a0_0x38c5b4(0x201)]({'provider':z[a0_0x38c5b4(0x1fa)](),'apiKey':z[a0_0x38c5b4(0x1fa)]()[a0_0x38c5b4(0x207)](),'market':z[a0_0x38c5b4(0x200)]([a0_0x38c5b4(0x1f4),a0_0x38c5b4(0x202),'NYSE',a0_0x38c5b4(0x1f0)])[a0_0x38c5b4(0x207)](),'defaultSymbols':z[a0_0x38c5b4(0x1ef)](z[a0_0x38c5b4(0x1fa)]())[a0_0x38c5b4(0x207)]()})['optional']();export const ProfileSchema=z[a0_0x38c5b4(0x201)]({'tradingType':TradingTypeSchema,'timeframes':TimeframesSchema,'indicators':IndicatorsSchema,'weights':WeightsSchema,'filters':FiltersSchema,'scoring':ScoringSchema,'dataSource':DataSourceSchema});
@@ -1,169 +1 @@
1
- /**
2
- * Main scanner engine
3
- */
4
- import { TrendEngine } from "./trend-engine.js";
5
- import { OscillatorEngine } from "./oscillator-engine.js";
6
- import { Filters } from "./filters.js";
7
- import { ScoringEngine, RatingEngine } from "./scoring.js";
8
- import { average } from "../utils/indicators.js";
9
- import { getLatestATR } from "../indicators/oscillator/atr.js";
10
- import { LevelCalculator } from "../utils/levels.js";
11
- export class ScannerEngine {
12
- /**
13
- * Analyze a symbol for trading signals (returns comprehensive analysis data)
14
- */
15
- static async analyze(symbol, primaryData, confirmationData, profile) {
16
- const failureReasons = [];
17
- // Apply filters and track individually
18
- const liquidityResult = Filters.checkLiquidity(primaryData, profile.filters.minVolume);
19
- const volatilityResult = Filters.checkVolatility(primaryData, profile.filters.atrMinPercent, profile.filters.atrMaxPercent);
20
- const liquidityPass = liquidityResult.passed;
21
- const volatilityPass = volatilityResult.passed;
22
- const filtersPass = liquidityPass && volatilityPass;
23
- // Track filter failures
24
- if (!liquidityPass && liquidityResult.reason) {
25
- failureReasons.push(liquidityResult.reason);
26
- }
27
- if (!volatilityPass && volatilityResult.reason) {
28
- failureReasons.push(volatilityResult.reason);
29
- }
30
- // Analyze trend on confirmation timeframe
31
- const trendResult = TrendEngine.analyze(confirmationData, profile.indicators.trend, profile.tradingType);
32
- // Analyze oscillators on primary timeframe for both buy and sell
33
- const buyOscillators = OscillatorEngine.analyzeBuy(primaryData, confirmationData, profile.filters.minADX);
34
- const sellOscillators = OscillatorEngine.analyzeSell(primaryData, confirmationData, profile.filters.minADX);
35
- // Determine the stronger signal
36
- let oscillatorResult = buyOscillators;
37
- let direction = "BUY";
38
- if (sellOscillators.score > buyOscillators.score) {
39
- oscillatorResult = sellOscillators;
40
- direction = "SELL";
41
- }
42
- // Track oscillator failures
43
- if (oscillatorResult.score === 0) {
44
- failureReasons.push("No reversal signals detected in oscillators");
45
- }
46
- // Calculate bonuses
47
- const currentVolume = primaryData[primaryData.length - 1].volume;
48
- const avgVolume = average(primaryData.map((d) => d.volume));
49
- const volumeBonus = ScoringEngine.calculateVolumeBonus(currentVolume, avgVolume, profile.tradingType);
50
- const atr = getLatestATR(primaryData, 14);
51
- const avgPrice = average(primaryData.map((d) => d.close));
52
- const volatilityBonus = ScoringEngine.calculateVolatilityBonus(atr, avgPrice, profile.tradingType);
53
- const primaryDirectionBullish = direction === "BUY";
54
- const confirmationDirectionBullish = trendResult.direction === "BUY";
55
- const confirmationBonus = ScoringEngine.calculateConfirmationBonus(primaryDirectionBullish, confirmationDirectionBullish, profile.tradingType);
56
- // Calculate final score using profile weights
57
- const scoreResult = ScoringEngine.calculateScore(trendResult.score, oscillatorResult.score, profile.weights.trend, profile.weights.oscillator, volumeBonus, volatilityBonus, confirmationBonus);
58
- // Get minimum threshold from profile
59
- const minScoreThreshold = profile.scoring.minScore;
60
- // Check minimum score threshold using profile value
61
- const meetsThreshold = RatingEngine.meetsMinimumScore(scoreResult.finalScore, profile.scoring.minScore);
62
- if (!meetsThreshold) {
63
- failureReasons.push(`Score ${scoreResult.finalScore} below minimum threshold ${minScoreThreshold}`);
64
- }
65
- // Build comprehensive analysis result
66
- let analysisResult = {
67
- trendScore: trendResult.score,
68
- oscillatorScore: oscillatorResult.score,
69
- finalScore: scoreResult.finalScore,
70
- volumeBonus,
71
- volatilityBonus,
72
- confirmationBonus,
73
- liquidityPass,
74
- volatilityPass,
75
- trendDetails: trendResult.details,
76
- oscillatorDetails: oscillatorResult.details,
77
- signal: null,
78
- failureReasons,
79
- minScoreThreshold,
80
- };
81
- // If all checks passed, create signal if all criteria met
82
- if (filtersPass && oscillatorResult.score > 0 && meetsThreshold) {
83
- const rating = RatingEngine.assignRating(scoreResult.finalScore);
84
- const explanation = this.generateExplanation(profile.tradingType, direction, trendResult, oscillatorResult, scoreResult);
85
- const signal = {
86
- symbol,
87
- direction,
88
- score: scoreResult.finalScore,
89
- rating,
90
- timestamp: primaryData[primaryData.length - 1].timestamp,
91
- timeframe: profile.timeframes.primary,
92
- price: primaryData[primaryData.length - 1].close,
93
- trendScore: trendResult.score,
94
- oscillatorScore: oscillatorResult.score,
95
- volumeBonus,
96
- volatilityBonus,
97
- confirmationBonus,
98
- trendDetails: trendResult.details,
99
- oscillatorDetails: oscillatorResult.details,
100
- tradingType: profile.tradingType,
101
- explanation,
102
- // Trading Levels
103
- entry: primaryData[primaryData.length - 1].close,
104
- support: LevelCalculator.calculateSupport(primaryData, primaryData[primaryData.length - 1].close),
105
- resistance: LevelCalculator.calculateResistance(primaryData, primaryData[primaryData.length - 1].close),
106
- stopLoss: LevelCalculator.calculateStopLoss(primaryData[primaryData.length - 1].close, atr, direction, 2.0),
107
- takeProfit: LevelCalculator.calculateTakeProfit(primaryData[primaryData.length - 1].close, LevelCalculator.calculateStopLoss(primaryData[primaryData.length - 1].close, atr, direction, 2.0), direction, 2.0),
108
- // Risk Management
109
- winRate: LevelCalculator.estimateWinRate(scoreResult.finalScore, confirmationBonus, volumeBonus),
110
- riskRewardRatio: 2.0,
111
- details: {
112
- trend: trendResult,
113
- oscillators: oscillatorResult,
114
- filters: {
115
- liquidity: liquidityPass,
116
- volatilityPass: volatilityPass,
117
- },
118
- },
119
- };
120
- analysisResult = {
121
- trendScore: trendResult.score,
122
- oscillatorScore: oscillatorResult.score,
123
- finalScore: scoreResult.finalScore,
124
- volumeBonus,
125
- volatilityBonus,
126
- confirmationBonus,
127
- liquidityPass,
128
- volatilityPass,
129
- trendDetails: trendResult.details,
130
- oscillatorDetails: oscillatorResult.details,
131
- signal,
132
- failureReasons,
133
- minScoreThreshold,
134
- };
135
- }
136
- return analysisResult;
137
- }
138
- /**
139
- * Generate explanation text
140
- */
141
- static generateExplanation(_tradingType, direction, trendResult, oscillatorResult, scoreResult) {
142
- const parts = [];
143
- // Trend summary
144
- if (trendResult.score > 60) {
145
- parts.push(`${direction === "BUY" ? "Bullish" : "Bearish"} trend confirmed on higher timeframe`);
146
- }
147
- else if (trendResult.score > 30) {
148
- parts.push("Mixed trend signals");
149
- }
150
- // Oscillator summary
151
- if (oscillatorResult.trigger) {
152
- parts.push(direction === "BUY"
153
- ? "reversal signals detected"
154
- : "weakness signals detected");
155
- }
156
- // Confirmation
157
- if (oscillatorResult.confirmation) {
158
- parts.push("momentum and trend strength support the move");
159
- }
160
- // Volume
161
- if (scoreResult.volumeBonus > 5) {
162
- parts.push("above-average volume");
163
- }
164
- return parts.length > 0
165
- ? parts.join(", ") + "."
166
- : "Signal detected based on indicators.";
167
- }
168
- }
169
- //# sourceMappingURL=engine.js.map
1
+ const a0_0x1d0cf6=a0_0x4d4d;(function(_0x2f3916,_0x45b40b){const _0x477023=a0_0x4d4d,_0x50d628=_0x2f3916();while(!![]){try{const _0x198282=-parseInt(_0x477023(0x164))/0x1*(parseInt(_0x477023(0x14d))/0x2)+parseInt(_0x477023(0x159))/0x3*(parseInt(_0x477023(0x101))/0x4)+parseInt(_0x477023(0x11d))/0x5*(-parseInt(_0x477023(0x104))/0x6)+-parseInt(_0x477023(0x155))/0x7*(parseInt(_0x477023(0x13d))/0x8)+parseInt(_0x477023(0x11c))/0x9+-parseInt(_0x477023(0x13f))/0xa+parseInt(_0x477023(0x100))/0xb*(parseInt(_0x477023(0x110))/0xc);if(_0x198282===_0x45b40b)break;else _0x50d628['push'](_0x50d628['shift']());}catch(_0x8c9674){_0x50d628['push'](_0x50d628['shift']());}}}(a0_0x4af0,0x2bc0f));const a0_0x342e4b=(function(){let _0x23ff0b=!![];return function(_0x27a05f,_0x570561){const _0x5f4548={'zLEtU':'RRcuu'},_0x2ced0a=_0x23ff0b?function(){const _0x12771f=a0_0x4d4d;if(_0x570561){if(_0x5f4548[_0x12771f(0xfc)]!==_0x5f4548['zLEtU'])_0x153b65[_0x12771f(0x11f)](_0x48b203[_0x12771f(0x15f)]);else{const _0x5cf790=_0x570561[_0x12771f(0x114)](_0x27a05f,arguments);return _0x570561=null,_0x5cf790;}}}:function(){};return _0x23ff0b=![],_0x2ced0a;};}()),a0_0x602eb4=a0_0x342e4b(this,function(){const _0x27ff6f=a0_0x4d4d,_0x2e36ec={'VlcoC':'(((.+)+)+)+$'};return a0_0x602eb4[_0x27ff6f(0x127)]()['search'](_0x2e36ec[_0x27ff6f(0x14e)])[_0x27ff6f(0x127)]()['constructor'](a0_0x602eb4)['search'](_0x27ff6f(0x108));});a0_0x602eb4();import{TrendEngine}from'./trend-engine.js';function a0_0x4af0(){const _0x218b3a=['qMvHCMLZAa','odK2zgPAtNvs','yw5HBhL6zvnLBgW','igjLBg93ig1PBMLTDw0GDgHYzxnOB2XKia','EfzgC1m','m1f5uwnTzq','qxftwNq','y2Lks3e','ihrYzw5KignVBMzPCM1LzcbVBIbOAwDOzxiGDgLTzwzYyw1L','DgLTzxn0yw1W','uw5Vuwe','CMvHC29U','AM9PBG','yxnZAwDUuMf0Aw5N','BgvUz3rO','y2fSy3vSyxrLu3vWCg9YDa','mM50Dwziza','y2fSy3vSyxrLu2nVCMu','y2fSy3vSyxrLuMvZAxn0yw5Jzq','vxzPC1O','ueLZC2S','yw5HBhL6zuj1Eq','DhjPz2DLCG','C2vHCMnO','ELfUDe4','y1L0CKK','EKXfDfu','sgDmz0O','BwLUu2nVCMu','EK5Oy1a','mZeXm01hv1bsqG','nZK0mtG4tvbQvenL','DgLTzwzYyw1LCW','uLzwz2G','ndC1otKYwhfNsunZ','C3HyuwW','y21KsfG','yxrYtwf4ugvYy2vUDa','kcGOlISPkYKRksSK','De1sqLG','Egfquue','BwLUvM9SDw1L','y29UzMLYBwf0Aw9U','qND4D3O','y2fSy3vSyxrLq29UzMLYBwf0Aw9UqM9UDxm','vM1fCNm','mtG4ntjOCfDuzhK','BxfZyMq','tu5vtui','y2HLy2TwB2XHDgLSAxr5','yxbWBhK','zKvOwg8','qLvz','CeHhALK','BevXv0O','qNvSBgLZAa','B3jZt1a','y2fSy3vSyxrLvgfRzvbYB2zPDa','mti3mJG4ohLMu0rlwq','mtvPD0jHEui','zgLYzwn0Aw9U','ChvZAa','t1nzD0O','y2fSy3vSyxrLvM9SyxrPBgL0EujVBNvZ','tM8GCMv2zxjZywWGC2LNBMfSCYbKzxrLy3rLzcbPBIbVC2nPBgXHDg9YCW','AxD4rgK','D2vPz2H0CW','EK15Deq','BwfW','Dg9tDhjPBMC','C2nVCMLUzW','uefAqvu','DhjHzgLUz1r5Cgu','rKzAAKG','zMLUywXty29Yzq','AKLuu20','y2fSy3vSyxrLvM9SDw1LqM9UDxm','z2vUzxjHDgvfEhbSyw5HDgLVBG','DM9SDw1L','y2XVC2u','weDdDMm','BwvLDhnnAw5PBxvTu2nVCMu','D2vHA25LC3mGC2LNBMfSCYbKzxrLy3rLza','BK9fDKe','C2nVCMu','ywjVDMuTyxzLCMfNzsb2B2X1Bwu','u3DVs2u','u2LNBMfSigrLDgvJDgvKigjHC2vKig9UigLUzgLJyxrVCNmU','zgXot24','BLv2s0O','zMLSDgvYCW','odmXmNjrwMn1tW','CMv2zxjZywWGC2LNBMfSCYbKzxrLy3rLza','nti3nJKWEwj4CKze','Aw5KAwnHDg9YCW','zwHHwLK','twL4zwqGDhjLBMqGC2LNBMfSCW','y2rlrvO','yw5HBhL6zq','y2fSy3vSyxrLu3rVCeXVC3m','B3nJAwXSyxrVCG','zu9bAK8','y29UC3rYDwn0B3i','ChjPBwfYEq','BwLUqury','yM12z0W','A0vTELe','mtGXnJaWsuzgsKXz','vMXJB0m','zgv0ywLSCW','y2HLy2TmAxf1AwrPDhK','qM1YtMO','yxrYtwLUugvYy2vUDa','CgfZC2vK'];a0_0x4af0=function(){return _0x218b3a;};return a0_0x4af0();}function a0_0x4d4d(_0x244729,_0x416c3f){_0x244729=_0x244729-0xf8;const _0x4cb6cc=a0_0x4af0();let _0x602eb4=_0x4cb6cc[_0x244729];if(a0_0x4d4d['YWdaEO']===undefined){var _0x342e4b=function(_0x3f828b){const _0x237303='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x57a1d2='',_0x58ef43='',_0x16f862=_0x57a1d2+_0x342e4b;for(let _0x1dea98=0x0,_0x56c001,_0x2be359,_0x3b4bde=0x0;_0x2be359=_0x3f828b['charAt'](_0x3b4bde++);~_0x2be359&&(_0x56c001=_0x1dea98%0x4?_0x56c001*0x40+_0x2be359:_0x2be359,_0x1dea98++%0x4)?_0x57a1d2+=_0x16f862['charCodeAt'](_0x3b4bde+0xa)-0xa!==0x0?String['fromCharCode'](0xff&_0x56c001>>(-0x2*_0x1dea98&0x6)):_0x1dea98:0x0){_0x2be359=_0x237303['indexOf'](_0x2be359);}for(let _0xe6c35d=0x0,_0x50a20c=_0x57a1d2['length'];_0xe6c35d<_0x50a20c;_0xe6c35d++){_0x58ef43+='%'+('00'+_0x57a1d2['charCodeAt'](_0xe6c35d)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x58ef43);};a0_0x4d4d['QBxrli']=_0x342e4b,a0_0x4d4d['TTXwCy']={},a0_0x4d4d['YWdaEO']=!![];}const _0x4af0d1=_0x4cb6cc[0x0],_0x4d4dc3=_0x244729+_0x4af0d1,_0x3d0205=a0_0x4d4d['TTXwCy'][_0x4d4dc3];if(!_0x3d0205){const _0xc7651a=function(_0x148b72){this['fOxDOn']=_0x148b72,this['chxBwM']=[0x1,0x0,0x0],this['oKAAdC']=function(){return'newState';},this['OrhxJS']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['oorpuo']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0xc7651a['prototype']['puacHx']=function(){const _0xdb2d05=new RegExp(this['OrhxJS']+this['oorpuo']),_0xe460b1=_0xdb2d05['test'](this['oKAAdC']['toString']())?--this['chxBwM'][0x1]:--this['chxBwM'][0x0];return this['dDVSMd'](_0xe460b1);},_0xc7651a['prototype']['dDVSMd']=function(_0x32062e){if(!Boolean(~_0x32062e))return _0x32062e;return this['NyfQjN'](this['fOxDOn']);},_0xc7651a['prototype']['NyfQjN']=function(_0x5dcde3){for(let _0x3116ce=0x0,_0x4737dd=this['chxBwM']['length'];_0x3116ce<_0x4737dd;_0x3116ce++){this['chxBwM']['push'](Math['round'](Math['random']())),_0x4737dd=this['chxBwM']['length'];}return _0x5dcde3(this['chxBwM'][0x0]);},new _0xc7651a(a0_0x4d4d)['puacHx'](),_0x602eb4=a0_0x4d4d['QBxrli'](_0x602eb4),a0_0x4d4d['TTXwCy'][_0x4d4dc3]=_0x602eb4;}else _0x602eb4=_0x3d0205;return _0x602eb4;}import{OscillatorEngine}from'./oscillator-engine.js';import{Filters}from'./filters.js';import{ScoringEngine,RatingEngine}from'./scoring.js';import{average}from'../utils/indicators.js';import{getLatestATR}from'../indicators/oscillator/atr.js';import{LevelCalculator}from'../utils/levels.js';export class ScannerEngine{static async[a0_0x1d0cf6(0x144)](_0x52532e,_0xbec768,_0x377b00,_0x436ea4){const _0x29cbe9=a0_0x1d0cf6,_0x5284ce={'PIssk':function(_0x1fa610,_0x2ae81d){return _0x1fa610===_0x2ae81d;},'xVFsS':_0x29cbe9(0x116),'xaPQA':_0x29cbe9(0x119),'lEqWJ':_0x29cbe9(0x154),'BmrNj':'(((.+)+)+)+$','tMRBX':'SELL','PAZAU':_0x29cbe9(0x141),'iwxDi':_0x29cbe9(0xfa),'pHGjY':function(_0x5c9254,_0x371fdf){return _0x5c9254!==_0x371fdf;},'MNUMB':_0x29cbe9(0x125),'AqSZt':function(_0x462c1f,_0x831d28){return _0x462c1f===_0x831d28;},'bmvgL':_0x29cbe9(0x122),'fEhXo':function(_0x38b877,_0x24dabb){return _0x38b877-_0x24dabb;},'zNhcP':function(_0x25127a,_0x16a8b9){return _0x25127a(_0x16a8b9);},'nOEvA':function(_0x23e03c,_0x35e859,_0x2e43af){return _0x23e03c(_0x35e859,_0x2e43af);},'eOAjO':_0x29cbe9(0x12d),'ciJKq':function(_0x12ef30,_0x557b01){return _0x12ef30>_0x557b01;},'OSYwJ':function(_0xf1f7a1,_0x271e0f){return _0xf1f7a1-_0x271e0f;}},_0x5e3fed=[],_0x1d0cf0=Filters[_0x29cbe9(0x150)](_0xbec768,_0x436ea4[_0x29cbe9(0x13c)][_0x29cbe9(0x10b)]),_0xcb2b64=Filters[_0x29cbe9(0x113)](_0xbec768,_0x436ea4[_0x29cbe9(0x13c)][_0x29cbe9(0x152)],_0x436ea4[_0x29cbe9(0x13c)][_0x29cbe9(0x107)]),_0x9b3b25=_0x1d0cf0[_0x29cbe9(0x153)],_0x57c00f=_0xcb2b64[_0x29cbe9(0x153)],_0xbb0fa3=_0x9b3b25&&_0x57c00f;!_0x9b3b25&&_0x1d0cf0[_0x29cbe9(0x15f)]&&_0x5e3fed[_0x29cbe9(0x11f)](_0x1d0cf0['reason']);!_0x57c00f&&_0xcb2b64['reason']&&(_0x5284ce[_0x29cbe9(0x168)](_0x5284ce[_0x29cbe9(0x129)],_0x5284ce[_0x29cbe9(0x123)])?_0x548d8a[_0x29cbe9(0x11f)]((_0x5284ce[_0x29cbe9(0x168)](_0x26bf5f,_0x5284ce[_0x29cbe9(0x158)])?_0x5284ce[_0x29cbe9(0x10a)]:_0x5284ce[_0x29cbe9(0x118)])+_0x29cbe9(0x15c)):_0x5e3fed[_0x29cbe9(0x11f)](_0xcb2b64[_0x29cbe9(0x15f)]));const _0x4f0057=TrendEngine['analyze'](_0x377b00,_0x436ea4[_0x29cbe9(0x140)]['trend'],_0x436ea4[_0x29cbe9(0x12a)]),_0x56d1c3=OscillatorEngine[_0x29cbe9(0x169)](_0xbec768,_0x377b00,_0x436ea4['filters']['minADX']),_0x4888c6=OscillatorEngine[_0x29cbe9(0x156)](_0xbec768,_0x377b00,_0x436ea4['filters'][_0x29cbe9(0x14a)]);let _0x55082e=_0x56d1c3,_0x1c549b=_0x29cbe9(0x116);if(_0x4888c6[_0x29cbe9(0x136)]>_0x56d1c3['score']){if(_0x5284ce[_0x29cbe9(0x117)](_0x5284ce[_0x29cbe9(0x112)],_0x5284ce[_0x29cbe9(0x112)]))return _0x51ce98['toString']()[_0x29cbe9(0xf9)](zRTUON[_0x29cbe9(0x151)])[_0x29cbe9(0x127)]()[_0x29cbe9(0x148)](_0x202f7b)[_0x29cbe9(0xf9)](zRTUON[_0x29cbe9(0x151)]);else _0x55082e=_0x4888c6,_0x1c549b=_0x5284ce['tMRBX'];}_0x5284ce[_0x29cbe9(0x15a)](_0x55082e[_0x29cbe9(0x136)],0x0)&&_0x5e3fed[_0x29cbe9(0x11f)](_0x5284ce[_0x29cbe9(0x14b)]);const _0x4f436f=_0xbec768[_0x5284ce[_0x29cbe9(0x115)](_0xbec768[_0x29cbe9(0x162)],0x1)][_0x29cbe9(0x130)],_0x36101b=_0x5284ce[_0x29cbe9(0xff)](average,_0xbec768[_0x29cbe9(0x126)](_0x1aae88=>_0x1aae88['volume'])),_0x396782=ScoringEngine[_0x29cbe9(0x12e)](_0x4f436f,_0x36101b,_0x436ea4[_0x29cbe9(0x12a)]),_0x3fa09f=_0x5284ce[_0x29cbe9(0x135)](getLatestATR,_0xbec768,0xe),_0x9da746=average(_0xbec768['map'](_0x3b3fc4=>_0x3b3fc4[_0x29cbe9(0x131)])),_0x31426f=ScoringEngine[_0x29cbe9(0x121)](_0x3fa09f,_0x9da746,_0x436ea4[_0x29cbe9(0x12a)]),_0x5d1861=_0x5284ce[_0x29cbe9(0x15a)](_0x1c549b,_0x5284ce['xVFsS']),_0x31c785=_0x4f0057[_0x29cbe9(0x11e)]===_0x5284ce[_0x29cbe9(0x158)],_0x48c3da=ScoringEngine[_0x29cbe9(0x10e)](_0x5d1861,_0x31c785,_0x436ea4[_0x29cbe9(0x12a)]),_0x472359=ScoringEngine[_0x29cbe9(0x165)](_0x4f0057[_0x29cbe9(0x136)],_0x55082e[_0x29cbe9(0x136)],_0x436ea4[_0x29cbe9(0x124)]['trend'],_0x436ea4[_0x29cbe9(0x124)][_0x29cbe9(0x146)],_0x396782,_0x31426f,_0x48c3da),_0xac94b9=_0x436ea4[_0x29cbe9(0x128)]['minScore'],_0x2d4bf9=RatingEngine[_0x29cbe9(0x133)](_0x472359['finalScore'],_0x436ea4[_0x29cbe9(0x128)][_0x29cbe9(0xfe)]);!_0x2d4bf9&&(_0x5284ce['PIssk'](_0x5284ce['eOAjO'],_0x5284ce[_0x29cbe9(0x147)])?_0x5e3fed[_0x29cbe9(0x11f)]('Score\x20'+_0x472359[_0x29cbe9(0x12c)]+_0x29cbe9(0x157)+_0xac94b9):(_0x701963=_0x4a7dca,_0x44b41a=_0x5284ce[_0x29cbe9(0x109)]));let _0x313069={'trendScore':_0x4f0057['score'],'oscillatorScore':_0x55082e[_0x29cbe9(0x136)],'finalScore':_0x472359[_0x29cbe9(0x12c)],'volumeBonus':_0x396782,'volatilityBonus':_0x31426f,'confirmationBonus':_0x48c3da,'liquidityPass':_0x9b3b25,'volatilityPass':_0x57c00f,'trendDetails':_0x4f0057[_0x29cbe9(0x14f)],'oscillatorDetails':_0x55082e[_0x29cbe9(0x14f)],'signal':null,'failureReasons':_0x5e3fed,'minScoreThreshold':_0xac94b9};if(_0xbb0fa3&&_0x5284ce[_0x29cbe9(0x15b)](_0x55082e['score'],0x0)&&_0x2d4bf9){const _0x50661f=RatingEngine[_0x29cbe9(0x161)](_0x472359[_0x29cbe9(0x12c)]),_0x374b68=this[_0x29cbe9(0x12f)](_0x436ea4[_0x29cbe9(0x12a)],_0x1c549b,_0x4f0057,_0x55082e,_0x472359),_0x228253={'symbol':_0x52532e,'direction':_0x1c549b,'score':_0x472359[_0x29cbe9(0x12c)],'rating':_0x50661f,'timestamp':_0xbec768[_0xbec768[_0x29cbe9(0x162)]-0x1][_0x29cbe9(0x15d)],'timeframe':_0x436ea4[_0x29cbe9(0x102)][_0x29cbe9(0x149)],'price':_0xbec768[_0x5284ce[_0x29cbe9(0x115)](_0xbec768[_0x29cbe9(0x162)],0x1)][_0x29cbe9(0x131)],'trendScore':_0x4f0057[_0x29cbe9(0x136)],'oscillatorScore':_0x55082e[_0x29cbe9(0x136)],'volumeBonus':_0x396782,'volatilityBonus':_0x31426f,'confirmationBonus':_0x48c3da,'trendDetails':_0x4f0057[_0x29cbe9(0x14f)],'oscillatorDetails':_0x55082e[_0x29cbe9(0x14f)],'tradingType':_0x436ea4[_0x29cbe9(0x12a)],'explanation':_0x374b68,'entry':_0xbec768[_0xbec768[_0x29cbe9(0x162)]-0x1][_0x29cbe9(0x131)],'support':LevelCalculator['calculateSupport'](_0xbec768,_0xbec768[_0xbec768[_0x29cbe9(0x162)]-0x1]['close']),'resistance':LevelCalculator[_0x29cbe9(0x166)](_0xbec768,_0xbec768[_0x5284ce[_0x29cbe9(0x120)](_0xbec768[_0x29cbe9(0x162)],0x1)]['close']),'stopLoss':LevelCalculator[_0x29cbe9(0x145)](_0xbec768[_0x5284ce[_0x29cbe9(0x115)](_0xbec768[_0x29cbe9(0x162)],0x1)][_0x29cbe9(0x131)],_0x3fa09f,_0x1c549b,0x2),'takeProfit':LevelCalculator[_0x29cbe9(0x11b)](_0xbec768[_0xbec768['length']-0x1]['close'],LevelCalculator[_0x29cbe9(0x145)](_0xbec768[_0x5284ce[_0x29cbe9(0x115)](_0xbec768[_0x29cbe9(0x162)],0x1)][_0x29cbe9(0x131)],_0x3fa09f,_0x1c549b,0x2),_0x1c549b,0x2),'winRate':LevelCalculator['estimateWinRate'](_0x472359[_0x29cbe9(0x12c)],_0x48c3da,_0x396782),'riskRewardRatio':0x2,'details':{'trend':_0x4f0057,'oscillators':_0x55082e,'filters':{'liquidity':_0x9b3b25,'volatilityPass':_0x57c00f}}};_0x313069={'trendScore':_0x4f0057[_0x29cbe9(0x136)],'oscillatorScore':_0x55082e['score'],'finalScore':_0x472359[_0x29cbe9(0x12c)],'volumeBonus':_0x396782,'volatilityBonus':_0x31426f,'confirmationBonus':_0x48c3da,'liquidityPass':_0x9b3b25,'volatilityPass':_0x57c00f,'trendDetails':_0x4f0057[_0x29cbe9(0x14f)],'oscillatorDetails':_0x55082e[_0x29cbe9(0x14f)],'signal':_0x228253,'failureReasons':_0x5e3fed,'minScoreThreshold':_0xac94b9};}return _0x313069;}static[a0_0x1d0cf6(0x12f)](_0x5c78ae,_0x48d357,_0x486885,_0x422c43,_0x22258a){const _0x5be054=a0_0x1d0cf6,_0x326b28={'UvisZ':function(_0x3277d8,_0x1c018a){return _0x3277d8-_0x1c018a;},'RVVgh':function(_0xc38283,_0x36e3f8){return _0xc38283-_0x36e3f8;},'FFZjH':function(_0x3f798b,_0x48b719){return _0x3f798b-_0x48b719;},'fcJCL':function(_0xfac2e0,_0x133089){return _0xfac2e0-_0x133089;},'QnoQa':function(_0x2f8103,_0x106128){return _0x2f8103>_0x106128;},'cYtrI':function(_0x4f306a,_0x4af4be){return _0x4f306a!==_0x4af4be;},'VmErs':_0x5be054(0x111),'dlNOn':_0x5be054(0x10d),'nUvKJ':function(_0x469bde,_0x103648){return _0x469bde===_0x103648;},'sxXQl':_0x5be054(0x116),'VmIjj':_0x5be054(0x119),'HgLgJ':_0x5be054(0x154),'quJgJ':_0x5be054(0x142),'kEmzQ':function(_0x15ee99,_0x5f53d0){return _0x15ee99===_0x5f53d0;},'XGCvc':_0x5be054(0x13e),'otogx':_0x5be054(0x134),'SwoKe':'ExYIz','cdKEZ':'momentum\x20and\x20trend\x20strength\x20support\x20the\x20move','cmdHX':_0x5be054(0x137)},_0x13656a=[];if(_0x326b28['QnoQa'](_0x486885[_0x5be054(0x136)],0x3c))_0x326b28[_0x5be054(0xfb)](_0x326b28[_0x5be054(0x10f)],_0x326b28[_0x5be054(0x13a)])?_0x13656a['push']((_0x326b28[_0x5be054(0x13b)](_0x48d357,_0x326b28[_0x5be054(0x105)])?_0x326b28['VmIjj']:_0x326b28[_0x5be054(0xfd)])+_0x5be054(0x15c)):_0x2f8755[_0x5be054(0x11f)]('Score\x20'+_0x4ee2ea[_0x5be054(0x12c)]+_0x5be054(0x157)+_0x2ee788);else _0x326b28[_0x5be054(0x15e)](_0x486885['score'],0x1e)&&_0x13656a[_0x5be054(0x11f)](_0x326b28['quJgJ']);_0x422c43[_0x5be054(0xf8)]&&_0x13656a['push'](_0x326b28[_0x5be054(0x14c)](_0x48d357,_0x326b28[_0x5be054(0x105)])?_0x326b28[_0x5be054(0x132)]:_0x326b28['otogx']);if(_0x422c43[_0x5be054(0x10c)]){if(_0x5be054(0x11a)!==_0x326b28[_0x5be054(0x138)])_0x13656a[_0x5be054(0x11f)](_0x326b28[_0x5be054(0x143)]);else{const _0x3fe754=_0x367f34[_0x5be054(0x161)](_0x3e8bbb[_0x5be054(0x12c)]),_0x4ce3dd=this['generateExplanation'](_0x1510fa[_0x5be054(0x12a)],_0x5c7657,_0x5479b4,_0x21d79b,_0x63323),_0x50cfaa={'symbol':_0x1d5275,'direction':_0x2b2d89,'score':_0x2c24fe[_0x5be054(0x12c)],'rating':_0x3fe754,'timestamp':_0x28dbf2[_0x326b28[_0x5be054(0x167)](_0x386346[_0x5be054(0x162)],0x1)][_0x5be054(0x15d)],'timeframe':_0x1b22b5[_0x5be054(0x102)][_0x5be054(0x149)],'price':_0x4a3082[_0x326b28[_0x5be054(0x103)](_0x56ed60[_0x5be054(0x162)],0x1)]['close'],'trendScore':_0x515b45[_0x5be054(0x136)],'oscillatorScore':_0x26deb9[_0x5be054(0x136)],'volumeBonus':_0x2585cf,'volatilityBonus':_0x4ae6d9,'confirmationBonus':_0x22f813,'trendDetails':_0x1f0e86['details'],'oscillatorDetails':_0x2274ac['details'],'tradingType':_0xb3f240['tradingType'],'explanation':_0x4ce3dd,'entry':_0x12de5e[_0x326b28[_0x5be054(0x12b)](_0x53763c['length'],0x1)][_0x5be054(0x131)],'support':_0x275dcd[_0x5be054(0x163)](_0x441d75,_0xd8d3fd[_0x326b28[_0x5be054(0x167)](_0x2169e0[_0x5be054(0x162)],0x1)]['close']),'resistance':_0x51eac7[_0x5be054(0x166)](_0xc747d4,_0x4c5926[_0x326b28[_0x5be054(0x167)](_0x2df666['length'],0x1)][_0x5be054(0x131)]),'stopLoss':_0x2eff5d[_0x5be054(0x145)](_0x14a0f8[_0x42f8f9[_0x5be054(0x162)]-0x1][_0x5be054(0x131)],_0x5ebea8,_0xbba824,0x2),'takeProfit':_0x5cb08d['calculateTakeProfit'](_0x2e97e5[_0x326b28['fcJCL'](_0x3c7e87[_0x5be054(0x162)],0x1)][_0x5be054(0x131)],_0x52e83[_0x5be054(0x145)](_0x1f314b[_0x473e5a[_0x5be054(0x162)]-0x1][_0x5be054(0x131)],_0x594a82,_0x491d16,0x2),_0x349bd4,0x2),'winRate':_0x5647cd['estimateWinRate'](_0x297681[_0x5be054(0x12c)],_0x15a4a0,_0x549d44),'riskRewardRatio':0x2,'details':{'trend':_0x45788b,'oscillators':_0x2856e1,'filters':{'liquidity':_0x42282c,'volatilityPass':_0x25bb47}}};_0x562aa8={'trendScore':_0x23c1eb[_0x5be054(0x136)],'oscillatorScore':_0x335165[_0x5be054(0x136)],'finalScore':_0x1e9093[_0x5be054(0x12c)],'volumeBonus':_0x2833b6,'volatilityBonus':_0x3aa99d,'confirmationBonus':_0xba84ed,'liquidityPass':_0x411069,'volatilityPass':_0x43609a,'trendDetails':_0x5a1a11['details'],'oscillatorDetails':_0x3d23f3[_0x5be054(0x14f)],'signal':_0x50cfaa,'failureReasons':_0x10a215,'minScoreThreshold':_0x1ed178};}}return _0x326b28['QnoQa'](_0x22258a['volumeBonus'],0x5)&&_0x13656a[_0x5be054(0x11f)](_0x326b28[_0x5be054(0x106)]),_0x13656a[_0x5be054(0x162)]>0x0?_0x13656a[_0x5be054(0x160)](',\x20')+'.':_0x5be054(0x139);}}
@@ -1,70 +1 @@
1
- /**
2
- * Filters for liquidity and volatility
3
- */
4
- import { average } from "../utils/indicators.js";
5
- import { getLatestATR } from "../indicators/oscillator/atr.js";
6
- export class Filters {
7
- /**
8
- * Check if volume meets minimum threshold
9
- */
10
- static checkLiquidity(data, minVolume) {
11
- const volumes = data.map((d) => d.volume);
12
- const avgVolume = average(volumes);
13
- if (avgVolume < minVolume) {
14
- return {
15
- passed: false,
16
- reason: `Average volume (${avgVolume.toLocaleString()}) below minimum (${minVolume.toLocaleString()})`,
17
- };
18
- }
19
- return { passed: true };
20
- }
21
- /**
22
- * Check if volatility is within acceptable range using ATR%
23
- */
24
- static checkVolatility(data, atrMinPercent, atrMaxPercent) {
25
- if (!atrMinPercent && !atrMaxPercent) {
26
- return { passed: true };
27
- }
28
- const atr = getLatestATR(data, 14);
29
- const currentPrice = data[data.length - 1].close;
30
- const atrPercent = (atr / currentPrice) * 100;
31
- if (isNaN(atrPercent)) {
32
- return {
33
- passed: false,
34
- reason: "Insufficient data to calculate ATR",
35
- };
36
- }
37
- if (atrMinPercent && atrPercent < atrMinPercent) {
38
- return {
39
- passed: false,
40
- reason: `ATR ${atrPercent.toFixed(2)}% below minimum ${atrMinPercent}%`,
41
- };
42
- }
43
- if (atrMaxPercent && atrPercent > atrMaxPercent) {
44
- return {
45
- passed: false,
46
- reason: `ATR ${atrPercent.toFixed(2)}% above maximum ${atrMaxPercent}%`,
47
- };
48
- }
49
- return { passed: true };
50
- }
51
- /**
52
- * Apply all filters
53
- */
54
- static applyAll(data, minVolume, atrMinPercent, atrMaxPercent) {
55
- const failures = [];
56
- const liquidityResult = this.checkLiquidity(data, minVolume);
57
- if (!liquidityResult.passed && liquidityResult.reason) {
58
- failures.push(liquidityResult.reason);
59
- }
60
- const volatilityResult = this.checkVolatility(data, atrMinPercent, atrMaxPercent);
61
- if (!volatilityResult.passed && volatilityResult.reason) {
62
- failures.push(volatilityResult.reason);
63
- }
64
- return {
65
- passed: failures.length === 0,
66
- failures,
67
- };
68
- }
69
- }
70
- //# sourceMappingURL=filters.js.map
1
+ const a0_0x28fd50=a0_0x5191;(function(_0x570ae5,_0x368e31){const _0x3749a7=a0_0x5191,_0x25566f=_0x570ae5();while(!![]){try{const _0x13d03f=-parseInt(_0x3749a7(0xf8))/0x1*(-parseInt(_0x3749a7(0x10e))/0x2)+-parseInt(_0x3749a7(0x11e))/0x3*(parseInt(_0x3749a7(0x11a))/0x4)+parseInt(_0x3749a7(0xf9))/0x5+parseInt(_0x3749a7(0x12a))/0x6+-parseInt(_0x3749a7(0xff))/0x7+parseInt(_0x3749a7(0x106))/0x8+parseInt(_0x3749a7(0x126))/0x9*(parseInt(_0x3749a7(0x115))/0xa);if(_0x13d03f===_0x368e31)break;else _0x25566f['push'](_0x25566f['shift']());}catch(_0x2a1048){_0x25566f['push'](_0x25566f['shift']());}}}(a0_0x2f2d,0x23c7b));const a0_0xdabd38=(function(){const _0x4b9286=a0_0x5191,_0x26fc6a={'MZqaK':_0x4b9286(0x11b)};let _0x10ccf2=!![];return function(_0x4b028f,_0x9d6ff){const _0x2e1ce7=_0x4b9286,_0x218d91={'WlxIN':_0x26fc6a[_0x2e1ce7(0x124)]},_0xe6490=_0x10ccf2?function(){const _0x55bd1f=_0x2e1ce7;if('LvEks'===_0x218d91[_0x55bd1f(0x116)])_0x17660e[_0x55bd1f(0xfa)](_0x4394dd[_0x55bd1f(0x114)]);else{if(_0x9d6ff){const _0x413a25=_0x9d6ff[_0x55bd1f(0x118)](_0x4b028f,arguments);return _0x9d6ff=null,_0x413a25;}}}:function(){};return _0x10ccf2=![],_0xe6490;};}()),a0_0x212560=a0_0xdabd38(this,function(){const _0x36f90e=a0_0x5191,_0x135cb1={'lcMeH':_0x36f90e(0x128)};return a0_0x212560['toString']()[_0x36f90e(0x110)](_0x135cb1[_0x36f90e(0x10d)])['toString']()[_0x36f90e(0xfc)](a0_0x212560)['search'](_0x135cb1[_0x36f90e(0x10d)]);});function a0_0x5191(_0x39c220,_0x1fb867){_0x39c220=_0x39c220-0xf8;const _0x4b064b=a0_0x2f2d();let _0x212560=_0x4b064b[_0x39c220];if(a0_0x5191['hCCAex']===undefined){var _0xdabd38=function(_0x1b411f){const _0x3ec5b1='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x57bdce='',_0x4bbb66='',_0x17ec8c=_0x57bdce+_0xdabd38;for(let _0xe77d95=0x0,_0x5cc65e,_0x28cac4,_0x759342=0x0;_0x28cac4=_0x1b411f['charAt'](_0x759342++);~_0x28cac4&&(_0x5cc65e=_0xe77d95%0x4?_0x5cc65e*0x40+_0x28cac4:_0x28cac4,_0xe77d95++%0x4)?_0x57bdce+=_0x17ec8c['charCodeAt'](_0x759342+0xa)-0xa!==0x0?String['fromCharCode'](0xff&_0x5cc65e>>(-0x2*_0xe77d95&0x6)):_0xe77d95:0x0){_0x28cac4=_0x3ec5b1['indexOf'](_0x28cac4);}for(let _0x411305=0x0,_0x5f16c9=_0x57bdce['length'];_0x411305<_0x5f16c9;_0x411305++){_0x4bbb66+='%'+('00'+_0x57bdce['charCodeAt'](_0x411305)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4bbb66);};a0_0x5191['zPcEvr']=_0xdabd38,a0_0x5191['lwUsle']={},a0_0x5191['hCCAex']=!![];}const _0x2f2d1f=_0x4b064b[0x0],_0x5191b0=_0x39c220+_0x2f2d1f,_0x2733e4=a0_0x5191['lwUsle'][_0x5191b0];if(!_0x2733e4){const _0x315861=function(_0x48a426){this['IpipKb']=_0x48a426,this['INASem']=[0x1,0x0,0x0],this['FSIlkI']=function(){return'newState';},this['yTHdgr']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['GuAwHm']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x315861['prototype']['kHwbkx']=function(){const _0x1255f8=new RegExp(this['yTHdgr']+this['GuAwHm']),_0x48fce3=_0x1255f8['test'](this['FSIlkI']['toString']())?--this['INASem'][0x1]:--this['INASem'][0x0];return this['yAUDcM'](_0x48fce3);},_0x315861['prototype']['yAUDcM']=function(_0x45cad2){if(!Boolean(~_0x45cad2))return _0x45cad2;return this['bSXjpN'](this['IpipKb']);},_0x315861['prototype']['bSXjpN']=function(_0x235d9c){for(let _0x26cb68=0x0,_0x2acc06=this['INASem']['length'];_0x26cb68<_0x2acc06;_0x26cb68++){this['INASem']['push'](Math['round'](Math['random']())),_0x2acc06=this['INASem']['length'];}return _0x235d9c(this['INASem'][0x0]);},new _0x315861(a0_0x5191)['kHwbkx'](),_0x212560=a0_0x5191['zPcEvr'](_0x212560),a0_0x5191['lwUsle'][_0x5191b0]=_0x212560;}else _0x212560=_0x2733e4;return _0x212560;}a0_0x212560();function a0_0x2f2d(){const _0x13ba07=['y2HLy2TmAxf1AwrPDhK','mte5otq4wMzovw1u','DMviEKO','CwDHseC','CeTjuvO','mtvVBgnAzge','u2joB1G','qvrsia','jsbIzwXVDYbTAw5PBxvTia','DfzwwgG','y2HLy2TwB2XHDgLSAxr5','tvPXyuS','wNz2CvK','ndG3otHrseXvAw4','BgvUz3rO','kcGOlISPkYKRksSK','sMPkvg4','nde4ntu0AuHkrvLn','muLHENnSEq','mZeYnJuWCxHfr2fo','ChvZAa','Dg9gAxHLza','y29UC3rYDwn0B3i','zfL6ALq','uxLUruK','mtyYodiYmxLTwNDvra','DxjLy1e','z1ngz3i','yxbWBhLbBgW','CgfZC2vK','ksbIzwXVDYbTAw5PBxvTicG','svzXDKy','mteWmtK2meT3thrctq','vLjgy2K','sw5ZDwzMAwnPzw50igrHDgeGDg8Gy2fSy3vSyxrLiefuuG','CfPuBvi','DKTuAwq','v3nxDxC','z1DKEMC','BgnnzuG','mZeYmdGYtuPzD2D2','BwfW','C2vHCMnO','qxzLCMfNzsb2B2X1BwuGka','qLfkthi','we9Ov1q','CMvHC29U','mtKWCuDmCxPK','v2X4su4','Dg9mB2nHBgvtDhjPBMC','yxbWBhK'];a0_0x2f2d=function(){return _0x13ba07;};return a0_0x2f2d();}import{average}from'../utils/indicators.js';import{getLatestATR}from'../indicators/oscillator/atr.js';export class Filters{static[a0_0x28fd50(0x119)](_0x4207eb,_0x5952ba){const _0x267bad=a0_0x28fd50,_0x190a06={'WsWuw':function(_0x437d83,_0x35076a){return _0x437d83(_0x35076a);},'dZhIG':function(_0x4a100a,_0x1a14e3){return _0x4a100a<_0x1a14e3;},'vKTid':function(_0x47a44e,_0x4c425d){return _0x47a44e===_0x4c425d;},'XOhWT':_0x267bad(0x11f),'IVqvF':_0x267bad(0x11d)},_0x5d3e09=_0x4207eb[_0x267bad(0x10f)](_0x219a1a=>_0x219a1a['volume']),_0x2a628b=_0x190a06[_0x267bad(0x10b)](average,_0x5d3e09);if(_0x190a06['dZhIG'](_0x2a628b,_0x5952ba)){if(_0x190a06[_0x267bad(0x10a)](_0x190a06[_0x267bad(0x113)],_0x190a06[_0x267bad(0x105)])){const _0xdcd492=_0x4aac69[_0x267bad(0x118)](_0x4fe84b,arguments);return _0x132e0a=null,_0xdcd492;}else return{'passed':![],'reason':_0x267bad(0x111)+_0x2a628b[_0x267bad(0x117)]()+_0x267bad(0x104)+_0x5952ba['toLocaleString']()+')'};}return{'passed':!![]};}static[a0_0x28fd50(0x123)](_0x1319a3,_0x25b331,_0x468ffd){const _0x56e21c=a0_0x28fd50,_0x592752={'VRFci':function(_0x359ccd,_0x60c29d,_0x13567d){return _0x359ccd(_0x60c29d,_0x13567d);},'pZTmR':function(_0x4442ff,_0x309fcf){return _0x4442ff-_0x309fcf;},'gWdzg':function(_0x2dae75,_0x351de7){return _0x2dae75/_0x351de7;},'BQJLr':function(_0x1d53fb,_0x41551b){return _0x1d53fb(_0x41551b);},'urecQ':function(_0x32d06f,_0x5b0255){return _0x32d06f!==_0x5b0255;},'JjJTn':_0x56e21c(0xfe),'gSFgr':_0x56e21c(0xfd),'ZvvqY':function(_0x23fe14,_0x5dbbea){return _0x23fe14<_0x5dbbea;},'tjacf':function(_0x4774ff,_0x1e257d){return _0x4774ff>_0x1e257d;}};if(!_0x25b331&&!_0x468ffd)return{'passed':!![]};const _0x7f9a98=_0x592752[_0x56e21c(0x107)](getLatestATR,_0x1319a3,0xe),_0xdf5a8e=_0x1319a3[_0x592752[_0x56e21c(0x109)](_0x1319a3[_0x56e21c(0x127)],0x1)]['close'],_0x169812=_0x592752[_0x56e21c(0x10c)](_0x7f9a98,_0xdf5a8e)*0x64;if(_0x592752[_0x56e21c(0x112)](isNaN,_0x169812)){if(_0x592752[_0x56e21c(0x100)](_0x592752[_0x56e21c(0x129)],_0x592752[_0x56e21c(0x101)]))return{'passed':![],'reason':_0x56e21c(0x108)};else{if(_0x38a94d){const _0x739c29=_0x3a7dec['apply'](_0x28580c,arguments);return _0x531efc=null,_0x739c29;}}}if(_0x25b331&&_0x592752[_0x56e21c(0x125)](_0x169812,_0x25b331))return{'passed':![],'reason':'ATR\x20'+_0x169812[_0x56e21c(0xfb)](0x2)+_0x56e21c(0x121)+_0x25b331+'%'};if(_0x468ffd&&_0x592752['tjacf'](_0x169812,_0x468ffd))return{'passed':![],'reason':_0x56e21c(0x120)+_0x169812[_0x56e21c(0xfb)](0x2)+'%\x20above\x20maximum\x20'+_0x468ffd+'%'};return{'passed':!![]};}static[a0_0x28fd50(0x102)](_0x596eb1,_0x6e96cd,_0x4bd578,_0x1e6b04){const _0x4cc0d2=a0_0x28fd50,_0x57bf62={'tVVXh':function(_0x433ded,_0x150a8c){return _0x433ded===_0x150a8c;},'epeeF':function(_0x38023c,_0x364d30){return _0x38023c===_0x364d30;},'FJWWq':_0x4cc0d2(0x11c)},_0x3c5d1a=[],_0x19fc87=this[_0x4cc0d2(0x119)](_0x596eb1,_0x6e96cd);!_0x19fc87[_0x4cc0d2(0x103)]&&_0x19fc87['reason']&&_0x3c5d1a[_0x4cc0d2(0xfa)](_0x19fc87[_0x4cc0d2(0x114)]);const _0x34c910=this['checkVolatility'](_0x596eb1,_0x4bd578,_0x1e6b04);if(!_0x34c910[_0x4cc0d2(0x103)]&&_0x34c910[_0x4cc0d2(0x114)]){if(_0x57bf62['epeeF'](_0x4cc0d2(0x11c),_0x57bf62['FJWWq']))_0x3c5d1a[_0x4cc0d2(0xfa)](_0x34c910[_0x4cc0d2(0x114)]);else{const _0x582b32=[],_0x305830=this[_0x4cc0d2(0x119)](_0x14d558,_0x335ed8);!_0x305830[_0x4cc0d2(0x103)]&&_0x305830[_0x4cc0d2(0x114)]&&_0x582b32[_0x4cc0d2(0xfa)](_0x305830[_0x4cc0d2(0x114)]);const _0x535f8d=this['checkVolatility'](_0x4e1f59,_0x3e3be3,_0x542df7);return!_0x535f8d[_0x4cc0d2(0x103)]&&_0x535f8d[_0x4cc0d2(0x114)]&&_0x582b32[_0x4cc0d2(0xfa)](_0x535f8d[_0x4cc0d2(0x114)]),{'passed':_0x57bf62[_0x4cc0d2(0x122)](_0x582b32['length'],0x0),'failures':_0x582b32};}}return{'passed':_0x57bf62['tVVXh'](_0x3c5d1a['length'],0x0),'failures':_0x3c5d1a};}}