
Стратегия представляет собой систему отслеживания трендов, основанную на объемах сделок и изменениях цен, для прогнозирования движения рынка с помощью расчета показателей шока чистого объема сделок (NVO). Стратегия объединяет несколько типов движущихся средних (EMA, WMA, SMA, HMA) для определения рыночных тенденций путем сравнения шока с их наложенными линиями EMA и совершения сделок в подходящее время.
В основе стратегии лежит определение настроений рынка путем вычисления ежедневных колебаний чистой торговли. Конкретные шаги по вычислению следующие:
Торговые сигналы формируются по следующим правилам:
Предложения по контролю рисков:
Оптимизация механизма подтверждения сигнала:
Оптимизация управления рисками:
Параметры оптимизации:
Эта стратегия использует комплексный анализ объема сделок и ценных данных, чтобы построить более полную систему торговли с отслеживанием тенденций. Основная особенность стратегии заключается в том, что она объединяет несколько технических показателей и предоставляет гибкие параметры. Хотя существует определенный риск, благодаря разумному контролю риска и постоянной оптимизации эта стратегия может принести стабильную прибыль в реальных сделках.
/*backtest
start: 2024-02-25 00:00:00
end: 2025-02-22 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"SOL_USDT"}]
*/
//@version=5
strategy("EMA-Based Net Volume Oscillator with Trend Change", shorttitle="NVO Trend Change", overlay=false, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// Input parameters
maType = input.string("WMA", "Moving Average Type", options=["WMA", "EMA", "SMA", "HMA"])
maLength = input.int(21, "MA Length", minval=1)
emaOverlayLength = input.int(9, "EMA Overlay Length", minval=1)
oscillatorMultiplier = input.float(1.0, "Oscillator Multiplier", minval=0.1, step=0.1)
showHistogram = input.bool(true, "Show Histogram")
stopLossPerc = input.float(1.0, "Stop Loss (%)", tooltip="Set 999 to disable")
takeProfitPerc = input.float(2.0, "Take Profit (%)", tooltip="Set 999 to disable")
// Calculate Net Volume Oscillator
priceRange = high - low
multiplier = priceRange > 0 ? (close - low) / priceRange : 0.5
var float effectiveUpVol = 0.0
var float effectiveDownVol = 0.0
if close > close[1]
effectiveUpVol := volume * multiplier
effectiveDownVol := volume * (1 - multiplier)
else if close < close[1]
effectiveUpVol := volume * multiplier
effectiveDownVol := volume * (1 - multiplier)
else
effectiveUpVol := 0.0
effectiveDownVol := 0.0
netVolume = effectiveUpVol - effectiveDownVol
dailyNetOscillator = volume > 0 ? (netVolume / volume) * 100 : 0
// Apply selected Moving Average
var float oscillator = na
if maType == "WMA"
oscillator := ta.wma(dailyNetOscillator, maLength) * oscillatorMultiplier
else if maType == "EMA"
oscillator := ta.ema(dailyNetOscillator, maLength) * oscillatorMultiplier
else if maType == "SMA"
oscillator := ta.sma(dailyNetOscillator, maLength) * oscillatorMultiplier
else if maType == "HMA"
oscillator := ta.hma(dailyNetOscillator, maLength) * oscillatorMultiplier
// EMA Overlay
emaOverlay = ta.ema(oscillator, emaOverlayLength)
// Rate of Change (ROC) for Oscillator
roc = ta.roc(oscillator, 1) // 1-period rate of change
// Trading logic
longCondition = oscillator > emaOverlay
shortCondition = oscillator < emaOverlay
// Exit conditions
exitLong = oscillator < emaOverlay and strategy.position_size > 0
exitShort = oscillator > emaOverlay and strategy.position_size < 0
// Execute trades
if longCondition and strategy.position_size <= 0
strategy.entry("Long", strategy.long)
if exitLong
strategy.close("Long")
if shortCondition and strategy.position_size >= 0
strategy.entry("Short", strategy.short)
if exitShort
strategy.close("Short")
// Stop Loss and Take Profit
stopLossLong = stopLossPerc != 999 ? strategy.position_avg_price * (1 - stopLossPerc/100) : na
takeProfitLong = takeProfitPerc != 999 ? strategy.position_avg_price * (1 + takeProfitPerc/100) : na
stopLossShort = stopLossPerc != 999 ? strategy.position_avg_price * (1 + stopLossPerc/100) : na
takeProfitShort = takeProfitPerc != 999 ? strategy.position_avg_price * (1 - takeProfitPerc/100) : na
if (not na(stopLossLong) and not na(takeProfitLong) and strategy.position_size > 0)
strategy.exit("Long SL/TP", "Long", stop=stopLossLong, limit=takeProfitLong)
if (not na(stopLossShort) and not na(takeProfitShort) and strategy.position_size < 0)
strategy.exit("Short SL/TP", "Short", stop=stopLossShort, limit=takeProfitShort)
// Plotting
plot(oscillator, "Net Volume Oscillator", color.blue)
plot(emaOverlay, "EMA Overlay", color.orange)
hline(0, "Zero Line", color.gray)
// Histogram with Trend Change Visualization
var color histogramColor = na
if oscillator > 0
histogramColor := roc >= 0 ? color.new(color.green, 70) : color.new(color.lime, 70) // Green for bullish, light green for weakening
else if oscillator < 0
histogramColor := roc >= 0 ? color.new(color.red, 70) : color.new(color.maroon, 70) // Red for bearish, light red for weakening
plot(showHistogram ? oscillator : na, style=plot.style_histogram, color=histogramColor, title="Histogram")