Skip to main content
NOVOSKY has five risk profiles. Each one controls:
  • How much equity the bot risks per trade (position size)
  • Which confidence thresholds and SL/TP ranges the weekly sweep searches
  • The weekly drawdown pause threshold
  • The hard total drawdown halt that protects against margin calls
You set a profile once during weekly_optimize.py and it is saved to config.json and models/optimize_best.json for all future cron runs. For regular users, set profile 1-5 during onboarding (python scripts/onboarding.py --profile 1|2|3|4|5) and skip local retraining. Developers/operators can set or override profiles during weekly optimization workflows.

Why profiles exist

A single risk setting does not work for everyone. A 500accountwitha4500 account with a 4% risk per trade and a 10,000 account with the same 4% risk have very different outcomes. More importantly, the same drawdown that is psychologically acceptable to one trader is catastrophic to another. Profiles solve this by bounding both the search space and the safety limits to what makes sense for each risk tolerance.

The five profiles

Best for: conservative investors, first-time algo traders, anyone whose primary goal is capital preservation over growth.
SettingValue
Risk per trade0.5–1.0%
Confidence threshold0.65–0.70
SL/TP ATR range0.7–0.9×
Weekly drawdown pause8%
Hard halt (anti-margin-call)20%
Minimum balance$500
The sweep only tests conservative configs. You will see fewer trades and lower returns compared to higher profiles, but much smoother equity curves and minimal drawdown.The bot halts permanently if total equity loss from your starting balance reaches 20%. On a 500account,thatmeansthebotstopsat500 account, that means the bot stops at 400. The broker’s margin call threshold (~$2 at 0.01 lot) is never reached.The risk model produces conservative multipliers for this profile — typically 0.50–0.80 in drawdown, returning toward 1.0 only after a sustained win streak.
Best for: traders who have some experience with automated systems, want modest compounding, and can tolerate occasional 20–25% drawdown months.
SettingValue
Risk per trade1.0–1.5%
Confidence threshold0.62–0.68
SL/TP ATR range0.7–1.0×
Weekly drawdown pause12%
Hard halt (anti-margin-call)30%
Minimum balance$500
A good middle ground between capital safety and meaningful compounding. Weekly checks are sufficient.The risk model learns that 30% is the absolute ceiling — it cuts position sizes aggressively when drawdown approaches that limit.
Best for: most users. Matches the default NOVOSKY config that weekly sweeps have historically converged to.
SettingValue
Risk per trade1.5–2.0%
Confidence threshold0.60–0.65
SL/TP ATR range0.8–1.0×
Weekly drawdown pause20%
Hard halt (anti-margin-call)45%
Minimum balance$500
If you are unsure which profile to choose, start here. Recent weekly OOS snapshots (Apr 18-20, 2026) ranged roughly from WR 67-79%, PF 1.38-2.43, and Score 4.84-21.34 depending on the active live config.The risk model provides the most balanced multiplier range — it scales down during losing streaks and scales back up during recovery.
Best for: traders comfortable with 40–50% account swings who monitor the bot at least a few times per week. Higher expected return, higher volatility.
SettingValue
Risk per trade2.0–3.0%
Confidence threshold0.58–0.62
SL/TP ATR range0.8–1.2×
Weekly drawdown pause25%
Hard halt (anti-margin-call)55%
Minimum balance$500
Expect larger equity swings. The wider confidence range means more trades — which amplifies both wins and losses. Monitor drawdown weekly.The risk model allows the multiplier to reach 1.15 during strong win streaks, amplifying compounding.
Best for: experienced traders who understand leverage and drawdown, actively watch the bot daily, and have risk capital they can afford to lose.
SettingValue
Risk per trade3.0–4.0%
Confidence threshold0.55–0.60
SL/TP ATR range0.8–1.2×
Weekly drawdown pause30%
Hard halt (anti-margin-call)65%
Minimum balance$500
Maximum compounding speed. Still protected from margin call — the hard halt stops at 65% loss (175ona175 on a 500 account), far above the broker’s ~$2 margin call threshold at minimum lot size. Requires daily monitoring.The risk model learns the widest multiplier range for this profile — up to 1.20 during a strong run, but drops sharply near the 65% halt ceiling to prevent triggering it.

Risk model and profiles

