About Our Strategy

View Source Code on GitHub

Watch Demo Video

Our Trading Philosophy

Our strategy is based on a straightforward market insight: after significant price swings, assets often return to their average levels. This “Buy Low, Sell High” approach helps us spot these opportunities in a clear and practical way.

Market Inefficiencies We Target

Our strategy takes advantage of two common market patterns:

  1. Overreaction to News: Markets often overreact to short-term negative news, creating buying opportunities in fundamentally strong assets.

  2. Support Level Bounces: Prices frequently rebound when they reach statistical support levels (such as Bollinger Bands) during uptrends.

Strategy Framework

Instead of explaining every technical detail (available in our main analysis), we present the core concepts:

The Four Entry Conditions

Our strategy enters a position when any of the following four conditions is met:

  • **lower‑band oversold: rsi < rsi_threshold and close ≤ lower bollinger band ×1.05
  • **middle‑band pullback: close ≤ middle bollinger band ×1.05
  • **extreme rsi oversold: rsi < 30
  • **sma20 pullback: close ≤ sma20 ×0.98

The Four Exit Signals

Our disciplined exit approach responds to any of these market signals:

  • Target Reached: The asset has become overbought
  • Stop Loss Hit: The price has fallen below our predefined risk level
  • Take Profit Triggered: The price has reached our profit target
  • Trend Reversal: The short-term trend direction has changed

Implementation Details

For those interested in the technical aspects, here is a simplified explanation:

Technical Indicators

  • Moving Averages: 50-day and 200-day SMAs confirm trend direction
  • RSI: 14-period Relative Strength Index identifies oversold conditions
  • Bollinger Bands: 20-period with 2 standard deviations marks statistical extremes
  • ATR: 14-period Average True Range enables dynamic risk management

Exit Logic

The system generates a SELL signal when ANY of these conditions occur:

IF (RSI > 70) OR (Price < Stop Loss) OR (Price > Take Profit) OR (Price < SMA50) THEN SELL

Risk Management

  • Position Size: dynamic 10 %-25 % (risk = 1.2 % of equity, sized by ATR-based stop-distance and clamped 10-25 %)
  • Stop Loss: Entry Price - (2.0 × ATR)
  • Take Profit: Entry Price + (5.0 × ATR)
  • Stop‑loss will trail to breakeven and +1×ATR as the trade moves in favour.

Optimization Results

After extensive testing, our best parameter combination achieved: - 55.41% Win Rate - 12.88% Total Return (during test period) - 2.37% Maximum Drawdown - 0.95 Sharpe Ratio (highest among all tested combinations)

The strategy showed excellent performance with minimal drawdown, providing a solid foundation for further development.

Best Market Conditions

Our backtesting shows this strategy works best in:

  • Range-bound markets with definite technical boundaries
  • Bullish markets with regular pullbacks
  • Low-volatility environments with measured price movements

The strategy adapts to changing market conditions through its ATR-based parameters, automatically adjusting position size and risk levels as volatility changes.

About the Team

Sicong Chen specializes in quantitative strategy development with expertise in technical analysis and market microstructure. His research focuses on mean-reversion strategies and statistical arbitrage.

Yuxin Wan brings expertise in risk modeling and portfolio optimization. Her work focuses on robust backtesting methods and testing parameter stability across different market conditions.

Together, we combine technical analysis with statistical methods to create trading strategies that perform consistently in changing market environments.

Beyond the Backtests

While our detailed analysis provides complete performance metrics, we understand that successful strategy implementation requires more than just good backtest results:

  • Psychological Factors: The 55.41% win rate and small drawdowns make this strategy psychologically manageable for most traders.

  • Simple Execution: With clear rules and typically 1-day holding periods, this strategy is straightforward to implement.

  • Diversification Potential: This approach can be applied to multiple assets and timeframes for portfolio diversification.

  • Learning Value: The strategy demonstrates fundamental market principles, making it valuable for education purposes.

For detailed backtesting results, parameter optimization analysis, and technical implementation, please visit our main strategy page.

Key Formula Explanations

Detailed Strategy Implementation

Core Trading Logic

The “Buy Low Sell High” strategy is designed to identify temporary price dips in uptrending markets, entering long positions when prices are oversold according to technical indicators, and exiting based on predefined conditions.

