Многоуровневая процентная коррекция ZigZag в сочетании со стратегией торговли стохастическим индикатором

ZZ ATR RSI STOCH SMA
Дата создания: 2025-02-21 11:18:39 Последнее изменение: 2025-02-21 11:18:39
Копировать: 0 Количество просмотров: 477
2
Подписаться
319
Подписчики

Многоуровневая процентная коррекция ZigZag в сочетании со стратегией торговли стохастическим индикатором Многоуровневая процентная коррекция ZigZag в сочетании со стратегией торговли стохастическим индикатором

Обзор

Стратегия представляет собой торговую систему, объединяющую процентное отступление ZigZag и случайный индикатор {Stochastic}. Стратегия использует динамически скорректированный индикатор ZigZag для выявления ключевых поворотных точек в тенденции рынка и в сочетании с случайным индикатором сигналов опережающих покупок для оптимизации времени входа в рынок. Система также интегрирует механизм остановки и остановки для управления рисками.

Стратегический принцип

Основная логика стратегии основана на следующих ключевых компонентах:

  1. Динамический показатель ZigZag - процент отмены динамических корректировок ATR, поддерживающих ручную настройку или основанных на различных циклах ((5-250)
  2. Фильтрация случайных показателей - случайные показатели с использованием 9 циклов K и 3 циклов гладкости
  3. Сигналы транзакций генерируются:
    • Условия покупки: цена пробивает обратную линию и случайный показатель K ниже 20
    • Условия продажи: цена опустилась ниже обратной линии и случайный показатель K выше 80
  4. Управление рисками - с использованием фиксированного количества очков стоп-лосс (~100 очков) и стоп-стоп (~300 очков)

Стратегические преимущества

  1. Адаптируемость - динамическая адаптация стратегий к различным рыночным условиям с помощью ATR
  2. Множественное подтверждение - снижение ложных сигналов в сочетании с трендовыми и динамическими показателями
  3. Контролируемые риски - эффективные механизмы устранения убытков
  4. Сигналы ясны - торговые сигналы ясны и легко исполняются
  5. Гибкость параметров - поддержка множества параметров для оптимизации

Стратегический риск

  1. Риск рыночных потрясений - частое возникновение стоп-лосса в условиях межзональных потрясений
  2. Риск скольжения - более крупные скольжения в быстром движении
  3. Риск фиксированных стоп-убытков - фиксированные стоп-убытки могут не подходить для всех рыночных условий
  4. Риск ложного проникновения - возможна ложная сигнализация проникновения в сверточной зоне
  5. Чувствительность параметров - выбор параметров оказывает большое влияние на эффективность стратегии

Направление оптимизации стратегии

  1. Оптимизация динамического стоп-убытка - рассмотрение возможности использования ATR или динамического регулирования стоп-позиции волатильности
  2. Фильтрация рыночной конъюнктуры - добавление индикатора силы тренда, открытие позиции только в случае сильной тенденции
  3. Усиление подтверждения сигнала - можно рассмотреть возможность добавления подтверждения заряда
  4. Оптимизация времени входа - внедрение распознавания ценовых форм для повышения точности входа
  5. Управление позицией - динамическая корректировка размеров позиций на основе волатильности

Подвести итог

Эта стратегия, в сочетании с ZigZag и случайными показателями, создает более полную торговую систему. Основными характеристиками стратегии являются четкость сигналов, контролируемый риск, но все же требуется оптимизация параметров в соответствии с реальными рыночными условиями. Рекомендуется проводить достаточный отзыв перед торговлей в реальном мире и постоянно совершенствовать стратегию в сочетании с опытом рынка.

Исходный код стратегии
/*backtest
start: 2025-02-18 14:00:00
end: 2025-02-20 00:00:00
period: 5m
basePeriod: 5m
exchanges: [{"eid":"Binance","currency":"SOL_USDT"}]
*/

//@version=5
strategy("[RS]ZigZag Percent Reversal with Stochastic Strategy", overlay=true)

//  ||---}---------------------------------------------------------------------||

//  |--------------------------------------------------------------------------||
//  |   ZigZag:                                                                ||
//  |--------------------------------------------------------------------------||
//  |{
string percent_method = input.string(
         defval="MANUAL", 
         title="Method to use for the zigzag reversal range:", 
         options=[
             "MANUAL", 
             "ATR005 * X", "ATR010 * X", "ATR020 * X", "ATR050 * X", "ATR100 * X", "ATR250 * X"
             ]
         )

var float percent = input.float(
         defval=0.25, 
         title="Percent of last pivot price for zigzag reversal:", 
         minval=0.0, maxval=99.0
         ) / 100

float percent_multiplier = input.float(
         defval=1.0, 
         title="Multiplier to apply to ATR if applicable:"
         )
if percent_method == "ATR005 * X"
    percent := ta.atr(5) / open * percent_multiplier
if percent_method == "ATR010 * X"
    percent := ta.atr(10) / open * percent_multiplier
if percent_method == "ATR020 * X"
    percent := ta.atr(20) / open * percent_multiplier
if percent_method == "ATR050 * X"
    percent := ta.atr(50) / open * percent_multiplier
if percent_method == "ATR100 * X"
    percent := ta.atr(100) / open * percent_multiplier
if percent_method == "ATR250 * X"
    percent := ta.atr(250) / open * percent_multiplier

//  ||-------------------------------------------------------------------------||
//  ||  zigzag function:
//  ||-------------------------------------------------------------------------||
//  |{
f_zz(_percent)=>


    //  direction after last pivot
    var bool _is_direction_up = na
    //  track highest price since last lower pivot
    var float _htrack = na
    //  track lowest price since last higher pivot
    var float _ltrack = na
    //  zigzag variable for plotting
    var float _pivot = na
    //  range needed for reaching reversal threshold
    float _reverse_range = 0.0
    //  real pivot time
    var int _real_pivot_time = na
    var int _htime = na
    var int _ltime = na
    //  reverse line
    var float _reverse_line = na
    
    if bar_index >= 1
        
        if na(_is_direction_up)
            _is_direction_up := true
        
        _reverse_range := nz(_pivot[1]) * _percent
        
        if _is_direction_up
            _ltrack := na
            _ltime := time
            
            if na(_htrack)
                if high > high[1]
                    _htrack := high
                    _htime := time
                else
                    _htrack := high[1]
                    _htime := time[1]
            else
                if high > _htrack
                    _htrack := high
                    _htime := time

            // Reversal line calculation based on the current candle's closing price
            _reverse_line := _htrack - _reverse_range
            
            // If close <= reversal line, mark pivot and reverse direction
            if close <= _reverse_line
                _pivot := _htrack
                _real_pivot_time := _htime
                _is_direction_up := false

        if not _is_direction_up
            _htrack := na
            _htime := na
            
            if na(_ltrack)
                if low < low[1]
                    _ltrack := low
                    _ltime := time
                else
                    _ltrack := low[1]
                    _ltime := time[1]
            else
                if low < _ltrack
                    _ltrack := low
                    _ltime := time
                
            // Reversal line calculation based on the current candle's closing price
            _reverse_line := _ltrack + _reverse_range
            
            // If close >= reversal line, mark pivot and reverse direction
            if close >= _reverse_line
                _pivot := _ltrack
                _real_pivot_time := _ltime
                _is_direction_up := true

    [_pivot, _is_direction_up, _reverse_line, _real_pivot_time]

[pivot, direction_up, reverse_line, pivot_time] = f_zz(percent)

// Çizim
// Sabit Reversal Line (fiyat seviyesinde sabit)
var float static_reverse_line = na
if (not na(reverse_line))
    static_reverse_line := reverse_line

plot(series=static_reverse_line, color=color.gray, style=plot.style_line, title="Reversal Line", trackprice=false)

//  ||-------------------------------------------------------------------------||
//  ||  Stochastic:                                                            ||
//  ||-------------------------------------------------------------------------||
//  |{
K_length = 9
K_smoothing = 3

// Stochastic %K hesaplama
stochK = ta.sma(ta.stoch(close, high, low, K_length), K_smoothing)

//  ||-------------------------------------------------------------------------||
//  ||  Custom Buy/Sell Signals:
//  ||-------------------------------------------------------------------------||
//  |{
// Buy sinyali: Fiyat reversal line'ının üstünde ve stochastic K değeri 20'nin altında ise
buy_signal = close > static_reverse_line and stochK < 20

// Sell sinyali: Fiyat reversal line'ının altındaysa ve stochastic K değeri 80'in üstünde ise
sell_signal = close < static_reverse_line and stochK > 80

// Alım ve satım sinyali için strateji girişlerini ekle
long_condition = buy_signal
short_condition = sell_signal

// **Burada Stop Loss ve Take Profit değerleri ayarlandı**
stop_loss_pips = 100  // Stop Loss 10 pip
take_profit_pips = 300  // Take Profit 30 pip

// Stop Loss ve Take Profit seviyeleri hesaplanıyor
long_stop_loss = close - stop_loss_pips * syminfo.mintick
long_take_profit = close + take_profit_pips * syminfo.mintick
short_stop_loss = close + stop_loss_pips * syminfo.mintick
short_take_profit = close - take_profit_pips * syminfo.mintick

// Long stratejisi: Alım sinyali ve stop loss/take profit seviyeleri ile
if long_condition
    strategy.entry("Buy", strategy.long, stop=long_stop_loss, limit=long_take_profit)
    strategy.exit("Take Profit / Stop Loss", from_entry="Buy", stop=long_stop_loss, limit=long_take_profit)
    // Webhook ile alım bildirimi gönder
    alert("Buy Signal Triggered!", alert.freq_once_per_bar)

// Short stratejisi: Satım sinyali ve stop loss/take profit seviyeleri ile
if short_condition
    strategy.entry("Sell", strategy.short, stop=short_stop_loss, limit=short_take_profit)
    strategy.exit("Take Profit / Stop Loss", from_entry="Sell", stop=short_stop_loss, limit=short_take_profit)
    // Webhook ile satım bildirimi gönder
    alert("Sell Signal Triggered!", alert.freq_once_per_bar)

// Alım sinyali gösterimi
plotshape(series=buy_signal, location=location.belowbar, color=color.green, style=shape.labelup, title="Buy Signal", text="BUY", textcolor=color.white)
// Satım sinyali gösterimi
plotshape(series=sell_signal, location=location.abovebar, color=color.red, style=shape.labeldown, title="Sell Signal", text="SELL", textcolor=color.white)