VWAP Moving Average Crossover with Dynamic ATR Stop Loss and Take Profit Strategy

Author: ChaoZhang, Date: 2024-04-01 10:51:46



This strategy trades based on the crossover relationship between the VWAP (Volume Weighted Average Price) indicator and price. It opens a long position when the price crosses above the VWAP and a short position when the price crosses below the VWAP. Meanwhile, it utilizes the ATR (Average True Range) indicator to calculate dynamic stop loss and take profit levels to control risk and lock in profits.

Strategy Principles

  1. Calculate the VWAP value over a given period as a reference for the average market cost.
  2. Determine the crossover situation between the price and VWAP: a long signal is triggered when the closing price crosses above the VWAP, and a short signal is triggered when it crosses below the VWAP.
  3. Use the ATR indicator to calculate the current market volatility range and set dynamic stop loss and take profit levels based on the ATR value and given multiplier factors.
  4. Once a position is opened, exit the trade when the price reaches the stop loss or take profit level.

Advantage Analysis

  1. VWAP can effectively reflect the average market cost. Combined with price, it can better judge the trend strength and potential support/resistance levels.
  2. Dynamic stop loss and take profit based on the ATR indicator can adapt to the volatility range under different market conditions, controlling risk while considering profit potential.
  3. Parameters are adjustable, such as the calculation periods for VWAP and ATR, stop loss and take profit multipliers, etc., which can be flexibly set according to different market characteristics and risk preferences.

Risk Analysis

  1. As a trend indicator, VWAP has a certain lag and may perform poorly in choppy markets, generating more false signals.
  2. Fixed ATR multiplier stop loss and take profit may not fully adapt to rapidly changing market sentiment, leading to premature stop losses or insufficient profit room.
  3. The strategy does not consider price gaps, where the opening price directly jumps over the stop loss or take profit levels, exposing certain risks.

Optimization Directions

  1. Combine other trend indicators or volatility indicators on top of VWAP to assist in judgment, such as MA, EMA, etc., to improve signal reliability.
  2. Optimize the ATR multiplier factor by introducing an adaptive dynamic adjustment mechanism to dynamically adjust the multiplier size based on recent price volatility characteristics.
  3. Add price gap handling in the stop loss and take profit logic, such as direct stop loss or take profit at the opening price, pending orders, and other coping mechanisms.
  4. Consider introducing position management and money management strategies, such as fixed ratio, fixed risk, and other fund allocation methods to improve the overall return-to-risk ratio.


This strategy focuses on VWAP, generating trading signals through crossovers with price while combining ATR for dynamic stop loss and take profit to control drawdown risk while capturing trends. The overall idea is simple and easy to understand. However, there is further room for optimization. By introducing auxiliary indicators, optimizing stop loss and take profit logic, adding money management, etc., the strategy can better adapt to changing market environments and improve its robustness and profitability.

start: 2023-03-26 00:00:00
end: 2024-03-31 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]

strategy("Hannah Strategy Stop Loss and Take Profit", overlay=true)

// Inputs
cumulativePeriod = input(40, "VWAP Period")
atrPeriod = input(14, "ATR Period")
multiplier = input(1.5, "ATR Multiplier for Stop Loss")
targetMultiplier = input(3, "ATR Multiplier for Take Profit")

// Calculations for VWAP
typicalPrice = (high + low + close) / 3
typicalPriceVolume = typicalPrice * volume
cumulativeTypicalPriceVolume = sum(typicalPriceVolume, cumulativePeriod)
cumulativeVolume = sum(volume, cumulativePeriod)
vwapValue = cumulativeTypicalPriceVolume / cumulativeVolume

// Plot VWAP on the chart
plot(vwapValue, color=color.blue, title="VWAP")

// Entry Conditions based on price crossing over/under VWAP
longCondition = crossover(close, vwapValue)
shortCondition = crossunder(close, vwapValue)

// ATR Calculation for setting dynamic stop loss and take profit
atr = atr(atrPeriod)

// Execute Trades with Dynamic Stop Loss and Take Profit based on ATR
if (longCondition)
    strategy.entry("Long", strategy.long)
    // Setting stop loss and take profit for long positions
    strategy.exit("Long Exit", "Long", stop=close - atr * multiplier, limit=close + atr * targetMultiplier)

if (shortCondition)
    strategy.entry("Short", strategy.short)
    // Setting stop loss and take profit for short positions
    strategy.exit("Short Exit", "Short", stop=close + atr * multiplier, limit=close - atr * targetMultiplier)