@backtest-kit/sidekick 8.4.0 → 8.5.0

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 (49) hide show
  1. package/README.md +173 -173
  2. package/content/config/source/timeframe_15m.pine +113 -113
  3. package/content/config/source/timeframe_4h.pine +56 -56
  4. package/content/config/symbol.config.cjs +460 -460
  5. package/content/docker/ollama/docker-compose.yaml +34 -34
  6. package/content/docker/ollama/watch.sh +2 -2
  7. package/content/scripts/cache/cache_candles.mjs +47 -47
  8. package/content/scripts/cache/cache_model.mjs +42 -42
  9. package/content/scripts/cache/validate_candles.mjs +46 -46
  10. package/content/scripts/run_timeframe_15m.mjs +77 -77
  11. package/content/scripts/run_timeframe_4h.mjs +68 -68
  12. package/package.json +68 -68
  13. package/scripts/init.mjs +304 -304
  14. package/src/classes/BacktestLowerStopOnBreakevenAction.mjs +17 -17
  15. package/src/classes/BacktestPartialProfitTakingAction.mjs +24 -24
  16. package/src/classes/BacktestPositionMonitorAction.mjs +57 -57
  17. package/src/config/ccxt.mjs +15 -15
  18. package/src/config/params.mjs +1 -1
  19. package/src/config/setup.mjs +45 -45
  20. package/src/config/validate.mjs +14 -14
  21. package/src/enum/ActionName.mjs +5 -5
  22. package/src/enum/ExchangeName.mjs +3 -3
  23. package/src/enum/FrameName.mjs +6 -6
  24. package/src/enum/RiskName.mjs +4 -4
  25. package/src/enum/StrategyName.mjs +3 -3
  26. package/src/index.mjs +6 -6
  27. package/src/logic/action/backtest_lower_stop_on_breakeven.action.mjs +9 -9
  28. package/src/logic/action/backtest_partial_profit_taking.action.mjs +9 -9
  29. package/src/logic/action/backtest_position_monitor.action.mjs +9 -9
  30. package/src/logic/exchange/binance.exchange.mjs +69 -69
  31. package/src/logic/frame/dec_2025.frame.mjs +10 -10
  32. package/src/logic/frame/feb_2024.frame.mjs +10 -10
  33. package/src/logic/frame/nov_2025.frame.mjs +10 -10
  34. package/src/logic/frame/oct_2025.frame.mjs +10 -10
  35. package/src/logic/index.mjs +15 -15
  36. package/src/logic/risk/sl_distance.risk.mjs +32 -32
  37. package/src/logic/risk/tp_distance.risk.mjs +32 -32
  38. package/src/logic/strategy/main.strategy.mjs +48 -48
  39. package/src/main/bootstrap.mjs +52 -52
  40. package/src/math/timeframe_15m.math.mjs +68 -68
  41. package/src/math/timeframe_4h.math.mjs +53 -53
  42. package/src/utils/getArgs.mjs +17 -17
  43. package/template/CLAUDE.mustache +421 -421
  44. package/template/README.mustache +257 -257
  45. package/template/env.mustache +2 -2
  46. package/template/gitignore.mustache +29 -29
  47. package/template/jsconfig.json.mustache +26 -26
  48. package/template/package.mustache +37 -37
  49. package/template/types.mustache +11 -11