Entry Conditions

A buy signal is generated when any of the following four conditions is satisfied:

  1. lower‑band oversold: RSI < rsi_threshold and close ≤ lower Bollinger Band × 1.05
  2. middle‑band pullback: close ≤ middle Bollinger Band × 1.05
  3. extreme RSI oversold: RSI < 30
  4. SMA20 pullback: close ≤ SMA20 ×0.98

When any conditions are satisfied, the system: - Generates a BUY signal - Sets entry price at the current closing price - Risks 1.2% of equity (position size clamps to 10‑25% based on ATR distance) - Establishes dynamic stop-loss and take-profit levels based on the Average True Range (ATR)

# Entry logic from generate_signals() function
if (df_signals.iloc[i]['RSI'] < rsi_threshold and
    df_signals.iloc[i]['Close'] <= df_signals.iloc[i]['BB_Lower']):
    # Generate buy signal and set parameters
    entry_price = df_signals.iloc[i]['Close']
    atr_value = df_signals.iloc[i]['ATR']
    df_signals.iloc[i, df_signals.columns.get_loc('Signal')] = 1
    df_signals.iloc[i, df_signals.columns.get_loc('Stop_Loss')] = entry_price - 2.0 * atr_value
    df_signals.iloc[i, df_signals.columns.get_loc('Take_Profit')] = entry_price + 5.0 * atr_value

Exit Conditions

The strategy exits an open position when ANY of the following conditions occur:

  1. RSI Overbought: If RSI rises above 70, indicating the asset has become overbought.

  2. Stop-Loss Triggered: If price falls below the calculated stop-loss level (Entry Price - ATR × Stop Multiplier).

  3. Take-Profit Triggered: If price rises above the calculated take-profit level (Entry Price + ATR × Take Multiplier).

  4. Trend Reversal: If price closes below the 50-day Simple Moving Average (SMA50), suggesting the shorter-term trend may be reversing.

# Exit logic from generate_signals() function
if df_signals.iloc[i]['Signal'] == 1 and df_signals.iloc[i]['RSI'] > 70:
    df_signals.iloc[i, df_signals.columns.get_loc('Signal')] = 0
    # Exit: RSI overbought
elif df_signals.iloc[i]['Signal'] == 1 and df_signals.iloc[i]['Low'] <= df_signals.iloc[i]['Stop_Loss']:
    df_signals.iloc[i, df_signals.columns.get_loc('Signal')] = 0
    # Exit: Stop-loss triggered
elif df_signals.iloc[i]['Signal'] == 1 and df_signals.iloc[i]['High'] >= df_signals.iloc[i]['Take_Profit']:
    df_signals.iloc[i, df_signals.columns.get_loc('Signal')] = 0
    # Exit: Take-profit triggered
elif df_signals.iloc[i]['Signal'] == 1 and df_signals.iloc[i]['Close'] < df_signals.iloc[i]['SMA50']:
    df_signals.iloc[i, df_signals.columns.get_loc('Signal')] = 0
    # Exit: Close below SMA50

Position Sizing and Risk Management

  • Fixed Risk Percentage: Each trade risks 1.2% of the portfolio value (Position_Size = 0.012)
  • Dynamic Stop-Loss: Calculated using ATR to adapt to market volatility (Stop_Loss = Entry_Price - ATR × Stop_Multiplier)
  • Asymmetric Reward-Risk Ratio: Take-profit level is set at a multiple of the stop-loss distance (optimal parameters found: 2.0× ATR for stop-loss, 5.0× ATR for take-profit, resulting in a 2.5:1 reward-to-risk ratio)

Parameter Optimization Process

The strategy employs grid-search optimization across three key parameters: - RSI Threshold: Tested values of 35,40,45,50,55 - ATR Stop Multiplier: Tested values of 1.5, 2.0,and 2.5 - ATR Take Multiplier: Tested values of 3.0, 4.0, and 5.0

Each parameter combination is evaluated based on: - Sharpe Ratio (primary optimization metric) - Total Return - Maximum Drawdown - Win Rate - Number of Trades

The optimal parameter combination (RSI=35, Stop=2.0×ATR, Take=5.0×ATR) was selected based on maximizing the Sharpe Ratio, which balances return against risk.