0bps

Strategy vault / Momentum

Quadratic Momentum Double Indicators Timing Strategy

This strategy fuses the SuperTrend indicator with Elliott Wave theory to build a robust technical trading tool. It employs multi-level trend analysis to provide a more comprehensive market perspective that can early…

Author
ChaoZhang
Complexity
Intermediate · 92 lines
Parameters
9
Backtest bar
5m · intraday
Tested on
BTC/USDT · futures

IMG

Overview

This strategy fuses the SuperTrend indicator with Elliott Wave theory to build a robust technical trading tool. It employs multi-level trend analysis to provide a more comprehensive market perspective that can early capture potential trend reversals and significant price moves.

Strategy Principle

The core idea lies in its multi-tiered approach:

  1. Use 4 SuperTrend indicators, each with different ATR lengths and multipliers, to judge the trend from short to long term
  2. Pinpoint robust long and short signals through indicator convergence
  3. Refer to Elliott Wave's pattern recognition method to identify similar market behaviors to confirm trade signals

Thus, it utilizes multiple indicators and adds pattern recognition to make the strategy more robust.

Advantage Analysis

  1. Multi-indicator design provides comprehensive judgment
  2. Wave theory inspiration increases stability through pattern recognition
  3. Real-time direction adjustment adapts to market changes
  4. Configurable parameters suit different products and time frames

Risk Analysis

  1. Parameter setting relies on experience, requiring tuning to determine optimal parameter combinations
  2. Multi-indicator design is complex, increasing computational load
  3. Cannot completely avoid incorrect signal generation

Parameters can be optimized to gradually determine the optimum; cloud computing can improve computational performance; stop losses can control risk.

Optimization Directions

Optimizations can be made in several aspects:

  1. Add adaptive parameter adjustment module to dynamically tune parameters based on market conditions
  2. Incorporate machine learning models to aid in judging signal reliability
  3. Combine sentiment indicators, news events etc. to determine market regimes
  4. Support multi-product parameter templates to reduce testing workload

This will make strategy parameters more intelligent, judgments more accurate, and practical application more convenient.

Summary

The strategy comprehensively considers both trend and pattern dimensions, ensuring judgment robustness while increasing flexibility. Multi-indicators and parameter settings ensure full market applicability. With further incorporation of intelligent and automated methods, strategy practicality can be greatly enhanced. It provides valuable inspiration and reference for the advancement of technical trading.

Parameters

NameDefaultWhat it controls
v_input_string_10Select Trading Direction: Both | Short | Long
v_input_17ATR Length for SuperTrend 1
v_input_24Multiplier for SuperTrend 1
v_input_314ATR Length for SuperTrend 2
v_input_43.618Multiplier for SuperTrend 2
v_input_521ATR Length for SuperTrend 3
v_input_63.5Multiplier for SuperTrend 3
v_input_728ATR Length for SuperTrend 3
v_input_83.382Multiplier for SuperTrend 3

Source Pine Script

