ta-pattern-lib
Version:
Technical Analysis and Backtesting Framework for Node.js
104 lines • 4.17 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const feature_indicators_formulaes_1 = require("./features/feature_indicators_formulaes");
const feature_strategy_runner_1 = require("./features/feature_strategy_runner");
const fs = __importStar(require("fs"));
const r = fs.readFileSync(process.cwd() + "/src/sample_ohlc.json", "utf-8");
const rs = JSON.parse(r);
const candles = rs.data.symbol_ticks.map((item) => ({
...item,
open: item.open,
close: item.close,
high: item.high,
low: item.low,
}));
// const parser = new DSLParser(candles, DEFAULT_FUNCTION_REGISTRY);
// const index = 2;
// const result = parser.evaluate(`stop_loss()`, {entry_price: 20, stop_price:30});
// console.log(`DSL at index ${index}:`, result);
// && ema(20, 0) > ema(50, 0)
// && close(1) > open(1)
// && volume(1) > max(volume(2),volume(1))
// && (close(0) > ema(20, 0) || close(0) > ema(50, 0))
const s_schema = {
name: "VWAP + EMA Pullback with Breakout Confirmation",
warmup_period: 10,
capital: 10000,
risk_per_trade: 0.005,
cooldown_period: 6,
transaction_charges: 0.00021,
allow_reentry: true, // Added example, set as needed
// --- Long Conditions ---
entry_long: `
(ema(3,0) - ema(5,0)) >= 0.75 * (ema(5,0) - ema(9, 0))
&& (ema(3,0) - ema(5,0)) >= 0.3 * (close(0) - open(0))
`,
exit_long: `
ema(9, 0) < ema(100, 0)
`,
// stop_loss_expr_long: null,
// target_expr_long: `entry_price() + (entry_price() - stop_loss()) * 8.0`,
breakeven_trigger_expr_long: `1 === 2`,
trailing_trigger_expr_long: `1 === 2`,
trailing_offset_expr_long: `1 === 2`,
// --- Short Conditions ---
entry_short: `
ema(9, 0) < ema(20, 0) &&
ema(20, 0) < ema(50, 0) &&
ema(50, 0) < ema(100, 0)
`,
exit_short: `
ema(9, 0) > ema(100, 0)
`,
stop_loss_expr_short: `max(high(1), high(2)) + atr(14, 0) * 6.2`,
target_expr_short: `entry_price() - (stop_loss() - entry_price()) * 8.0`,
breakeven_trigger_expr_short: `1 === 2`,
trailing_trigger_expr_short: `1 === 2`,
trailing_offset_expr_short: `1 === 2`, // Often the same offset is used for long and short
};
const strat = new feature_strategy_runner_1.StrategyRunner(candles, s_schema, feature_indicators_formulaes_1.DEFAULT_FUNCTION_REGISTRY);
// const report = strat.get_report();
// const decisions = report.candle_decisions;
// console.table(decisions.filter((item) => !item.decision.includes("IGNORE")));
// console.log(report.metric);
// // fs.writeFileSync(process.cwd() + "/src/report.json", JSON.stringify(report, null, 2));
strat.on("progress", (progress) => {
if (progress.progress === 100) {
console.table(progress.report.trades);
}
});
strat.run().then();
//# sourceMappingURL=test.js.map