@@ -1,57 +1,57 @@
1
- //@version=5
2
- indicator("Daily Trend Filter", overlay=true)
3
-
4
- plotcandle(open, high, low, close,
5
- color=close > open ? color.new(color.green, 70) : color.new(color.red, 70),
6
- wickcolor=color.new(color.gray, 70),
7
- bordercolor=color.new(color.gray, 70))
8
-
9
- // === INPUTS ===
10
- rsi_len = input.int(14, "RSI Length", minval=2)
11
- macd_fast = input.int(12, "MACD Fast", minval=1)
12
- macd_slow = input.int(26, "MACD Slow", minval=1)
13
- macd_signal = input.int(9, "MACD Signal", minval=1)
14
- adx_len = input.int(14, "ADX Length", minval=1)
15
- adx_threshold = input.int(25, "ADX Threshold", minval=10)
16
-
17
- rsi_bull_threshold = input.int(50, "RSI Bull Threshold", minval=50, maxval=70)
18
- rsi_bear_threshold = input.int(50, "RSI Bear Threshold", minval=30, maxval=50)
19
-
20
- // === INDICATORS ===
21
- rsi = ta.rsi(close, rsi_len)
22
- [macd_line, signal_line, macd_hist] = ta.macd(close, macd_fast, macd_slow, macd_signal)
23
- [di_plus, di_minus, adx] = ta.dmi(adx_len, adx_len)
24
-
25
- // === TREND FILTER LOGIC ===
26
- strong_trend = adx > adx_threshold
27
-
28
- bull_regime = strong_trend and macd_hist > 0 and di_plus > di_minus and rsi > rsi_bull_threshold
29
-
30
- bear_regime = strong_trend and macd_hist < 0 and di_minus > di_plus and rsi < rsi_bear_threshold
31
-
32
- both_allowed = strong_trend and not bull_regime and not bear_regime
33
- no_trades = not strong_trend
34
-
35
- // === VISUALIZATION ===
36
- line_color = bull_regime ? color.green :
37
- bear_regime ? color.red :
38
- both_allowed ? color.gray :
39
- color.orange
40
-
41
- plot(close, "Active Signal", color=line_color, linewidth=6)
42
-
43
- // === OUTPUTS FOR BOT ===
44
- plot(bull_regime ? 1 : 0, "AllowLong", display=display.data_window)
45
- plot(bear_regime ? 1 : 0, "AllowShort", display=display.data_window)
46
- plot(both_allowed ? 1 : 0, "AllowBoth", display=display.data_window)
47
- plot(no_trades ? 1 : 0, "NoTrades", display=display.data_window)
48
- plot(rsi, "RSI", display=display.data_window)
49
- plot(adx, "ADX", display=display.data_window)
50
-
51
- // === DEBUG: INDICATOR DUMP ===
52
- plot(macd_line, "d_MACDLine", display=display.data_window)
53
- plot(signal_line, "d_SignalLine", display=display.data_window)
54
- plot(macd_hist, "d_MACDHist", display=display.data_window)
55
- plot(di_plus, "d_DIPlus", display=display.data_window)
56
- plot(di_minus, "d_DIMinus", display=display.data_window)
1
+ //@version=5
2
+ indicator("Daily Trend Filter", overlay=true)
3
+
4
+ plotcandle(open, high, low, close,
5
+ color=close > open ? color.new(color.green, 70) : color.new(color.red, 70),
6
+ wickcolor=color.new(color.gray, 70),
7
+ bordercolor=color.new(color.gray, 70))
8
+
9
+ // === INPUTS ===
10
+ rsi_len = input.int(14, "RSI Length", minval=2)
11
+ macd_fast = input.int(12, "MACD Fast", minval=1)
12
+ macd_slow = input.int(26, "MACD Slow", minval=1)
13
+ macd_signal = input.int(9, "MACD Signal", minval=1)
14
+ adx_len = input.int(14, "ADX Length", minval=1)
15
+ adx_threshold = input.int(25, "ADX Threshold", minval=10)
16
+
17
+ rsi_bull_threshold = input.int(50, "RSI Bull Threshold", minval=50, maxval=70)
18
+ rsi_bear_threshold = input.int(50, "RSI Bear Threshold", minval=30, maxval=50)
19
+
20
+ // === INDICATORS ===
21
+ rsi = ta.rsi(close, rsi_len)
22
+ [macd_line, signal_line, macd_hist] = ta.macd(close, macd_fast, macd_slow, macd_signal)
23
+ [di_plus, di_minus, adx] = ta.dmi(adx_len, adx_len)
24
+
25
+ // === TREND FILTER LOGIC ===
26
+ strong_trend = adx > adx_threshold
27
+
28
+ bull_regime = strong_trend and macd_hist > 0 and di_plus > di_minus and rsi > rsi_bull_threshold
29
+
30
+ bear_regime = strong_trend and macd_hist < 0 and di_minus > di_plus and rsi < rsi_bear_threshold
31
+
32
+ both_allowed = strong_trend and not bull_regime and not bear_regime
33
+ no_trades = not strong_trend
34
+
35
+ // === VISUALIZATION ===
36
+ line_color = bull_regime ? color.green :
37
+ bear_regime ? color.red :
38
+ both_allowed ? color.gray :
39
+ color.orange
40
+
41
+ plot(close, "Active Signal", color=line_color, linewidth=6)
42
+
43
+ // === OUTPUTS FOR BOT ===
44
+ plot(bull_regime ? 1 : 0, "AllowLong", display=display.data_window)
45
+ plot(bear_regime ? 1 : 0, "AllowShort", display=display.data_window)
46
+ plot(both_allowed ? 1 : 0, "AllowBoth", display=display.data_window)
47
+ plot(no_trades ? 1 : 0, "NoTrades", display=display.data_window)
48
+ plot(rsi, "RSI", display=display.data_window)
49
+ plot(adx, "ADX", display=display.data_window)
50
+
51
+ // === DEBUG: INDICATOR DUMP ===
52
+ plot(macd_line, "d_MACDLine", display=display.data_window)
53
+ plot(signal_line, "d_SignalLine", display=display.data_window)
54
+ plot(macd_hist, "d_MACDHist", display=display.data_window)
55
+ plot(di_plus, "d_DIPlus", display=display.data_window)
56
+ plot(di_minus, "d_DIMinus", display=display.data_window)
57
57
  plot(strong_trend ? 1 : 0, "d_StrongTrend", display=display.data_window)