/*backtest
start: 2024-01-27 00:00:00
end: 2024-02-03 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Elliott's Quadratic Momentum - Strategy [presentTrading]",shorttitle = "EQM Strategy [presentTrading]", overlay=true )

// Inputs for selecting trading direction
tradingDirection = input.string("Both", "Select Trading Direction", options=["Long", "Short", "Both"])


// SuperTrend Function
supertrend(src, atrLength, multiplier) =>
    atr = ta.atr(atrLength)
    up = hl2 - (multiplier * atr)
    dn = hl2 + (multiplier * atr)
    trend = 1
    trend := nz(trend[1], 1)
    up := src > nz(up[1], 0) and src[1] > nz(up[1], 0) ?   math.max(up, nz(up[1], 0)) : up
    dn := src < nz(dn[1], 0) and src[1] < nz(dn[1], 0) ? math.min(dn, nz(dn[1], 0)) : dn
    trend := src > nz(dn[1], 0) ?  1 : src < nz(up[1], 0)? -1 : nz(trend[1], 1)
    [up, dn, trend]

// Inputs for SuperTrend settings
atrLength1 = input(7, title="ATR Length for SuperTrend 1")
multiplier1 = input(4.0, title="Multiplier for SuperTrend 1")
atrLength2 = input(14, title="ATR Length for SuperTrend 2")
multiplier2 = input(3.618, title="Multiplier for SuperTrend 2")
atrLength3 = input(21, title="ATR Length for SuperTrend 3")
multiplier3 = input(3.5, title="Multiplier for SuperTrend 3")
atrLength4 = input(28, title="ATR Length for SuperTrend 3")
multiplier4 = input(3.382, title="Multiplier for SuperTrend 3")

// Calculate SuperTrend
[up1, dn1, trend1] = supertrend(close, atrLength1, multiplier1)
[up2, dn2, trend2] = supertrend(close, atrLength2, multiplier2)
[up3, dn3, trend3] = supertrend(close, atrLength3, multiplier3)
[up4, dn4, trend4] = supertrend(close, atrLength4, multiplier4)


// Entry Conditions based on SuperTrend and Elliott Wave-like patterns
longCondition = trend1 == 1 and trend2 == 1 and trend3 == 1 and trend4 == 1
shortCondition = trend1 == -1 and trend2 == -1 and trend3 == -1 and trend4 == - 1

// Strategy Entry logic based on selected trading direction
if tradingDirection == "Long" or tradingDirection == "Both"
    if longCondition
        strategy.entry("Long", strategy.long)
        // [Any additional logic for long entry]

if tradingDirection == "Short" or tradingDirection == "Both"
    if shortCondition
        strategy.entry("Short", strategy.short)
        // [Any additional logic for short entry]


// Exit conditions - Define your own exit strategy
// Example: Exit when any SuperTrend flips
if trend1 != trend1[1] or trend2 != trend2[1] or trend3 != trend3[1] or trend4 != trend4[1] 
    strategy.close_all()

// Function to apply gradient effect
gradientColor(baseColor, length, currentBar) =>
    var color res = color.new(baseColor, 100)
    if currentBar <= length
        res := color.new(baseColor, int(100 * currentBar / length))
    res

// Apply gradient effect
color1 = gradientColor(color.blue, atrLength1, bar_index % atrLength1)
color4 = gradientColor(color.blue, atrLength4, bar_index % atrLength3)


// Plot SuperTrend with gradient for upward trend
plot1Up = plot(trend1 == 1 ? up1 : na, color=color1, linewidth=1, title="SuperTrend 1 Up")
plot4Up = plot(trend4 == 1 ? up4 : na, color=color4, linewidth=1, title="SuperTrend 3 Up")

// Plot SuperTrend with gradient for downward trend
plot1Down = plot(trend1 == -1 ? dn1 : na, color=color1, linewidth=1, title="SuperTrend 1 Down")
plot4Down = plot(trend4 == -1 ? dn4 : na, color=color4, linewidth=1, title="SuperTrend 3 Down")

// Filling the area between the first and third SuperTrend lines for upward trend
fill(plot1Up, plot4Up, color=color.new(color.green, 80), title="SuperTrend Upward Band")

// Filling the area between the first and third SuperTrend lines for downward trend
fill(plot1Down, plot4Down, color=color.new(color.red, 80), title="SuperTrend Downward Band")

Published by ChaoZhang on the FMZ strategy square · last modified 2024-02-04. Collected in the Quant Trading Vault. Unvalidated research: re-test with your own data and costs before trusting it.

Build this with AgenKit

A spec is not a trading system. Paste this into your coding agent and AgenKit runs a specialist team — architecture, test-first build, risk gates, review — with paper trading on by default.

in Claude Code, Cursor, Codex & 4 more
/agenkit build a production-grade trading bot with a backtest engine, risk controls and paper trading by default from strategies/Quadratic-Momentum-Double-Indicators-Timing-Strategy.md
  1. npx agenkit install engineering-kit in your project
  2. Paste the command into your agent and approve each phase
  3. Get tests, backtest, risk controls and a paper-trading switch

Understand it first

Before you run this, read the lesson behind the idea and how to backtest it honestly. Specs like this one are the survivors of an unknown number of trials; deflate their results accordingly.

Related specs

esc

Try , , or .

↑↓ move↵ open