Each profile is connected to the risk multiplier model in a direct way: the model is trained with the active profile’s max_total_drawdown_pct as the hard ceiling for label generation. When the labeler evaluates what multiplier would have been best for the next 20 trades, it discards any multiplier that would have breached that profile’s limit. This means:
ProfileHard haltRisk model behavior
1 — Steady Income20%Multiplier rarely exceeds 0.80. Drops to 0.15–0.35 after 2+ consecutive losses.
2 — Conservative30%Multiplier range 0.25–1.00. Resets slowly after a losing streak.
3 — Balanced45%Multiplier range 0.35–1.10. Adapts to streaks while staying within bounds.
4 — Growth55%Multiplier range 0.50–1.15. Allows meaningful size-up during strong equity.
5 — Aggressive65%Multiplier range 0.50–1.20. Widest range; sharpest cut near the halt ceiling.
When you switch profiles and run a full retrain, the risk model relearns from scratch for the new profile’s limits. The signal and position models are unchanged by this. Disabling the risk model — set "enabled": false in config.json → risk_model. The multiplier becomes a fixed 1.0. Lot sizing behaves exactly as it did before the risk model was introduced.

How the hard drawdown halt works

Every profile sets max_total_drawdown_pct in config.json. This is a permanent kill switch, not a pause. In live trading (trading.py): Each cycle, the bot checks:
total_loss_pct = (starting_balance - current_equity) / starting_balance × 100
If total_loss_pct >= max_total_drawdown_pct, the bot:
  1. Sends a Telegram alert with current equity and the reason
  2. Logs a critical error
  3. Calls sys.exit(99) — the process exits and does not restart automatically
PM2 will NOT restart it on exit code 99 (see scripts/pm2-start.sh for the --stop-exit-codes 99 flag). In backtesting (backtest_config.py): The simulation stops early at the bar where equity crosses the halt threshold. All metrics reflect the truncated run, giving you an accurate picture of what would have happened in live trading. Why it never auto-resets: Unlike the weekly drawdown pause (which resets every Monday), the total drawdown halt requires you to manually investigate what went wrong — a model regime change, an extreme market event, or a config error — before restarting. This is intentional.

Margin call safety proof

At VT Markets with 1:500 leverage, trading BTCUSD at ~$97,000:
  • Minimum lot: 0.01 BTC
  • Margin required: $97,000 × 0.01 / 500 = $1.94
  • Margin call level: ~50% of used margin = ~$0.97
Even with Profile 5’s 65% halt: $500 × (1 - 0.65) = $175. The bot halts at 175,whichis90×abovethe175, which is `90× above the 1.94 margin requirement`. Margin call is impossible if the halt fires.

How to change profiles

For regular users, re-run onboarding with the profile you want:
# Switch to Conservative
python scripts/onboarding.py --balance 500 --profile 2

# Switch to Growth
python scripts/onboarding.py --balance 500 --profile 4
For developer/operator workflows, you can also switch profile during weekly optimization:
# Switch to Conservative
python scripts/weekly_optimize.py --profile conservative

# Switch to Growth
python scripts/weekly_optimize.py --profile 4
The new profile’s limits are written to config.json in Phase 6. The running trading.py picks up the new max_total_drawdown_pct on the next config reload cycle (within 60 seconds). You can also edit config.json directly:
"max_total_drawdown_pct": 30,
"risk_profile": {
  "id": 2,
  "name": "Conservative",
  "max_total_dd_pct": 30,
  "max_weekly_dd_pct": 12,
  "starting_balance_usd": 500,
  "applied_at": "2026-04-18"
}
If you edit config.json directly, also update starting_balance_usd to your current account equity — not the original deposit. The hard halt calculates loss relative to this value.

Questionnaire walkthrough

When you run onboarding without --profile in an interactive terminal, you will see a risk-profile questionnaire (developer/operator workflows can also use weekly_optimize.py interactively):
================================================================
  NOVOSKY Risk Profile Questionnaire
================================================================
  Answer 6 short questions. The system recommends a profile.
  You can always override with --profile 1..5

Q1. How long are you planning to run this bot?
    1) Less than 1 month
    ...
The six questions cover:
  1. Time horizon
  2. Maximum loss you can accept (as % of starting balance)
  3. Return goal
  4. How often you can monitor the bot
  5. What you would do after a 20% losing week
  6. Your trading experience level
Each answer is weighted and summed. The total score maps to a profile (1–5). If your stated balance is below the profile’s minimum, it is capped to a safer profile automatically. After the recommendation, you can accept it, or type 15 to override. In cron mode (no TTY), the script loads the last saved profile from models/optimize_best.json. If no profile is saved yet, it defaults to Balanced (3).