0bps

Strategy vault / Multi-timeframe

Multi Timeframe EMA with Fibonacci Retracement and Pivot Points Trading Strategy

This strategy is a comprehensive trading system that combines multiple technical analysis tools, primarily utilizing dual EMAs (20/50 periods), Fibonacci retracement levels, and pivot point support/resistance levels…

Author
ChaoZhang
Complexity
Starter · 82 lines
Parameters
0
Backtest bar
1d · swing
Tested on
BTC/USDT · futures

IMG

Overview

This strategy is a comprehensive trading system that combines multiple technical analysis tools, primarily utilizing dual EMAs (20/50 periods), Fibonacci retracement levels, and pivot point support/resistance levels to generate trading signals. The strategy adopts a combination of trend following and price retracement methods to enhance trading accuracy through multiple confirmations.

Strategy Principles

The core logic of the strategy is based on the following key elements:

  1. Uses 20 and 50-period EMA crossovers to determine overall trend direction
  2. Employs Fibonacci retracement levels (23.6%, 38.2%, 50%, 61.8%) to identify potential support/resistance levels
  3. Integrates Pivot Points (PP) and their support/resistance levels (S1/S2, R1/R2) to confirm key price levels
  4. Entry conditions must simultaneously satisfy:
    • Short-term EMA crosses above long-term EMA (for longs) or below (for shorts)
    • Price is above/below appropriate Fibonacci levels
    • Price confirms pivot point support/resistance levels
  5. Implements fixed stop-loss (30 pips) and take-profit (60 pips) for risk management

Strategy Advantages

  1. Multiple technical indicator cross-validation improves signal reliability
  2. Combines trend and support/resistance for balanced entry timing
  3. Fixed risk management parameters facilitate quantitative execution
  4. Visualized trading signals enable real-time monitoring
  5. Suitable for medium to long-term trend trading, reducing short-term volatility impact

Strategy Risks

  1. Multiple indicators may lead to lagging signals, affecting entry timing
  2. Fixed stop-loss and take-profit levels may not suit all market conditions
  3. May generate excessive false signals in ranging markets
  4. Requires significant price movements for optimal returns
  5. Stop-losses may be ineffective during sharp market movements

Strategy Optimization Directions

  1. Introduce volatility-adaptive stop-loss and take-profit mechanisms
  2. Add volume indicators for additional confirmation
  3. Dynamically adjust EMA parameters based on market conditions
  4. Implement trend strength filters to reduce false signals
  5. Develop smarter partial position management mechanisms

Summary

This strategy integrates multiple classic technical analysis tools to build a relatively complete trading system. While it has some inherent lag, the multiple confirmation mechanism enhances trading reliability. Through the implementation of optimization suggestions, the strategy has potential for improved performance in live trading. It is recommended to conduct thorough backtesting and adjust parameters according to specific market characteristics before live deployment.

Source Pine Script

/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-09 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Forex Strategy with EMA, Pivot, Fibonacci and Signals", overlay=true)

// Input for EMAs and Pivot Points
emaShortPeriod = input.int(20, title="Short EMA Period", minval=1)
emaLongPeriod = input.int(50, title="Long EMA Period", minval=1)
fibRetraceLevel1 = input.float(0.236, title="Fibonacci 23.6% Level")
fibRetraceLevel2 = input.float(0.382, title="Fibonacci 38.2% Level")
fibRetraceLevel3 = input.float(0.5, title="Fibonacci 50% Level")
fibRetraceLevel4 = input.float(0.618, title="Fibonacci 61.8% Level")

// Function to calculate Pivot Points and Levels
pivot(high, low, close) =>
    pp = (high + low + close) / 3
    r1 = 2 * pp - low
    s1 = 2 * pp - high
    r2 = pp + (high - low)
    s2 = pp - (high - low)
    [pp, r1, s1, r2, s2]

// Calculate Pivot Points
[pp, r1, s1, r2, s2] = pivot(high, low, close)

// Calculate 20 EMA and 50 EMA
emaShort = ta.ema(close, emaShortPeriod)
emaLong = ta.ema(close, emaLongPeriod)

// Plot the EMAs
plot(emaShort, color=color.blue, title="20 EMA", linewidth=2)
plot(emaLong, color=color.red, title="50 EMA", linewidth=2)

// Fibonacci Levels (manually drawn between the most recent high and low)
var float fibHigh = na
var float fibLow = na

if (not na(high[1]) and high > high[1])  // Check if new high is formed
    fibHigh := high
if (not na(low[1]) and low < low[1])    // Check if new low is formed
    fibLow := low

fib23_6 = fibLow + (fibHigh - fibLow) * fibRetraceLevel1
fib38_2 = fibLow + (fibHigh - fibLow) * fibRetraceLevel2
fib50 = fibLow + (fibHigh - fibLow) * fibRetraceLevel3
fib61_8 = fibLow + (fibHigh - fibLow) * fibRetraceLevel4

plot(fib23_6, color=color.green, linewidth=1, title="Fibonacci 23.6%")
plot(fib38_2, color=color.green, linewidth=1, title="Fibonacci 38.2%")
plot(fib50, color=color.green, linewidth=1, title="Fibonacci 50%")
plot(fib61_8, color=color.green, linewidth=1, title="Fibonacci 61.8%")

// Entry conditions (Crossovers)
longCondition = ta.crossover(emaShort, emaLong) and close > fib23_6 and close > s1
shortCondition = ta.crossunder(emaShort, emaLong) and close < fib23_6 and close < r1

// Exit conditions (Stop Loss and Take Profit)
stopLossPips = 30 * syminfo.mintick  // 30 pips Stop Loss
takeProfitPips = 60 * syminfo.mintick // 60 pips Take Profit

if (longCondition)
    strategy.entry("Buy", strategy.long, stop=stopLossPips, limit=takeProfitPips)
if (shortCondition)
    strategy.entry("Sell", strategy.short, stop=stopLossPips, limit=takeProfitPips)

// Plot Pivot Points for visual reference
plot(pp, color=color.yellow, linewidth=2, title="Pivot Point")
plot(r1, color=color.purple, linewidth=1, title="Resistance 1")
plot(s1, color=color.purple, linewidth=1, title="Support 1")
plot(r2, color=color.purple, linewidth=1, title="Resistance 2")
plot(s2, color=color.purple, linewidth=1, title="Support 2")

// Adding Buy and Sell Signals
plotshape(longCondition, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="BUY", textcolor=color.white, size=size.small)
plotshape(shortCondition, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="SELL", textcolor=color.white, size=size.small)

Published by ChaoZhang on the FMZ strategy square · last modified 2024-12-11. 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/Multi-Timeframe-EMA-with-Fibonacci-Retracement-and-Pivot-Points-Trading-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