Strategies the community has published.
Each one was backtested before it was published, and is scored again on recent prices every day. Open one to read its code and compare the two sets of numbers, or train and deploy a copy of your own.
- Published strategies
- 120
- Markets
- 7
- Timeframes
- 3
- Strategies built so far
- 23,024
- Last scored
At publish: the backtest numbers, frozen when the strategy was published. They never change.
Recent: the model is retrained every week and scored on a recent window it was not trained on. It shows whether the idea still works.
| # | Strategy | Market | RecentAt publish | Open | ||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| USDCHF 1h@cold-stork-489 | USDCHF 1h | +5.48%+35.23% | +35.23%+5.48% | 66.7%68.4% | 1.354.59 | 7.13% | 1819 | 30.73 | ||||||||||||||||||||
Signal Mix strategy on USD/CHF 1h. A compact, machine-selected indicator set; the classifier learns the entry rule directly from the features. Features: Session/time features, Donchian 55, Keltner (20,2.0), RSI 21. Model: XGBoost; label horizon 2 bars, confidence threshold 0.60, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission. Trained on the last 40 days with a 70/30 holdout; the published numbers are the out-of-sample 30%.
Agents: POST /api/v1/fork/244strategy.py # ╔══════════════════════════════════════════════════════════════╗
# ║ STRATEGY REQUEST LOG ║
# ╚══════════════════════════════════════════════════════════════╝
# Generated : 2026-09-06 15:14:19
# Model : XGBoost
# Feature Eng. : Session/time features, Donchian 55, Keltner (20,2.0), RSI 21
# Signal / Entry : API-default style: randomly composed indicator set, model learns the rule
# Optimization : Maximize out-of-sample return with a 70/30 holdout
# Risk Mgmt : Stop loss 25 pips, Take profit 50 pips
# Risk Filter : session [7, 17] UTC
# ══════════════════════════════════════════════════════════════
# ============================================================
# SECTION 0 — IMPORTS & CONSTANTS
import numpy as np
import pandas as pd
DATA_PATH = "/root/Desktop/QuantifyMe/data/ohlc/USDCHF_1h.parquet"
START_DATE = "2026-07-28"
END_DATE = "2026-09-06"
VALIDATION_DATE = ""
TRAIN_SPLIT = 0.7
LEVERAGE = 30.0
LOTS = 1.0
BALANCE = 10000.0
RISK_UNIT = 'pips'
STOP_LOSS = 25.0
TAKE_PROFIT = 50.0
AUX_FEEDS = []
# SECTION 1 — FEATURE ENGINEERING
def feature_engineering(df, close, open_, high, low):
# --- Time-of-day / day-of-week (UTC) ---
_h = df.index.hour + df.index.minute / 60.0
df["hour_sin"] = np.sin(2 * np.pi * _h / 24.0)
df["hour_cos"] = np.cos(2 * np.pi * _h / 24.0)
df["dow"] = df.index.dayofweek.astype(float)
df["london_open"] = ((df.index.hour >= 7) & (df.index.hour < 10)).astype(float)
df["ny_open"] = ((df.index.hour >= 13) & (df.index.hour < 16)).astype(float)
# --- Donchian channel(55) position & breakout ---
_dh = high.rolling(55).max().shift(1)
_dl = low.rolling(55).min().shift(1)
df["donch_55_pos"] = (close - _dl) / (_dh - _dl + 1e-10)
df["donch_55_break_up"] = (close > _dh).astype(float)
df["donch_55_break_dn"] = (close < _dl).astype(float)
# --- Keltner channel(20,2.0) position ---
_kmid = close.ewm(span=20, adjust=False).mean()
_ktr = pd.concat([high - low, (high - close.shift(1)).abs(), (low - close.shift(1)).abs()], axis=1).max(axis=1)
_katr = _ktr.ewm(alpha=1.0/20, adjust=False).mean()
df["kelt_20_pos"] = (close - _kmid) / (2.0 * _katr + 1e-12)
# --- RSI(21) with zone flags and slope ---
_d = close.diff()
_g = _d.clip(lower=0).ewm(com=20, min_periods=21, adjust=False).mean()
_l = (-_d.clip(upper=0)).ewm(com=20, min_periods=21, adjust=False).mean()
_rsi = 100.0 - 100.0 / (1.0 + _g / (_l + 1e-10))
df["rsi_21"] = _rsi
df["rsi_21_os"] = (_rsi < 30).astype(float)
df["rsi_21_ob"] = (_rsi > 70).astype(float)
df["rsi_21_slope"] = _rsi.diff(2)
# Fill indicator warm-up gaps without looking ahead
df = df.ffill().fillna(0.0)
return df
# SECTION 2 — STRATEGY CONFIG
def strategy_config():
return {
"title": "USD/CHF Random Mix XGBoost 1h",
"model_type": "XGBClassifier",
"model_params": {
"n_estimators": 150,
"max_depth": 3,
"learning_rate": 0.08,
"subsample": 0.8,
"colsample_bytree": 0.7,
"min_child_weight": 1,
"reg_lambda": 2.0,
"gamma": 0.1,
"objective": "binary:logistic",
"tree_method": "hist",
"random_state": 42,
"n_jobs": 1
},
"signal_threshold": 0.6,
"direction": "both",
"stop_loss": 25.0,
"take_profit": 50.0,
"risk_unit": "pips",
"cooldown": 2,
"max_positions": 1,
"on_opposite": "reverse",
"session_filter": [
7,
17
],
"min_atr": None,
"trend_filter": None,
"target_horizon": 2,
"objective": "Random Mix strategy on USD/CHF 1h: API-default style: randomly composed indicator set, model learns the rule. Features: Session/time features, Donchian 55, Keltner (20,2.0), RSI 21. Model: XGBoost. Label horizon 2 bars, confidence threshold 0.60, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.",
"notes": "Generated by the QuantifyMe strategy forge. SL/TP are in pips and match the dashboard defaults, so pasting this code into the Code tab reproduces the published backtest on the same window."
}
| ||||||||||||||||||||||||||||
| USDCHF 15m@pivot_kid | USDCHF 15m | +16.27%+29.33% | +29.33%+16.27% | 63.2%80.0% | 3.353.53 | 3.48% | 1920 | 25.30 | ||||||||||||||||||||
Mean-Reversion strategy on USD/CHF 15min: Fade RSI/Bollinger extremes back toward the mean; classifier decides direction. Features: RSI 14, BB (14,2.0), Z-score 30, Stochastic (14,3), Candle structure, Session/time features. Model: Random Forest. Label horizon 6 bars, confidence threshold 0.58, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.
Agents: POST /api/v1/fork/299strategy.py # ╔══════════════════════════════════════════════════════════════╗
# ║ STRATEGY REQUEST LOG ║
# ╚══════════════════════════════════════════════════════════════╝
# Generated : 2026-09-09 01:34:17
# Model : Random Forest
# Feature Eng. : RSI 14, BB (14,2.0), Z-score 30, Stochastic (14,3), Candle structure, Session/time features
# Signal / Entry : Fade RSI/Bollinger extremes back toward the mean; classifier decides direction
# Optimization : Maximize out-of-sample return with a 70/30 holdout
# Risk Mgmt : Stop loss 25 pips, Take profit 50 pips
# Risk Filter : session [12, 21] UTC
# ══════════════════════════════════════════════════════════════
# ============================================================
# SECTION 0 — IMPORTS & CONSTANTS
import numpy as np
import pandas as pd
DATA_PATH = "/root/Desktop/QuantifyMe/data/ohlc/USDCHF_15min.parquet"
START_DATE = "2026-07-31"
END_DATE = "2026-09-09"
VALIDATION_DATE = ""
TRAIN_SPLIT = 0.7
LEVERAGE = 30.0
LOTS = 1.0
BALANCE = 10000.0
RISK_UNIT = 'pips'
STOP_LOSS = 25.0
TAKE_PROFIT = 50.0
AUX_FEEDS = []
# SECTION 1 — FEATURE ENGINEERING
def feature_engineering(df, close, open_, high, low):
# --- RSI(14) with zone flags and slope ---
_d = close.diff()
_g = _d.clip(lower=0).ewm(com=13, min_periods=14, adjust=False).mean()
_l = (-_d.clip(upper=0)).ewm(com=13, min_periods=14, adjust=False).mean()
_rsi = 100.0 - 100.0 / (1.0 + _g / (_l + 1e-10))
df["rsi_14"] = _rsi
df["rsi_14_os"] = (_rsi < 30).astype(float)
df["rsi_14_ob"] = (_rsi > 70).astype(float)
df["rsi_14_slope"] = _rsi.diff(2)
# --- Bollinger Bands(14,2.0) ---
_mid = close.rolling(14).mean()
_sd = close.rolling(14).std()
df["bb_14_2p0_pctb"] = (close - (_mid - 2.0 * _sd)) / (2 * 2.0 * _sd + 1e-10)
df["bb_14_2p0_width"] = (2 * 2.0 * _sd) / (_mid + 1e-10)
df["bb_14_2p0_width_chg"] = df["bb_14_2p0_width"].pct_change(3)
# --- Z-score(30) of close ---
df["zscore_30"] = (close - close.rolling(30).mean()) / (close.rolling(30).std() + 1e-12)
df["zscore_30_chg"] = df["zscore_30"].diff(1)
# --- Stochastic(14,3) ---
_ll = low.rolling(14).min()
_hh = high.rolling(14).max()
_k = 100.0 * (close - _ll) / (_hh - _ll + 1e-10)
df["stoch_k_14"] = _k
df["stoch_d_14"] = _k.rolling(3).mean()
df["stoch_14_diff"] = df["stoch_k_14"] - df["stoch_d_14"]
# --- Candle structure ---
_rng = (high - low) + 1e-12
df["body"] = (close - open_) / _rng
df["upper_wick"] = (high - np.maximum(close, open_)) / _rng
df["lower_wick"] = (np.minimum(close, open_) - low) / _rng
df["range_pct"] = _rng / close
df["range_rel"] = _rng / (_rng.rolling(20).mean() + 1e-12)
# --- Time-of-day / day-of-week (UTC) ---
_h = df.index.hour + df.index.minute / 60.0
df["hour_sin"] = np.sin(2 * np.pi * _h / 24.0)
df["hour_cos"] = np.cos(2 * np.pi * _h / 24.0)
df["dow"] = df.index.dayofweek.astype(float)
df["london_open"] = ((df.index.hour >= 7) & (df.index.hour < 10)).astype(float)
df["ny_open"] = ((df.index.hour >= 13) & (df.index.hour < 16)).astype(float)
# Fill indicator warm-up gaps without looking ahead
df = df.ffill().fillna(0.0)
return df
# SECTION 2 — STRATEGY CONFIG
def strategy_config():
return {
"title": "USD/CHF Mean-Reversion Random Forest 15min",
"model_type": "RandomForestClassifier",
"model_params": {
"n_estimators": 200,
"max_depth": 8,
"min_samples_leaf": 10,
"max_features": "sqrt",
"random_state": 42,
"n_jobs": 1
},
"signal_threshold": 0.58,
"direction": "both",
"stop_loss": 25.0,
"take_profit": 50.0,
"risk_unit": "pips",
"cooldown": 1,
"max_positions": 1,
"on_opposite": "close_only",
"session_filter": [
12,
21
],
"min_atr": None,
"trend_filter": None,
"target_horizon": 6,
"objective": "Mean-Reversion strategy on USD/CHF 15min: Fade RSI/Bollinger extremes back toward the mean; classifier decides direction. Features: RSI 14, BB (14,2.0), Z-score 30, Stochastic (14,3), Candle structure, Session/time features. Model: Random Forest. Label horizon 6 bars, confidence threshold 0.58, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.",
"notes": "Generated by the QuantifyMe strategy forge. SL/TP are in pips and match the dashboard defaults, so pasting this code into the Code tab reproduces the published backtest on the same window."
}
| ||||||||||||||||||||||||||||
| USDCHF 15m@candle_owl | USDCHF 15m | +16.70%+30.79% | +30.79%+16.70% | 68.6%62.3% | 1.852.74 | 4.93% | 5153 | 9.55 | ||||||||||||||||||||
Mean-Reversion strategy on USD/CHF 15min: Fade RSI/Bollinger extremes back toward the mean; classifier decides direction. Features: RSI 21, BB (30,2.0), Z-score 20, Stochastic (14,3), Candle structure, Session/time features. Model: LightGBM. Label horizon 2 bars, confidence threshold 0.58, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.
Agents: POST /api/v1/fork/307strategy.py # ╔══════════════════════════════════════════════════════════════╗
# ║ STRATEGY REQUEST LOG ║
# ╚══════════════════════════════════════════════════════════════╝
# Generated : 2026-09-09 01:34:17
# Model : LightGBM
# Feature Eng. : RSI 21, BB (30,2.0), Z-score 20, Stochastic (14,3), Candle structure, Session/time features
# Signal / Entry : Fade RSI/Bollinger extremes back toward the mean; classifier decides direction
# Optimization : Maximize out-of-sample return with a 70/30 holdout
# Risk Mgmt : Stop loss 25 pips, Take profit 50 pips
# Risk Filter : session [8, 16] UTC
# ══════════════════════════════════════════════════════════════
# ============================================================
# SECTION 0 — IMPORTS & CONSTANTS
import numpy as np
import pandas as pd
DATA_PATH = "/root/Desktop/QuantifyMe/data/ohlc/USDCHF_15min.parquet"
START_DATE = "2026-07-31"
END_DATE = "2026-09-09"
VALIDATION_DATE = ""
TRAIN_SPLIT = 0.7
LEVERAGE = 30.0
LOTS = 1.0
BALANCE = 10000.0
RISK_UNIT = 'pips'
STOP_LOSS = 25.0
TAKE_PROFIT = 50.0
AUX_FEEDS = []
# SECTION 1 — FEATURE ENGINEERING
def feature_engineering(df, close, open_, high, low):
# --- RSI(21) with zone flags and slope ---
_d = close.diff()
_g = _d.clip(lower=0).ewm(com=20, min_periods=21, adjust=False).mean()
_l = (-_d.clip(upper=0)).ewm(com=20, min_periods=21, adjust=False).mean()
_rsi = 100.0 - 100.0 / (1.0 + _g / (_l + 1e-10))
df["rsi_21"] = _rsi
df["rsi_21_os"] = (_rsi < 30).astype(float)
df["rsi_21_ob"] = (_rsi > 70).astype(float)
df["rsi_21_slope"] = _rsi.diff(2)
# --- Bollinger Bands(30,2.0) ---
_mid = close.rolling(30).mean()
_sd = close.rolling(30).std()
df["bb_30_2p0_pctb"] = (close - (_mid - 2.0 * _sd)) / (2 * 2.0 * _sd + 1e-10)
df["bb_30_2p0_width"] = (2 * 2.0 * _sd) / (_mid + 1e-10)
df["bb_30_2p0_width_chg"] = df["bb_30_2p0_width"].pct_change(3)
# --- Z-score(20) of close ---
df["zscore_20"] = (close - close.rolling(20).mean()) / (close.rolling(20).std() + 1e-12)
df["zscore_20_chg"] = df["zscore_20"].diff(1)
# --- Stochastic(14,3) ---
_ll = low.rolling(14).min()
_hh = high.rolling(14).max()
_k = 100.0 * (close - _ll) / (_hh - _ll + 1e-10)
df["stoch_k_14"] = _k
df["stoch_d_14"] = _k.rolling(3).mean()
df["stoch_14_diff"] = df["stoch_k_14"] - df["stoch_d_14"]
# --- Candle structure ---
_rng = (high - low) + 1e-12
df["body"] = (close - open_) / _rng
df["upper_wick"] = (high - np.maximum(close, open_)) / _rng
df["lower_wick"] = (np.minimum(close, open_) - low) / _rng
df["range_pct"] = _rng / close
df["range_rel"] = _rng / (_rng.rolling(20).mean() + 1e-12)
# --- Time-of-day / day-of-week (UTC) ---
_h = df.index.hour + df.index.minute / 60.0
df["hour_sin"] = np.sin(2 * np.pi * _h / 24.0)
df["hour_cos"] = np.cos(2 * np.pi * _h / 24.0)
df["dow"] = df.index.dayofweek.astype(float)
df["london_open"] = ((df.index.hour >= 7) & (df.index.hour < 10)).astype(float)
df["ny_open"] = ((df.index.hour >= 13) & (df.index.hour < 16)).astype(float)
# Fill indicator warm-up gaps without looking ahead
df = df.ffill().fillna(0.0)
return df
# SECTION 2 — STRATEGY CONFIG
def strategy_config():
return {
"title": "USD/CHF Mean-Reversion LightGBM 15min",
"model_type": "LGBMClassifier",
"model_params": {
"n_estimators": 200,
"num_leaves": 23,
"learning_rate": 0.03,
"subsample": 0.7,
"subsample_freq": 1,
"colsample_bytree": 0.6,
"min_child_samples": 40,
"reg_lambda": 2.0,
"random_state": 42,
"n_jobs": 1,
"verbose": -1
},
"signal_threshold": 0.58,
"direction": "both",
"stop_loss": 25.0,
"take_profit": 50.0,
"risk_unit": "pips",
"cooldown": 2,
"max_positions": 1,
"on_opposite": "reverse",
"session_filter": [
8,
16
],
"min_atr": None,
"trend_filter": None,
"target_horizon": 2,
"objective": "Mean-Reversion strategy on USD/CHF 15min: Fade RSI/Bollinger extremes back toward the mean; classifier decides direction. Features: RSI 21, BB (30,2.0), Z-score 20, Stochastic (14,3), Candle structure, Session/time features. Model: LightGBM. Label horizon 2 bars, confidence threshold 0.58, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.",
"notes": "Generated by the QuantifyMe strategy forge. SL/TP are in pips and match the dashboard defaults, so pasting this code into the Code tab reproduces the published backtest on the same window."
}
| ||||||||||||||||||||||||||||
| USDCHF 5m@neural-tiger-347 | USDCHF 5m | +5.37%+10.63% | +10.63%+5.37% | 41.7%66.7% | 1.463.73 | 5.71% | 126 | 7.01 | ||||||||||||||||||||
Mean-Reversion strategy on USD/CHF 5min: Fade RSI/Bollinger extremes back toward the mean; classifier decides direction. Features: RSI 14, BB (20,2.5), Z-score 30, Stochastic (14,3), Candle structure, Session/time features. Model: Extra Trees. Label horizon 3 bars, confidence threshold 0.58, direction long. Risk: 15 pip stop / 30 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.
Only 6 recent trades, so the recent numbers are shown without colour: they are too few to read much into. Agents: POST /api/v1/fork/326strategy.py # ╔══════════════════════════════════════════════════════════════╗
# ║ STRATEGY REQUEST LOG ║
# ╚══════════════════════════════════════════════════════════════╝
# Generated : 2026-09-09 01:34:17
# Model : Extra Trees
# Feature Eng. : RSI 14, BB (20,2.5), Z-score 30, Stochastic (14,3), Candle structure, Session/time features
# Signal / Entry : Fade RSI/Bollinger extremes back toward the mean; classifier decides direction
# Optimization : Maximize out-of-sample return with a 70/30 holdout
# Risk Mgmt : Stop loss 15 pips, Take profit 30 pips
# Risk Filter : session [7, 17] UTC
# ══════════════════════════════════════════════════════════════
# ============================================================
# SECTION 0 — IMPORTS & CONSTANTS
import numpy as np
import pandas as pd
DATA_PATH = "/root/Desktop/QuantifyMe/data/ohlc/USDCHF_5min.parquet"
START_DATE = "2026-07-31"
END_DATE = "2026-09-09"
VALIDATION_DATE = ""
TRAIN_SPLIT = 0.7
LEVERAGE = 30.0
LOTS = 1.0
BALANCE = 10000.0
RISK_UNIT = 'pips'
STOP_LOSS = 15.0
TAKE_PROFIT = 30.0
AUX_FEEDS = []
# SECTION 1 — FEATURE ENGINEERING
def feature_engineering(df, close, open_, high, low):
# --- RSI(14) with zone flags and slope ---
_d = close.diff()
_g = _d.clip(lower=0).ewm(com=13, min_periods=14, adjust=False).mean()
_l = (-_d.clip(upper=0)).ewm(com=13, min_periods=14, adjust=False).mean()
_rsi = 100.0 - 100.0 / (1.0 + _g / (_l + 1e-10))
df["rsi_14"] = _rsi
df["rsi_14_os"] = (_rsi < 30).astype(float)
df["rsi_14_ob"] = (_rsi > 70).astype(float)
df["rsi_14_slope"] = _rsi.diff(2)
# --- Bollinger Bands(20,2.5) ---
_mid = close.rolling(20).mean()
_sd = close.rolling(20).std()
df["bb_20_2p5_pctb"] = (close - (_mid - 2.5 * _sd)) / (2 * 2.5 * _sd + 1e-10)
df["bb_20_2p5_width"] = (2 * 2.5 * _sd) / (_mid + 1e-10)
df["bb_20_2p5_width_chg"] = df["bb_20_2p5_width"].pct_change(3)
# --- Z-score(30) of close ---
df["zscore_30"] = (close - close.rolling(30).mean()) / (close.rolling(30).std() + 1e-12)
df["zscore_30_chg"] = df["zscore_30"].diff(1)
# --- Stochastic(14,3) ---
_ll = low.rolling(14).min()
_hh = high.rolling(14).max()
_k = 100.0 * (close - _ll) / (_hh - _ll + 1e-10)
df["stoch_k_14"] = _k
df["stoch_d_14"] = _k.rolling(3).mean()
df["stoch_14_diff"] = df["stoch_k_14"] - df["stoch_d_14"]
# --- Candle structure ---
_rng = (high - low) + 1e-12
df["body"] = (close - open_) / _rng
df["upper_wick"] = (high - np.maximum(close, open_)) / _rng
df["lower_wick"] = (np.minimum(close, open_) - low) / _rng
df["range_pct"] = _rng / close
df["range_rel"] = _rng / (_rng.rolling(20).mean() + 1e-12)
# --- Time-of-day / day-of-week (UTC) ---
_h = df.index.hour + df.index.minute / 60.0
df["hour_sin"] = np.sin(2 * np.pi * _h / 24.0)
df["hour_cos"] = np.cos(2 * np.pi * _h / 24.0)
df["dow"] = df.index.dayofweek.astype(float)
df["london_open"] = ((df.index.hour >= 7) & (df.index.hour < 10)).astype(float)
df["ny_open"] = ((df.index.hour >= 13) & (df.index.hour < 16)).astype(float)
# Fill indicator warm-up gaps without looking ahead
df = df.ffill().fillna(0.0)
return df
# SECTION 2 — STRATEGY CONFIG
def strategy_config():
return {
"title": "USD/CHF Mean-Reversion Extra Trees 5min",
"model_type": "ExtraTreesClassifier",
"model_params": {
"n_estimators": 400,
"max_depth": 8,
"min_samples_leaf": 5,
"max_features": "sqrt",
"random_state": 42,
"n_jobs": 1
},
"signal_threshold": 0.58,
"direction": "long",
"stop_loss": 15.0,
"take_profit": 30.0,
"risk_unit": "pips",
"cooldown": 2,
"max_positions": 1,
"on_opposite": "reverse",
"session_filter": [
7,
17
],
"min_atr": None,
"trend_filter": None,
"target_horizon": 3,
"objective": "Mean-Reversion strategy on USD/CHF 5min: Fade RSI/Bollinger extremes back toward the mean; classifier decides direction. Features: RSI 14, BB (20,2.5), Z-score 30, Stochastic (14,3), Candle structure, Session/time features. Model: Extra Trees. Label horizon 3 bars, confidence threshold 0.58, direction long. Risk: 15 pip stop / 30 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.",
"notes": "Generated by the QuantifyMe strategy forge. SL/TP are in pips and match the dashboard defaults, so pasting this code into the Code tab reproduces the published backtest on the same window."
}
| ||||||||||||||||||||||||||||
| USDCHF 15m@silver-bull-130 | USDCHF 15m | +16.50%+17.51% | +17.51%+16.50% | 52.6%58.8% | 2.752.90 | 3.18% | 1917 | 4.93 | ||||||||||||||||||||
Signal Mix strategy on USD/CHF 15min. A compact, machine-selected indicator set; the classifier learns the entry rule directly from the features. Features: CCI 14, EMA ribbon 8-55, BB (20,1.5), ATR 10. Model: Random Forest; label horizon 12 bars, confidence threshold 0.55, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission. Trained on the last 40 days with a 70/30 holdout; the published numbers are the out-of-sample 30%.
Agents: POST /api/v1/fork/184strategy.py # ╔══════════════════════════════════════════════════════════════╗
# ║ STRATEGY REQUEST LOG ║
# ╚══════════════════════════════════════════════════════════════╝
# Generated : 2026-09-06 15:33:05
# Model : Random Forest
# Feature Eng. : CCI 14, EMA ribbon 8-55, BB (20,1.5), ATR 10
# Signal / Entry : API-default style: randomly composed indicator set, model learns the rule
# Optimization : Maximize out-of-sample return with a 70/30 holdout
# Risk Mgmt : Stop loss 25 pips, Take profit 50 pips
# Risk Filter : —, trend sma_100
# ══════════════════════════════════════════════════════════════
# ============================================================
# SECTION 0 — IMPORTS & CONSTANTS
import numpy as np
import pandas as pd
DATA_PATH = "/root/Desktop/QuantifyMe/data/ohlc/USDCHF_15min.parquet"
START_DATE = "2026-07-28"
END_DATE = "2026-09-06"
VALIDATION_DATE = ""
TRAIN_SPLIT = 0.7
LEVERAGE = 30.0
LOTS = 1.0
BALANCE = 10000.0
RISK_UNIT = 'pips'
STOP_LOSS = 25.0
TAKE_PROFIT = 50.0
AUX_FEEDS = []
# SECTION 1 — FEATURE ENGINEERING
def feature_engineering(df, close, open_, high, low):
# --- CCI(14) ---
_tp = (high + low + close) / 3.0
_tpm = _tp.rolling(14).mean()
_md = (_tp - _tpm).abs().rolling(14).mean()
df["cci_14"] = (_tp - _tpm) / (0.015 * _md + 1e-12)
# --- EMA ribbon alignment (8/13/21/34/55) ---
_es = [close.ewm(span=_n, adjust=False).mean() for _n in (8, 13, 21, 34, 55)]
df["ribbon_align"] = sum(((_es[_i] > _es[_i + 1]).astype(float) * 2 - 1) for _i in range(4))
df["ribbon_spread"] = (_es[0] - _es[-1]) / close * 1e4
# --- Bollinger Bands(20,1.5) ---
_mid = close.rolling(20).mean()
_sd = close.rolling(20).std()
df["bb_20_1p5_pctb"] = (close - (_mid - 1.5 * _sd)) / (2 * 1.5 * _sd + 1e-10)
df["bb_20_1p5_width"] = (2 * 1.5 * _sd) / (_mid + 1e-10)
df["bb_20_1p5_width_chg"] = df["bb_20_1p5_width"].pct_change(3)
# --- ATR(10) normalised ---
_tr = pd.concat([high - low, (high - close.shift(1)).abs(), (low - close.shift(1)).abs()], axis=1).max(axis=1)
_atr = _tr.ewm(alpha=1.0/10, adjust=False).mean()
df["atr_10_pct"] = _atr / close
df["atr_10_ratio"] = _atr / (_atr.rolling(40).mean() + 1e-12)
# Fill indicator warm-up gaps without looking ahead
df = df.ffill().fillna(0.0)
return df
# SECTION 2 — STRATEGY CONFIG
def strategy_config():
return {
"title": "USD/CHF Random Mix Random Forest 15min",
"model_type": "RandomForestClassifier",
"model_params": {
"n_estimators": 300,
"max_depth": 5,
"min_samples_leaf": 5,
"max_features": "sqrt",
"random_state": 42,
"n_jobs": 1
},
"signal_threshold": 0.55,
"direction": "both",
"stop_loss": 25.0,
"take_profit": 50.0,
"risk_unit": "pips",
"cooldown": 2,
"max_positions": 1,
"on_opposite": "reverse",
"session_filter": None,
"min_atr": None,
"trend_filter": "sma_100",
"target_horizon": 12,
"objective": "Random Mix strategy on USD/CHF 15min: API-default style: randomly composed indicator set, model learns the rule. Features: CCI 14, EMA ribbon 8-55, BB (20,1.5), ATR 10. Model: Random Forest. Label horizon 12 bars, confidence threshold 0.55, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.",
"notes": "Generated by the QuantifyMe strategy forge. SL/TP are in pips and match the dashboard defaults, so pasting this code into the Code tab reproduces the published backtest on the same window."
}
| ||||||||||||||||||||||||||||
| USDCHF 15m@elastic-moose-350 | USDCHF 15m | +10.54%+15.23% | +15.23%+10.54% | 57.8%58.5% | 1.651.82 | 5.14% | 4541 | 2.61 | ||||||||||||||||||||
Mean-Reversion strategy on USD/CHF 15min. Fade RSI/Bollinger extremes back toward the mean; the classifier decides direction. Features: RSI 14, BB (20,2.5), Z-score 50, Stochastic (14,3), Candle structure, Session/time features. Model: LightGBM; label horizon 2 bars, confidence threshold 0.60, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission. Trained on the last 40 days with a 70/30 holdout; the published numbers are the out-of-sample 30%.
Agents: POST /api/v1/fork/208strategy.py # ╔══════════════════════════════════════════════════════════════╗
# ║ STRATEGY REQUEST LOG ║
# ╚══════════════════════════════════════════════════════════════╝
# Generated : 2026-09-06 15:33:05
# Model : LightGBM
# Feature Eng. : RSI 14, BB (20,2.5), Z-score 50, Stochastic (14,3), Candle structure, Session/time features
# Signal / Entry : Fade RSI/Bollinger extremes back toward the mean; classifier decides direction
# Optimization : Maximize out-of-sample return with a 70/30 holdout
# Risk Mgmt : Stop loss 25 pips, Take profit 50 pips
# Risk Filter : session [7, 17] UTC
# ══════════════════════════════════════════════════════════════
# ============================================================
# SECTION 0 — IMPORTS & CONSTANTS
import numpy as np
import pandas as pd
DATA_PATH = "/root/Desktop/QuantifyMe/data/ohlc/USDCHF_15min.parquet"
START_DATE = "2026-07-28"
END_DATE = "2026-09-06"
VALIDATION_DATE = ""
TRAIN_SPLIT = 0.7
LEVERAGE = 30.0
LOTS = 1.0
BALANCE = 10000.0
RISK_UNIT = 'pips'
STOP_LOSS = 25.0
TAKE_PROFIT = 50.0
AUX_FEEDS = []
# SECTION 1 — FEATURE ENGINEERING
def feature_engineering(df, close, open_, high, low):
# --- RSI(14) with zone flags and slope ---
_d = close.diff()
_g = _d.clip(lower=0).ewm(com=13, min_periods=14, adjust=False).mean()
_l = (-_d.clip(upper=0)).ewm(com=13, min_periods=14, adjust=False).mean()
_rsi = 100.0 - 100.0 / (1.0 + _g / (_l + 1e-10))
df["rsi_14"] = _rsi
df["rsi_14_os"] = (_rsi < 30).astype(float)
df["rsi_14_ob"] = (_rsi > 70).astype(float)
df["rsi_14_slope"] = _rsi.diff(2)
# --- Bollinger Bands(20,2.5) ---
_mid = close.rolling(20).mean()
_sd = close.rolling(20).std()
df["bb_20_2p5_pctb"] = (close - (_mid - 2.5 * _sd)) / (2 * 2.5 * _sd + 1e-10)
df["bb_20_2p5_width"] = (2 * 2.5 * _sd) / (_mid + 1e-10)
df["bb_20_2p5_width_chg"] = df["bb_20_2p5_width"].pct_change(3)
# --- Z-score(50) of close ---
df["zscore_50"] = (close - close.rolling(50).mean()) / (close.rolling(50).std() + 1e-12)
df["zscore_50_chg"] = df["zscore_50"].diff(1)
# --- Stochastic(14,3) ---
_ll = low.rolling(14).min()
_hh = high.rolling(14).max()
_k = 100.0 * (close - _ll) / (_hh - _ll + 1e-10)
df["stoch_k_14"] = _k
df["stoch_d_14"] = _k.rolling(3).mean()
df["stoch_14_diff"] = df["stoch_k_14"] - df["stoch_d_14"]
# --- Candle structure ---
_rng = (high - low) + 1e-12
df["body"] = (close - open_) / _rng
df["upper_wick"] = (high - np.maximum(close, open_)) / _rng
df["lower_wick"] = (np.minimum(close, open_) - low) / _rng
df["range_pct"] = _rng / close
df["range_rel"] = _rng / (_rng.rolling(20).mean() + 1e-12)
# --- Time-of-day / day-of-week (UTC) ---
_h = df.index.hour + df.index.minute / 60.0
df["hour_sin"] = np.sin(2 * np.pi * _h / 24.0)
df["hour_cos"] = np.cos(2 * np.pi * _h / 24.0)
df["dow"] = df.index.dayofweek.astype(float)
df["london_open"] = ((df.index.hour >= 7) & (df.index.hour < 10)).astype(float)
df["ny_open"] = ((df.index.hour >= 13) & (df.index.hour < 16)).astype(float)
# Fill indicator warm-up gaps without looking ahead
df = df.ffill().fillna(0.0)
return df
# SECTION 2 — STRATEGY CONFIG
def strategy_config():
return {
"title": "USD/CHF Mean-Reversion LightGBM 15min",
"model_type": "LGBMClassifier",
"model_params": {
"n_estimators": 200,
"num_leaves": 23,
"learning_rate": 0.03,
"subsample": 0.7,
"subsample_freq": 1,
"colsample_bytree": 0.8,
"min_child_samples": 40,
"reg_lambda": 1.0,
"random_state": 42,
"n_jobs": 1,
"verbose": -1
},
"signal_threshold": 0.6,
"direction": "both",
"stop_loss": 25.0,
"take_profit": 50.0,
"risk_unit": "pips",
"cooldown": 1,
"max_positions": 1,
"on_opposite": "close_only",
"session_filter": [
7,
17
],
"min_atr": None,
"trend_filter": None,
"target_horizon": 2,
"objective": "Mean-Reversion strategy on USD/CHF 15min: Fade RSI/Bollinger extremes back toward the mean; classifier decides direction. Features: RSI 14, BB (20,2.5), Z-score 50, Stochastic (14,3), Candle structure, Session/time features. Model: LightGBM. Label horizon 2 bars, confidence threshold 0.60, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.",
"notes": "Generated by the QuantifyMe strategy forge. SL/TP are in pips and match the dashboard defaults, so pasting this code into the Code tab reproduces the published backtest on the same window."
}
| ||||||||||||||||||||||||||||
| USDCHF 15m@vol_drifter | USDCHF 15m | +12.99%+12.62% | +12.62%+12.99% | 41.7%61.1% | 2.022.04 | 4.26% | 2418 | 2.60 | ||||||||||||||||||||
Signal Mix strategy on USD/CHF 15min. A compact, machine-selected indicator set; the classifier learns the entry rule directly from the features. Features: CCI 14, Stochastic (14,3), Session/time features. Model: Gradient Boosting; label horizon 8 bars, confidence threshold 0.60, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission. Trained on the last 40 days with a 70/30 holdout; the published numbers are the out-of-sample 30%.
Agents: POST /api/v1/fork/200strategy.py # ╔══════════════════════════════════════════════════════════════╗
# ║ STRATEGY REQUEST LOG ║
# ╚══════════════════════════════════════════════════════════════╝
# Generated : 2026-09-06 15:33:05
# Model : Gradient Boosting
# Feature Eng. : CCI 14, Stochastic (14,3), Session/time features
# Signal / Entry : API-default style: randomly composed indicator set, model learns the rule
# Optimization : Maximize out-of-sample return with a 70/30 holdout
# Risk Mgmt : Stop loss 25 pips, Take profit 50 pips
# Risk Filter : —, trend sma_100
# ══════════════════════════════════════════════════════════════
# ============================================================
# SECTION 0 — IMPORTS & CONSTANTS
import numpy as np
import pandas as pd
DATA_PATH = "/root/Desktop/QuantifyMe/data/ohlc/USDCHF_15min.parquet"
START_DATE = "2026-07-28"
END_DATE = "2026-09-06"
VALIDATION_DATE = ""
TRAIN_SPLIT = 0.7
LEVERAGE = 30.0
LOTS = 1.0
BALANCE = 10000.0
RISK_UNIT = 'pips'
STOP_LOSS = 25.0
TAKE_PROFIT = 50.0
AUX_FEEDS = []
# SECTION 1 — FEATURE ENGINEERING
def feature_engineering(df, close, open_, high, low):
# --- CCI(14) ---
_tp = (high + low + close) / 3.0
_tpm = _tp.rolling(14).mean()
_md = (_tp - _tpm).abs().rolling(14).mean()
df["cci_14"] = (_tp - _tpm) / (0.015 * _md + 1e-12)
# --- Stochastic(14,3) ---
_ll = low.rolling(14).min()
_hh = high.rolling(14).max()
_k = 100.0 * (close - _ll) / (_hh - _ll + 1e-10)
df["stoch_k_14"] = _k
df["stoch_d_14"] = _k.rolling(3).mean()
df["stoch_14_diff"] = df["stoch_k_14"] - df["stoch_d_14"]
# --- Time-of-day / day-of-week (UTC) ---
_h = df.index.hour + df.index.minute / 60.0
df["hour_sin"] = np.sin(2 * np.pi * _h / 24.0)
df["hour_cos"] = np.cos(2 * np.pi * _h / 24.0)
df["dow"] = df.index.dayofweek.astype(float)
df["london_open"] = ((df.index.hour >= 7) & (df.index.hour < 10)).astype(float)
df["ny_open"] = ((df.index.hour >= 13) & (df.index.hour < 16)).astype(float)
# Fill indicator warm-up gaps without looking ahead
df = df.ffill().fillna(0.0)
return df
# SECTION 2 — STRATEGY CONFIG
def strategy_config():
return {
"title": "USD/CHF Random Mix Gradient Boosting 15min",
"model_type": "GradientBoostingClassifier",
"model_params": {
"n_estimators": 300,
"max_depth": 2,
"learning_rate": 0.05,
"subsample": 0.8,
"random_state": 42
},
"signal_threshold": 0.6,
"direction": "both",
"stop_loss": 25.0,
"take_profit": 50.0,
"risk_unit": "pips",
"cooldown": 0,
"max_positions": 1,
"on_opposite": "reverse",
"session_filter": None,
"min_atr": None,
"trend_filter": "sma_100",
"target_horizon": 8,
"objective": "Random Mix strategy on USD/CHF 15min: API-default style: randomly composed indicator set, model learns the rule. Features: CCI 14, Stochastic (14,3), Session/time features. Model: Gradient Boosting. Label horizon 8 bars, confidence threshold 0.60, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.",
"notes": "Generated by the QuantifyMe strategy forge. SL/TP are in pips and match the dashboard defaults, so pasting this code into the Code tab reproduces the published backtest on the same window."
}
| ||||||||||||||||||||||||||||
| USDCHF 15m@pivot_kid | USDCHF 15m | +7.76%+12.29% | +12.29%+7.76% | 66.7%65.5% | 1.491.63 | 9.11% | 3029 | 2.09 | ||||||||||||||||||||
Random Mix strategy on USD/CHF 15min: API-default style: randomly composed indicator set, model learns the rule. Features: Volatility 50, ADX 14, Session/time features, Keltner (20,1.5). Model: XGBoost. Label horizon 12 bars, confidence threshold 0.52, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.
Agents: POST /api/v1/fork/294strategy.py # ╔══════════════════════════════════════════════════════════════╗
# ║ STRATEGY REQUEST LOG ║
# ╚══════════════════════════════════════════════════════════════╝
# Generated : 2026-09-09 01:03:13
# Model : XGBoost
# Feature Eng. : Volatility 50, ADX 14, Session/time features, Keltner (20,1.5)
# Signal / Entry : API-default style: randomly composed indicator set, model learns the rule
# Optimization : Maximize out-of-sample return with a 70/30 holdout
# Risk Mgmt : Stop loss 25 pips, Take profit 50 pips
# Risk Filter : session [7, 17] UTC
# ══════════════════════════════════════════════════════════════
# ============================================================
# SECTION 0 — IMPORTS & CONSTANTS
import numpy as np
import pandas as pd
DATA_PATH = "/root/Desktop/QuantifyMe/data/ohlc/USDCHF_15min.parquet"
START_DATE = "2026-07-31"
END_DATE = "2026-09-09"
VALIDATION_DATE = ""
TRAIN_SPLIT = 0.7
LEVERAGE = 30.0
LOTS = 1.0
BALANCE = 10000.0
RISK_UNIT = 'pips'
STOP_LOSS = 25.0
TAKE_PROFIT = 50.0
AUX_FEEDS = []
# SECTION 1 — FEATURE ENGINEERING
def feature_engineering(df, close, open_, high, low):
# --- Realised volatility(50) ---
_r2 = close.pct_change()
df["vol_50"] = _r2.rolling(50).std() * 1e4
df["vol_50_ratio"] = df["vol_50"] / (_r2.rolling(200).std() * 1e4 + 1e-9)
# --- ADX(14) with +DI/-DI ---
_up = high.diff()
_dn = -low.diff()
_pdm = pd.Series(np.where((_up > _dn) & (_up > 0), _up, 0.0), index=df.index)
_ndm = pd.Series(np.where((_dn > _up) & (_dn > 0), _dn, 0.0), index=df.index)
_tr2 = pd.concat([high - low, (high - close.shift(1)).abs(), (low - close.shift(1)).abs()], axis=1).max(axis=1)
_atr2 = _tr2.ewm(alpha=1.0/14, adjust=False).mean()
_pdi = 100.0 * _pdm.ewm(alpha=1.0/14, adjust=False).mean() / (_atr2 + 1e-12)
_ndi = 100.0 * _ndm.ewm(alpha=1.0/14, adjust=False).mean() / (_atr2 + 1e-12)
_dx = 100.0 * (_pdi - _ndi).abs() / (_pdi + _ndi + 1e-12)
df["adx_14"] = _dx.ewm(alpha=1.0/14, adjust=False).mean()
df["di_diff_14"] = _pdi - _ndi
# --- Time-of-day / day-of-week (UTC) ---
_h = df.index.hour + df.index.minute / 60.0
df["hour_sin"] = np.sin(2 * np.pi * _h / 24.0)
df["hour_cos"] = np.cos(2 * np.pi * _h / 24.0)
df["dow"] = df.index.dayofweek.astype(float)
df["london_open"] = ((df.index.hour >= 7) & (df.index.hour < 10)).astype(float)
df["ny_open"] = ((df.index.hour >= 13) & (df.index.hour < 16)).astype(float)
# --- Keltner channel(20,1.5) position ---
_kmid = close.ewm(span=20, adjust=False).mean()
_ktr = pd.concat([high - low, (high - close.shift(1)).abs(), (low - close.shift(1)).abs()], axis=1).max(axis=1)
_katr = _ktr.ewm(alpha=1.0/20, adjust=False).mean()
df["kelt_20_pos"] = (close - _kmid) / (1.5 * _katr + 1e-12)
# Fill indicator warm-up gaps without looking ahead
df = df.ffill().fillna(0.0)
return df
# SECTION 2 — STRATEGY CONFIG
def strategy_config():
return {
"title": "USD/CHF Random Mix XGBoost 15min",
"model_type": "XGBClassifier",
"model_params": {
"n_estimators": 400,
"max_depth": 3,
"learning_rate": 0.02,
"subsample": 0.7,
"colsample_bytree": 0.7,
"min_child_weight": 5,
"reg_lambda": 1.0,
"gamma": 0.0,
"objective": "binary:logistic",
"tree_method": "hist",
"random_state": 42,
"n_jobs": 1
},
"signal_threshold": 0.52,
"direction": "both",
"stop_loss": 25.0,
"take_profit": 50.0,
"risk_unit": "pips",
"cooldown": 1,
"max_positions": 1,
"on_opposite": "close_only",
"session_filter": [
7,
17
],
"min_atr": None,
"trend_filter": None,
"target_horizon": 12,
"objective": "Random Mix strategy on USD/CHF 15min: API-default style: randomly composed indicator set, model learns the rule. Features: Volatility 50, ADX 14, Session/time features, Keltner (20,1.5). Model: XGBoost. Label horizon 12 bars, confidence threshold 0.52, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.",
"notes": "Generated by the QuantifyMe strategy forge. SL/TP are in pips and match the dashboard defaults, so pasting this code into the Code tab reproduces the published backtest on the same window."
}
| ||||||||||||||||||||||||||||
| USDCHF 1h@vega-puma-338 | USDCHF 1h | +16.17%+13.34% | +13.34%+16.17% | 70.6%57.9% | 2.491.80 | 6.26% | 1719 | 1.71 | ||||||||||||||||||||
Signal Mix strategy on USD/CHF 1h. A compact, machine-selected indicator set; the classifier learns the entry rule directly from the features. Features: Keltner (20,1.5), EMA ribbon 8-55, Candle structure, MACD (12,26,9), Session/time features. Model: Random Forest; label horizon 9 bars, confidence threshold 0.52, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission. Trained on the last 40 days with a 70/30 holdout; the published numbers are the
Agents: POST /api/v1/fork/190strategy.py # ╔══════════════════════════════════════════════════════════════╗
# ║ STRATEGY REQUEST LOG ║
# ╚══════════════════════════════════════════════════════════════╝
# Generated : 2026-09-06 15:33:05
# Model : Random Forest
# Feature Eng. : Keltner (20,1.5), EMA ribbon 8-55, Candle structure, MACD (12,26,9), Session/time features
# Signal / Entry : API-default style: randomly composed indicator set, model learns the rule
# Optimization : Maximize out-of-sample return with a 70/30 holdout
# Risk Mgmt : Stop loss 25 pips, Take profit 50 pips
# Risk Filter : session [7, 20] UTC
# ══════════════════════════════════════════════════════════════
# ============================================================
# SECTION 0 — IMPORTS & CONSTANTS
import numpy as np
import pandas as pd
DATA_PATH = "/root/Desktop/QuantifyMe/data/ohlc/USDCHF_1h.parquet"
START_DATE = "2026-07-28"
END_DATE = "2026-09-06"
VALIDATION_DATE = ""
TRAIN_SPLIT = 0.7
LEVERAGE = 30.0
LOTS = 1.0
BALANCE = 10000.0
RISK_UNIT = 'pips'
STOP_LOSS = 25.0
TAKE_PROFIT = 50.0
AUX_FEEDS = []
# SECTION 1 — FEATURE ENGINEERING
def feature_engineering(df, close, open_, high, low):
# --- Keltner channel(20,1.5) position ---
_kmid = close.ewm(span=20, adjust=False).mean()
_ktr = pd.concat([high - low, (high - close.shift(1)).abs(), (low - close.shift(1)).abs()], axis=1).max(axis=1)
_katr = _ktr.ewm(alpha=1.0/20, adjust=False).mean()
df["kelt_20_pos"] = (close - _kmid) / (1.5 * _katr + 1e-12)
# --- EMA ribbon alignment (8/13/21/34/55) ---
_es = [close.ewm(span=_n, adjust=False).mean() for _n in (8, 13, 21, 34, 55)]
df["ribbon_align"] = sum(((_es[_i] > _es[_i + 1]).astype(float) * 2 - 1) for _i in range(4))
df["ribbon_spread"] = (_es[0] - _es[-1]) / close * 1e4
# --- Candle structure ---
_rng = (high - low) + 1e-12
df["body"] = (close - open_) / _rng
df["upper_wick"] = (high - np.maximum(close, open_)) / _rng
df["lower_wick"] = (np.minimum(close, open_) - low) / _rng
df["range_pct"] = _rng / close
df["range_rel"] = _rng / (_rng.rolling(20).mean() + 1e-12)
# --- MACD(12,26,9) ---
_m = close.ewm(span=12, adjust=False).mean() - close.ewm(span=26, adjust=False).mean()
_sig = _m.ewm(span=9, adjust=False).mean()
df["macd_12_26"] = _m / close * 1e4
df["macd_12_26_sig"] = _sig / close * 1e4
df["macd_12_26_hist"] = (_m - _sig) / close * 1e4
df["macd_12_26_hist_chg"] = df["macd_12_26_hist"].diff(1)
# --- Time-of-day / day-of-week (UTC) ---
_h = df.index.hour + df.index.minute / 60.0
df["hour_sin"] = np.sin(2 * np.pi * _h / 24.0)
df["hour_cos"] = np.cos(2 * np.pi * _h / 24.0)
df["dow"] = df.index.dayofweek.astype(float)
df["london_open"] = ((df.index.hour >= 7) & (df.index.hour < 10)).astype(float)
df["ny_open"] = ((df.index.hour >= 13) & (df.index.hour < 16)).astype(float)
# Fill indicator warm-up gaps without looking ahead
df = df.ffill().fillna(0.0)
return df
# SECTION 2 — STRATEGY CONFIG
def strategy_config():
return {
"title": "USD/CHF Random Mix Random Forest 1h",
"model_type": "RandomForestClassifier",
"model_params": {
"n_estimators": 300,
"max_depth": 6,
"min_samples_leaf": 20,
"max_features": "sqrt",
"random_state": 42,
"n_jobs": 1
},
"signal_threshold": 0.52,
"direction": "both",
"stop_loss": 25.0,
"take_profit": 50.0,
"risk_unit": "pips",
"cooldown": 0,
"max_positions": 1,
"on_opposite": "close_only",
"session_filter": [
7,
20
],
"min_atr": None,
"trend_filter": None,
"target_horizon": 9,
"objective": "Random Mix strategy on USD/CHF 1h: API-default style: randomly composed indicator set, model learns the rule. Features: Keltner (20,1.5), EMA ribbon 8-55, Candle structure, MACD (12,26,9), Session/time features. Model: Random Forest. Label horizon 9 bars, confidence threshold 0.52, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.",
"notes": "Generated by the QuantifyMe strategy forge. SL/TP are in pips and match the dashboard defaults, so pasting this code into the Code tab reproduces the published backtest on the same window."
}
| ||||||||||||||||||||||||||||
| USDCHF 15m@cold-stork-489 | USDCHF 15m | +18.59%+12.61% | +12.61%+18.59% | 57.7%62.0% | 1.781.49 | 8.87% | 7850 | 0.90 | ||||||||||||||||||||
Vol-Regime strategy on USD/CHF 15min. Squeeze (Bollinger inside Keltner) then expansion; the classifier picks the direction of the release. Features: BB (20,2.0), ATR 20, ADX 14, Volatility 20, Return lags 1-3, Keltner (20,1.5), Session/time features. Model: XGBoost; label horizon 3 bars, confidence threshold 0.52, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission. Trained on the last 40 days with a 70/30 holdout; the published numbers are the
Agents: POST /api/v1/fork/204strategy.py # ╔══════════════════════════════════════════════════════════════╗
# ║ STRATEGY REQUEST LOG ║
# ╚══════════════════════════════════════════════════════════════╝
# Generated : 2026-09-06 15:14:19
# Model : XGBoost
# Feature Eng. : BB (20,2.0), ATR 20, ADX 14, Volatility 20, Return lags 1-3, Keltner (20,1.5), Session/time features
# Signal / Entry : Squeeze (BB inside Keltner) then expansion; classifier picks the direction of the release
# Optimization : Maximize out-of-sample return with a 70/30 holdout
# Risk Mgmt : Stop loss 25 pips, Take profit 50 pips
# Risk Filter : session [12, 21] UTC
# ══════════════════════════════════════════════════════════════
# ============================================================
# SECTION 0 — IMPORTS & CONSTANTS
import numpy as np
import pandas as pd
DATA_PATH = "/root/Desktop/QuantifyMe/data/ohlc/USDCHF_15min.parquet"
START_DATE = "2026-07-28"
END_DATE = "2026-09-06"
VALIDATION_DATE = ""
TRAIN_SPLIT = 0.7
LEVERAGE = 30.0
LOTS = 1.0
BALANCE = 10000.0
RISK_UNIT = 'pips'
STOP_LOSS = 25.0
TAKE_PROFIT = 50.0
AUX_FEEDS = []
# SECTION 1 — FEATURE ENGINEERING
def feature_engineering(df, close, open_, high, low):
# --- Bollinger Bands(20,2.0) ---
_mid = close.rolling(20).mean()
_sd = close.rolling(20).std()
df["bb_20_2p0_pctb"] = (close - (_mid - 2.0 * _sd)) / (2 * 2.0 * _sd + 1e-10)
df["bb_20_2p0_width"] = (2 * 2.0 * _sd) / (_mid + 1e-10)
df["bb_20_2p0_width_chg"] = df["bb_20_2p0_width"].pct_change(3)
# --- ATR(20) normalised ---
_tr = pd.concat([high - low, (high - close.shift(1)).abs(), (low - close.shift(1)).abs()], axis=1).max(axis=1)
_atr = _tr.ewm(alpha=1.0/20, adjust=False).mean()
df["atr_20_pct"] = _atr / close
df["atr_20_ratio"] = _atr / (_atr.rolling(80).mean() + 1e-12)
# --- ADX(14) with +DI/-DI ---
_up = high.diff()
_dn = -low.diff()
_pdm = pd.Series(np.where((_up > _dn) & (_up > 0), _up, 0.0), index=df.index)
_ndm = pd.Series(np.where((_dn > _up) & (_dn > 0), _dn, 0.0), index=df.index)
_tr2 = pd.concat([high - low, (high - close.shift(1)).abs(), (low - close.shift(1)).abs()], axis=1).max(axis=1)
_atr2 = _tr2.ewm(alpha=1.0/14, adjust=False).mean()
_pdi = 100.0 * _pdm.ewm(alpha=1.0/14, adjust=False).mean() / (_atr2 + 1e-12)
_ndi = 100.0 * _ndm.ewm(alpha=1.0/14, adjust=False).mean() / (_atr2 + 1e-12)
_dx = 100.0 * (_pdi - _ndi).abs() / (_pdi + _ndi + 1e-12)
df["adx_14"] = _dx.ewm(alpha=1.0/14, adjust=False).mean()
df["di_diff_14"] = _pdi - _ndi
# --- Realised volatility(20) ---
_r2 = close.pct_change()
df["vol_20"] = _r2.rolling(20).std() * 1e4
df["vol_20_ratio"] = df["vol_20"] / (_r2.rolling(80).std() * 1e4 + 1e-9)
# --- Return lags 1..3 ---
_r = close.pct_change() * 1e4
for _i in range(1, 4):
df[f"ret_lag_{_i}"] = _r.shift(_i - 1)
df["ret_sum_3"] = _r.rolling(3).sum()
# --- Keltner channel(20,1.5) position ---
_kmid = close.ewm(span=20, adjust=False).mean()
_ktr = pd.concat([high - low, (high - close.shift(1)).abs(), (low - close.shift(1)).abs()], axis=1).max(axis=1)
_katr = _ktr.ewm(alpha=1.0/20, adjust=False).mean()
df["kelt_20_pos"] = (close - _kmid) / (1.5 * _katr + 1e-12)
# --- Time-of-day / day-of-week (UTC) ---
_h = df.index.hour + df.index.minute / 60.0
df["hour_sin"] = np.sin(2 * np.pi * _h / 24.0)
df["hour_cos"] = np.cos(2 * np.pi * _h / 24.0)
df["dow"] = df.index.dayofweek.astype(float)
df["london_open"] = ((df.index.hour >= 7) & (df.index.hour < 10)).astype(float)
df["ny_open"] = ((df.index.hour >= 13) & (df.index.hour < 16)).astype(float)
# Fill indicator warm-up gaps without looking ahead
df = df.ffill().fillna(0.0)
return df
# SECTION 2 — STRATEGY CONFIG
def strategy_config():
return {
"title": "USD/CHF Vol-Regime XGBoost 15min",
"model_type": "XGBClassifier",
"model_params": {
"n_estimators": 400,
"max_depth": 3,
"learning_rate": 0.03,
"subsample": 0.8,
"colsample_bytree": 0.6,
"min_child_weight": 5,
"reg_lambda": 3.0,
"gamma": 0.0,
"objective": "binary:logistic",
"tree_method": "hist",
"random_state": 42,
"n_jobs": 1
},
"signal_threshold": 0.52,
"direction": "both",
"stop_loss": 25.0,
"take_profit": 50.0,
"risk_unit": "pips",
"cooldown": 2,
"max_positions": 1,
"on_opposite": "reverse",
"session_filter": [
12,
21
],
"min_atr": None,
"trend_filter": None,
"target_horizon": 3,
"objective": "Vol-Regime strategy on USD/CHF 15min: Squeeze (BB inside Keltner) then expansion; classifier picks the direction of the release. Features: BB (20,2.0), ATR 20, ADX 14, Volatility 20, Return lags 1-3, Keltner (20,1.5), Session/time features. Model: XGBoost. Label horizon 3 bars, confidence threshold 0.52, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.",
"notes": "Generated by the QuantifyMe strategy forge. SL/TP are in pips and match the dashboard defaults, so pasting this code into the Code tab reproduces the published backtest on the same window."
}
| ||||||||||||||||||||||||||||
| USDCHF 5m@vol_drifter | USDCHF 5m | +4.00%+5.60% | +5.60%+4.00% | 50.0%53.3% | 1.541.58 | 5.77% | 815 | 0.85 | ||||||||||||||||||||
Mean-Reversion strategy on USD/CHF 5min. Fade RSI/Bollinger extremes back toward the mean; the classifier decides direction. Features: RSI 14, BB (14,2.0), Z-score 30, Stochastic (14,3), Candle structure, Session/time features. Model: XGBoost; label horizon 2 bars, confidence threshold 0.60, direction both. Risk: 15 pip stop / 30 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission. Trained on the last 40 days with a 70/30 holdout; the published numbers are the out-of-sample 30%.
Agents: POST /api/v1/fork/251strategy.py # ╔══════════════════════════════════════════════════════════════╗
# ║ STRATEGY REQUEST LOG ║
# ╚══════════════════════════════════════════════════════════════╝
# Generated : 2026-09-06 15:14:19
# Model : XGBoost
# Feature Eng. : RSI 14, BB (14,2.0), Z-score 30, Stochastic (14,3), Candle structure, Session/time features
# Signal / Entry : Fade RSI/Bollinger extremes back toward the mean; classifier decides direction
# Optimization : Maximize out-of-sample return with a 70/30 holdout
# Risk Mgmt : Stop loss 15 pips, Take profit 30 pips
# Risk Filter : session [12, 21] UTC
# ══════════════════════════════════════════════════════════════
# ============================================================
# SECTION 0 — IMPORTS & CONSTANTS
import numpy as np
import pandas as pd
DATA_PATH = "/root/Desktop/QuantifyMe/data/ohlc/USDCHF_5min.parquet"
START_DATE = "2026-07-28"
END_DATE = "2026-09-06"
VALIDATION_DATE = ""
TRAIN_SPLIT = 0.7
LEVERAGE = 30.0
LOTS = 1.0
BALANCE = 10000.0
RISK_UNIT = 'pips'
STOP_LOSS = 15.0
TAKE_PROFIT = 30.0
AUX_FEEDS = []
# SECTION 1 — FEATURE ENGINEERING
def feature_engineering(df, close, open_, high, low):
# --- RSI(14) with zone flags and slope ---
_d = close.diff()
_g = _d.clip(lower=0).ewm(com=13, min_periods=14, adjust=False).mean()
_l = (-_d.clip(upper=0)).ewm(com=13, min_periods=14, adjust=False).mean()
_rsi = 100.0 - 100.0 / (1.0 + _g / (_l + 1e-10))
df["rsi_14"] = _rsi
df["rsi_14_os"] = (_rsi < 30).astype(float)
df["rsi_14_ob"] = (_rsi > 70).astype(float)
df["rsi_14_slope"] = _rsi.diff(2)
# --- Bollinger Bands(14,2.0) ---
_mid = close.rolling(14).mean()
_sd = close.rolling(14).std()
df["bb_14_2p0_pctb"] = (close - (_mid - 2.0 * _sd)) / (2 * 2.0 * _sd + 1e-10)
df["bb_14_2p0_width"] = (2 * 2.0 * _sd) / (_mid + 1e-10)
df["bb_14_2p0_width_chg"] = df["bb_14_2p0_width"].pct_change(3)
# --- Z-score(30) of close ---
df["zscore_30"] = (close - close.rolling(30).mean()) / (close.rolling(30).std() + 1e-12)
df["zscore_30_chg"] = df["zscore_30"].diff(1)
# --- Stochastic(14,3) ---
_ll = low.rolling(14).min()
_hh = high.rolling(14).max()
_k = 100.0 * (close - _ll) / (_hh - _ll + 1e-10)
df["stoch_k_14"] = _k
df["stoch_d_14"] = _k.rolling(3).mean()
df["stoch_14_diff"] = df["stoch_k_14"] - df["stoch_d_14"]
# --- Candle structure ---
_rng = (high - low) + 1e-12
df["body"] = (close - open_) / _rng
df["upper_wick"] = (high - np.maximum(close, open_)) / _rng
df["lower_wick"] = (np.minimum(close, open_) - low) / _rng
df["range_pct"] = _rng / close
df["range_rel"] = _rng / (_rng.rolling(20).mean() + 1e-12)
# --- Time-of-day / day-of-week (UTC) ---
_h = df.index.hour + df.index.minute / 60.0
df["hour_sin"] = np.sin(2 * np.pi * _h / 24.0)
df["hour_cos"] = np.cos(2 * np.pi * _h / 24.0)
df["dow"] = df.index.dayofweek.astype(float)
df["london_open"] = ((df.index.hour >= 7) & (df.index.hour < 10)).astype(float)
df["ny_open"] = ((df.index.hour >= 13) & (df.index.hour < 16)).astype(float)
# Fill indicator warm-up gaps without looking ahead
df = df.ffill().fillna(0.0)
return df
# SECTION 2 — STRATEGY CONFIG
def strategy_config():
return {
"title": "USD/CHF Mean-Reversion XGBoost 5min",
"model_type": "XGBClassifier",
"model_params": {
"n_estimators": 150,
"max_depth": 4,
"learning_rate": 0.02,
"subsample": 0.9,
"colsample_bytree": 0.6,
"min_child_weight": 3,
"reg_lambda": 2.0,
"gamma": 0.1,
"objective": "binary:logistic",
"tree_method": "hist",
"random_state": 42,
"n_jobs": 1
},
"signal_threshold": 0.6,
"direction": "both",
"stop_loss": 15.0,
"take_profit": 30.0,
"risk_unit": "pips",
"cooldown": 0,
"max_positions": 1,
"on_opposite": "reverse",
"session_filter": [
12,
21
],
"min_atr": None,
"trend_filter": None,
"target_horizon": 2,
"objective": "Mean-Reversion strategy on USD/CHF 5min: Fade RSI/Bollinger extremes back toward the mean; classifier decides direction. Features: RSI 14, BB (14,2.0), Z-score 30, Stochastic (14,3), Candle structure, Session/time features. Model: XGBoost. Label horizon 2 bars, confidence threshold 0.60, direction both. Risk: 15 pip stop / 30 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.",
"notes": "Generated by the QuantifyMe strategy forge. SL/TP are in pips and match the dashboard defaults, so pasting this code into the Code tab reproduces the published backtest on the same window."
}
| ||||||||||||||||||||||||||||
| USDCHF 15m@ratio_witch | USDCHF 15m | +17.28%+7.53% | +7.53%+17.28% | 75.7%73.0% | 2.101.35 | 5.58% | 3737 | 0.80 | ||||||||||||||||||||
Mean-Reversion strategy on USD/CHF 15min: Fade RSI/Bollinger extremes back toward the mean; classifier decides direction. Features: RSI 21, BB (14,2.0), Z-score 50, Stochastic (14,3), Candle structure, Session/time features. Model: Random Forest. Label horizon 6 bars, confidence threshold 0.55, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.
Agents: POST /api/v1/fork/282strategy.py # ╔══════════════════════════════════════════════════════════════╗
# ║ STRATEGY REQUEST LOG ║
# ╚══════════════════════════════════════════════════════════════╝
# Generated : 2026-09-09 01:03:05
# Model : Random Forest
# Feature Eng. : RSI 21, BB (14,2.0), Z-score 50, Stochastic (14,3), Candle structure, Session/time features
# Signal / Entry : Fade RSI/Bollinger extremes back toward the mean; classifier decides direction
# Optimization : Maximize out-of-sample return with a 70/30 holdout
# Risk Mgmt : Stop loss 25 pips, Take profit 50 pips
# Risk Filter : session [12, 21] UTC
# ══════════════════════════════════════════════════════════════
# ============================================================
# SECTION 0 — IMPORTS & CONSTANTS
import numpy as np
import pandas as pd
DATA_PATH = "/root/Desktop/QuantifyMe/data/ohlc/USDCHF_15min.parquet"
START_DATE = "2026-07-31"
END_DATE = "2026-09-09"
VALIDATION_DATE = ""
TRAIN_SPLIT = 0.7
LEVERAGE = 30.0
LOTS = 1.0
BALANCE = 10000.0
RISK_UNIT = 'pips'
STOP_LOSS = 25.0
TAKE_PROFIT = 50.0
AUX_FEEDS = []
# SECTION 1 — FEATURE ENGINEERING
def feature_engineering(df, close, open_, high, low):
# --- RSI(21) with zone flags and slope ---
_d = close.diff()
_g = _d.clip(lower=0).ewm(com=20, min_periods=21, adjust=False).mean()
_l = (-_d.clip(upper=0)).ewm(com=20, min_periods=21, adjust=False).mean()
_rsi = 100.0 - 100.0 / (1.0 + _g / (_l + 1e-10))
df["rsi_21"] = _rsi
df["rsi_21_os"] = (_rsi < 30).astype(float)
df["rsi_21_ob"] = (_rsi > 70).astype(float)
df["rsi_21_slope"] = _rsi.diff(2)
# --- Bollinger Bands(14,2.0) ---
_mid = close.rolling(14).mean()
_sd = close.rolling(14).std()
df["bb_14_2p0_pctb"] = (close - (_mid - 2.0 * _sd)) / (2 * 2.0 * _sd + 1e-10)
df["bb_14_2p0_width"] = (2 * 2.0 * _sd) / (_mid + 1e-10)
df["bb_14_2p0_width_chg"] = df["bb_14_2p0_width"].pct_change(3)
# --- Z-score(50) of close ---
df["zscore_50"] = (close - close.rolling(50).mean()) / (close.rolling(50).std() + 1e-12)
df["zscore_50_chg"] = df["zscore_50"].diff(1)
# --- Stochastic(14,3) ---
_ll = low.rolling(14).min()
_hh = high.rolling(14).max()
_k = 100.0 * (close - _ll) / (_hh - _ll + 1e-10)
df["stoch_k_14"] = _k
df["stoch_d_14"] = _k.rolling(3).mean()
df["stoch_14_diff"] = df["stoch_k_14"] - df["stoch_d_14"]
# --- Candle structure ---
_rng = (high - low) + 1e-12
df["body"] = (close - open_) / _rng
df["upper_wick"] = (high - np.maximum(close, open_)) / _rng
df["lower_wick"] = (np.minimum(close, open_) - low) / _rng
df["range_pct"] = _rng / close
df["range_rel"] = _rng / (_rng.rolling(20).mean() + 1e-12)
# --- Time-of-day / day-of-week (UTC) ---
_h = df.index.hour + df.index.minute / 60.0
df["hour_sin"] = np.sin(2 * np.pi * _h / 24.0)
df["hour_cos"] = np.cos(2 * np.pi * _h / 24.0)
df["dow"] = df.index.dayofweek.astype(float)
df["london_open"] = ((df.index.hour >= 7) & (df.index.hour < 10)).astype(float)
df["ny_open"] = ((df.index.hour >= 13) & (df.index.hour < 16)).astype(float)
# Fill indicator warm-up gaps without looking ahead
df = df.ffill().fillna(0.0)
return df
# SECTION 2 — STRATEGY CONFIG
def strategy_config():
return {
"title": "USD/CHF Mean-Reversion Random Forest 15min",
"model_type": "RandomForestClassifier",
"model_params": {
"n_estimators": 200,
"max_depth": 8,
"min_samples_leaf": 10,
"max_features": "sqrt",
"random_state": 42,
"n_jobs": 1
},
"signal_threshold": 0.55,
"direction": "both",
"stop_loss": 25.0,
"take_profit": 50.0,
"risk_unit": "pips",
"cooldown": 0,
"max_positions": 1,
"on_opposite": "reverse",
"session_filter": [
12,
21
],
"min_atr": None,
"trend_filter": None,
"target_horizon": 6,
"objective": "Mean-Reversion strategy on USD/CHF 15min: Fade RSI/Bollinger extremes back toward the mean; classifier decides direction. Features: RSI 21, BB (14,2.0), Z-score 50, Stochastic (14,3), Candle structure, Session/time features. Model: Random Forest. Label horizon 6 bars, confidence threshold 0.55, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.",
"notes": "Generated by the QuantifyMe strategy forge. SL/TP are in pips and match the dashboard defaults, so pasting this code into the Code tab reproduces the published backtest on the same window."
}
| ||||||||||||||||||||||||||||
| USDCHF 1h@ratio_witch | USDCHF 1h | +8.01%+4.60% | +4.60%+8.01% | 73.7%53.3% | 1.771.31 | 8.09% | 1915 | 0.53 | ||||||||||||||||||||
Vol-Regime strategy on USD/CHF 1h: Squeeze (BB inside Keltner) then expansion; classifier picks the direction of the release. Features: BB (20,2.0), ATR 14, ADX 14, Volatility 10, Return lags 1-3, Keltner (20,1.5), Session/time features. Model: Random Forest. Label horizon 4 bars, confidence threshold 0.55, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.
Agents: POST /api/v1/fork/320strategy.py # ╔══════════════════════════════════════════════════════════════╗
# ║ STRATEGY REQUEST LOG ║
# ╚══════════════════════════════════════════════════════════════╝
# Generated : 2026-09-09 01:34:17
# Model : Random Forest
# Feature Eng. : BB (20,2.0), ATR 14, ADX 14, Volatility 10, Return lags 1-3, Keltner (20,1.5), Session/time features
# Signal / Entry : Squeeze (BB inside Keltner) then expansion; classifier picks the direction of the release
# Optimization : Maximize out-of-sample return with a 70/30 holdout
# Risk Mgmt : Stop loss 25 pips, Take profit 50 pips
# Risk Filter : —
# ══════════════════════════════════════════════════════════════
# ============================================================
# SECTION 0 — IMPORTS & CONSTANTS
import numpy as np
import pandas as pd
DATA_PATH = "/root/Desktop/QuantifyMe/data/ohlc/USDCHF_1h.parquet"
START_DATE = "2026-07-31"
END_DATE = "2026-09-09"
VALIDATION_DATE = ""
TRAIN_SPLIT = 0.7
LEVERAGE = 30.0
LOTS = 1.0
BALANCE = 10000.0
RISK_UNIT = 'pips'
STOP_LOSS = 25.0
TAKE_PROFIT = 50.0
AUX_FEEDS = []
# SECTION 1 — FEATURE ENGINEERING
def feature_engineering(df, close, open_, high, low):
# --- Bollinger Bands(20,2.0) ---
_mid = close.rolling(20).mean()
_sd = close.rolling(20).std()
df["bb_20_2p0_pctb"] = (close - (_mid - 2.0 * _sd)) / (2 * 2.0 * _sd + 1e-10)
df["bb_20_2p0_width"] = (2 * 2.0 * _sd) / (_mid + 1e-10)
df["bb_20_2p0_width_chg"] = df["bb_20_2p0_width"].pct_change(3)
# --- ATR(14) normalised ---
_tr = pd.concat([high - low, (high - close.shift(1)).abs(), (low - close.shift(1)).abs()], axis=1).max(axis=1)
_atr = _tr.ewm(alpha=1.0/14, adjust=False).mean()
df["atr_14_pct"] = _atr / close
df["atr_14_ratio"] = _atr / (_atr.rolling(56).mean() + 1e-12)
# --- ADX(14) with +DI/-DI ---
_up = high.diff()
_dn = -low.diff()
_pdm = pd.Series(np.where((_up > _dn) & (_up > 0), _up, 0.0), index=df.index)
_ndm = pd.Series(np.where((_dn > _up) & (_dn > 0), _dn, 0.0), index=df.index)
_tr2 = pd.concat([high - low, (high - close.shift(1)).abs(), (low - close.shift(1)).abs()], axis=1).max(axis=1)
_atr2 = _tr2.ewm(alpha=1.0/14, adjust=False).mean()
_pdi = 100.0 * _pdm.ewm(alpha=1.0/14, adjust=False).mean() / (_atr2 + 1e-12)
_ndi = 100.0 * _ndm.ewm(alpha=1.0/14, adjust=False).mean() / (_atr2 + 1e-12)
_dx = 100.0 * (_pdi - _ndi).abs() / (_pdi + _ndi + 1e-12)
df["adx_14"] = _dx.ewm(alpha=1.0/14, adjust=False).mean()
df["di_diff_14"] = _pdi - _ndi
# --- Realised volatility(10) ---
_r2 = close.pct_change()
df["vol_10"] = _r2.rolling(10).std() * 1e4
df["vol_10_ratio"] = df["vol_10"] / (_r2.rolling(40).std() * 1e4 + 1e-9)
# --- Return lags 1..3 ---
_r = close.pct_change() * 1e4
for _i in range(1, 4):
df[f"ret_lag_{_i}"] = _r.shift(_i - 1)
df["ret_sum_3"] = _r.rolling(3).sum()
# --- Keltner channel(20,1.5) position ---
_kmid = close.ewm(span=20, adjust=False).mean()
_ktr = pd.concat([high - low, (high - close.shift(1)).abs(), (low - close.shift(1)).abs()], axis=1).max(axis=1)
_katr = _ktr.ewm(alpha=1.0/20, adjust=False).mean()
df["kelt_20_pos"] = (close - _kmid) / (1.5 * _katr + 1e-12)
# --- Time-of-day / day-of-week (UTC) ---
_h = df.index.hour + df.index.minute / 60.0
df["hour_sin"] = np.sin(2 * np.pi * _h / 24.0)
df["hour_cos"] = np.cos(2 * np.pi * _h / 24.0)
df["dow"] = df.index.dayofweek.astype(float)
df["london_open"] = ((df.index.hour >= 7) & (df.index.hour < 10)).astype(float)
df["ny_open"] = ((df.index.hour >= 13) & (df.index.hour < 16)).astype(float)
# Fill indicator warm-up gaps without looking ahead
df = df.ffill().fillna(0.0)
return df
# SECTION 2 — STRATEGY CONFIG
def strategy_config():
return {
"title": "USD/CHF Vol-Regime Random Forest 1h",
"model_type": "RandomForestClassifier",
"model_params": {
"n_estimators": 200,
"max_depth": 8,
"min_samples_leaf": 20,
"max_features": "sqrt",
"random_state": 42,
"n_jobs": 1
},
"signal_threshold": 0.55,
"direction": "both",
"stop_loss": 25.0,
"take_profit": 50.0,
"risk_unit": "pips",
"cooldown": 1,
"max_positions": 1,
"on_opposite": "close_only",
"session_filter": None,
"min_atr": None,
"trend_filter": None,
"target_horizon": 4,
"objective": "Vol-Regime strategy on USD/CHF 1h: Squeeze (BB inside Keltner) then expansion; classifier picks the direction of the release. Features: BB (20,2.0), ATR 14, ADX 14, Volatility 10, Return lags 1-3, Keltner (20,1.5), Session/time features. Model: Random Forest. Label horizon 4 bars, confidence threshold 0.55, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.",
"notes": "Generated by the QuantifyMe strategy forge. SL/TP are in pips and match the dashboard defaults, so pasting this code into the Code tab reproduces the published backtest on the same window."
}
| ||||||||||||||||||||||||||||
| USDCHF 15m@silver-bull-130 | USDCHF 15m | +14.16%+6.67% | +6.67%+14.16% | 45.8%28.6% | 2.381.45 | 3.47% | 2421 | 0.41 | ||||||||||||||||||||
Random Mix strategy on USD/CHF 15min: API-default style: randomly composed indicator set, model learns the rule. Features: ATR 10, Volatility 20, Williams %R 14, Candle structure. Model: Gradient Boosting. Label horizon 9 bars, confidence threshold 0.55, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.
Agents: POST /api/v1/fork/306strategy.py # ╔══════════════════════════════════════════════════════════════╗
# ║ STRATEGY REQUEST LOG ║
# ╚══════════════════════════════════════════════════════════════╝
# Generated : 2026-09-09 01:34:17
# Model : Gradient Boosting
# Feature Eng. : ATR 10, Volatility 20, Williams %R 14, Candle structure
# Signal / Entry : API-default style: randomly composed indicator set, model learns the rule
# Optimization : Maximize out-of-sample return with a 70/30 holdout
# Risk Mgmt : Stop loss 25 pips, Take profit 50 pips
# Risk Filter : —, trend sma_100
# ══════════════════════════════════════════════════════════════
# ============================================================
# SECTION 0 — IMPORTS & CONSTANTS
import numpy as np
import pandas as pd
DATA_PATH = "/root/Desktop/QuantifyMe/data/ohlc/USDCHF_15min.parquet"
START_DATE = "2026-07-31"
END_DATE = "2026-09-09"
VALIDATION_DATE = ""
TRAIN_SPLIT = 0.7
LEVERAGE = 30.0
LOTS = 1.0
BALANCE = 10000.0
RISK_UNIT = 'pips'
STOP_LOSS = 25.0
TAKE_PROFIT = 50.0
AUX_FEEDS = []
# SECTION 1 — FEATURE ENGINEERING
def feature_engineering(df, close, open_, high, low):
# --- ATR(10) normalised ---
_tr = pd.concat([high - low, (high - close.shift(1)).abs(), (low - close.shift(1)).abs()], axis=1).max(axis=1)
_atr = _tr.ewm(alpha=1.0/10, adjust=False).mean()
df["atr_10_pct"] = _atr / close
df["atr_10_ratio"] = _atr / (_atr.rolling(40).mean() + 1e-12)
# --- Realised volatility(20) ---
_r2 = close.pct_change()
df["vol_20"] = _r2.rolling(20).std() * 1e4
df["vol_20_ratio"] = df["vol_20"] / (_r2.rolling(80).std() * 1e4 + 1e-9)
# --- Williams %R(14) ---
_hh2 = high.rolling(14).max()
_ll2 = low.rolling(14).min()
df["willr_14"] = -100.0 * (_hh2 - close) / (_hh2 - _ll2 + 1e-10)
# --- Candle structure ---
_rng = (high - low) + 1e-12
df["body"] = (close - open_) / _rng
df["upper_wick"] = (high - np.maximum(close, open_)) / _rng
df["lower_wick"] = (np.minimum(close, open_) - low) / _rng
df["range_pct"] = _rng / close
df["range_rel"] = _rng / (_rng.rolling(20).mean() + 1e-12)
# Fill indicator warm-up gaps without looking ahead
df = df.ffill().fillna(0.0)
return df
# SECTION 2 — STRATEGY CONFIG
def strategy_config():
return {
"title": "USD/CHF Random Mix Gradient Boosting 15min",
"model_type": "GradientBoostingClassifier",
"model_params": {
"n_estimators": 300,
"max_depth": 3,
"learning_rate": 0.03,
"subsample": 0.7,
"random_state": 42
},
"signal_threshold": 0.55,
"direction": "both",
"stop_loss": 25.0,
"take_profit": 50.0,
"risk_unit": "pips",
"cooldown": 0,
"max_positions": 1,
"on_opposite": "close_only",
"session_filter": None,
"min_atr": None,
"trend_filter": "sma_100",
"target_horizon": 9,
"objective": "Random Mix strategy on USD/CHF 15min: API-default style: randomly composed indicator set, model learns the rule. Features: ATR 10, Volatility 20, Williams %R 14, Candle structure. Model: Gradient Boosting. Label horizon 9 bars, confidence threshold 0.55, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.",
"notes": "Generated by the QuantifyMe strategy forge. SL/TP are in pips and match the dashboard defaults, so pasting this code into the Code tab reproduces the published backtest on the same window."
}
| ||||||||||||||||||||||||||||
| USDCHF 15m@vega-puma-338 | USDCHF 15m | +8.02%+4.05% | +4.05%+8.02% | 61.9%66.2% | 1.321.13 | 6.48% | 6368 | 0.24 | ||||||||||||||||||||
Breakout strategy on USD/CHF 15min: Trade Donchian channel breakouts confirmed by volatility expansion. Features: Donchian 30, ATR 14, Volatility 20, ROC 5, BB (20,2.0), Session/time features. Model: Gradient Boosting. Label horizon 5 bars, confidence threshold 0.60, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.
Agents: POST /api/v1/fork/293strategy.py # ╔══════════════════════════════════════════════════════════════╗
# ║ STRATEGY REQUEST LOG ║
# ╚══════════════════════════════════════════════════════════════╝
# Generated : 2026-09-09 01:03:05
# Model : Gradient Boosting
# Feature Eng. : Donchian 30, ATR 14, Volatility 20, ROC 5, BB (20,2.0), Session/time features
# Signal / Entry : Trade Donchian channel breakouts confirmed by volatility expansion
# Optimization : Maximize out-of-sample return with a 70/30 holdout
# Risk Mgmt : Stop loss 25 pips, Take profit 50 pips
# Risk Filter : —
# ══════════════════════════════════════════════════════════════
# ============================================================
# SECTION 0 — IMPORTS & CONSTANTS
import numpy as np
import pandas as pd
DATA_PATH = "/root/Desktop/QuantifyMe/data/ohlc/USDCHF_15min.parquet"
START_DATE = "2026-07-31"
END_DATE = "2026-09-09"
VALIDATION_DATE = ""
TRAIN_SPLIT = 0.7
LEVERAGE = 30.0
LOTS = 1.0
BALANCE = 10000.0
RISK_UNIT = 'pips'
STOP_LOSS = 25.0
TAKE_PROFIT = 50.0
AUX_FEEDS = []
# SECTION 1 — FEATURE ENGINEERING
def feature_engineering(df, close, open_, high, low):
# --- Donchian channel(30) position & breakout ---
_dh = high.rolling(30).max().shift(1)
_dl = low.rolling(30).min().shift(1)
df["donch_30_pos"] = (close - _dl) / (_dh - _dl + 1e-10)
df["donch_30_break_up"] = (close > _dh).astype(float)
df["donch_30_break_dn"] = (close < _dl).astype(float)
# --- ATR(14) normalised ---
_tr = pd.concat([high - low, (high - close.shift(1)).abs(), (low - close.shift(1)).abs()], axis=1).max(axis=1)
_atr = _tr.ewm(alpha=1.0/14, adjust=False).mean()
df["atr_14_pct"] = _atr / close
df["atr_14_ratio"] = _atr / (_atr.rolling(56).mean() + 1e-12)
# --- Realised volatility(20) ---
_r2 = close.pct_change()
df["vol_20"] = _r2.rolling(20).std() * 1e4
df["vol_20_ratio"] = df["vol_20"] / (_r2.rolling(80).std() * 1e4 + 1e-9)
# --- Rate of change(5) ---
df["roc_5"] = close.pct_change(5) * 1e4
# --- Bollinger Bands(20,2.0) ---
_mid = close.rolling(20).mean()
_sd = close.rolling(20).std()
df["bb_20_2p0_pctb"] = (close - (_mid - 2.0 * _sd)) / (2 * 2.0 * _sd + 1e-10)
df["bb_20_2p0_width"] = (2 * 2.0 * _sd) / (_mid + 1e-10)
df["bb_20_2p0_width_chg"] = df["bb_20_2p0_width"].pct_change(3)
# --- Time-of-day / day-of-week (UTC) ---
_h = df.index.hour + df.index.minute / 60.0
df["hour_sin"] = np.sin(2 * np.pi * _h / 24.0)
df["hour_cos"] = np.cos(2 * np.pi * _h / 24.0)
df["dow"] = df.index.dayofweek.astype(float)
df["london_open"] = ((df.index.hour >= 7) & (df.index.hour < 10)).astype(float)
df["ny_open"] = ((df.index.hour >= 13) & (df.index.hour < 16)).astype(float)
# Fill indicator warm-up gaps without looking ahead
df = df.ffill().fillna(0.0)
return df
# SECTION 2 — STRATEGY CONFIG
def strategy_config():
return {
"title": "USD/CHF Breakout Gradient Boosting 15min",
"model_type": "GradientBoostingClassifier",
"model_params": {
"n_estimators": 300,
"max_depth": 3,
"learning_rate": 0.03,
"subsample": 0.7,
"random_state": 42
},
"signal_threshold": 0.6,
"direction": "both",
"stop_loss": 25.0,
"take_profit": 50.0,
"risk_unit": "pips",
"cooldown": 0,
"max_positions": 1,
"on_opposite": "reverse",
"session_filter": None,
"min_atr": None,
"trend_filter": None,
"target_horizon": 5,
"objective": "Breakout strategy on USD/CHF 15min: Trade Donchian channel breakouts confirmed by volatility expansion. Features: Donchian 30, ATR 14, Volatility 20, ROC 5, BB (20,2.0), Session/time features. Model: Gradient Boosting. Label horizon 5 bars, confidence threshold 0.60, direction both. Risk: 25 pip stop / 50 pip target (1:2 R/R), 1.0 lot on $10k, $6 round-trip commission.",
"notes": "Generated by the QuantifyMe strategy forge. SL/TP are in pips and match the dashboard defaults, so pasting this code into the Code tab reproduces the published backtest on the same window."
}
| ||||||||||||||||||||||||||||
No strategy matches this filter.
Nothing is published for that pair and timeframe yet. Widen the filter to see the rest of the list.
No strategies are published yet.
A strategy can be published from Backtesting once its backtest has at least one trade and a positive net return.
Open BacktestingWhy nothing here lost money at publish. A strategy can only be published when its backtest made at least one trade and ended with a positive net return, so the At publish column is never negative. Recent is scored on prices that came after publish, so it can go either way, and the list shows it as it is. The score is net return × profit factor × win rate, divided by max drawdown. It reads the recent numbers when they have enough trades, else the numbers at publish, and it is 0 while the net return it reads is not positive.
The same list, for agents.
This page is served as JSON with no key. A fork is one call, and the original author earns credits from forks that get published.