В процессе загрузки ресурсов... загрузка...

Количественная стратегия торговли под двойным давлением

Автор:Чао Чжан, Дата: 2023-11-02 13:56:23
Тэги:

img

Обзор

Стратегия двойного давления - это стратегия, которая сочетает в себе индикаторы стохастического и объемного движения, в основном используя линии K и D вместе с индикаторами объема для генерации сигналов купли и продажи, дополненных пересечениями скользящих средних для дополнительных сигналов.

Логика стратегии

Сигналы покупки

Основной сигнал покупки запускается, когда:

  1. Обе линии K и D пересекают ниже площади перепродажи (например, 20) и поднимаются, и оба K и D растут

  2. Объем превышает определенный порог (например, в 1,4 раза превышает средний объем)

  3. Закрыть - значит открыть (белая свеча)

Дополнительные сигналы о покупке могут исходить от:

  1. Золотой крест: быстрая EMA пересекает медленную EMA, обе растут

  2. И K, и D поднимаются с низкой в среднюю зону (например, с ниже 20 до 20-80)

Сигналы продажи

Основные сигналы продажи запускаются, когда:

  1. И K, и D входят в зону перекупленности (например, выше 80%)

  2. Смертный перекресток: быстрая EMA пересекает медленную EMA

  3. K переходит ниже D, и оба K и D падают

Остановить потерю

Процент (например, 6%) ниже цены покупки устанавливается как уровень стоп-лосса.

Анализ преимуществ

  • Двойная стохастическая система избегает ложных сигналов
  • Объем фильтрует шум и обеспечивает тенденцию
  • Объединение нескольких сигналов повышает точность
  • Движущиеся средние поддерживают общую тенденцию
  • Контроль риска при остановке потерь

Преимущество 1: Двойной стохастический метод избегает ложных сигналов

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

Преимущество 2: объем фильтрует шум и обеспечивает тенденцию

Условия объема фильтруют низкообъемные точки, не являющиеся трендом, и снижают риск задержания.

Преимущество 3: множественные сигналы повышают точность

Несколько индикаторов должны соответствовать друг другу, чтобы запустить реальные торговые сигналы. Это повышает надежность сигнала.

Преимущество 4: скользящие средние способствуют общей тенденции

Правила, такие как двойные скользящие средние, гарантируют, что сигналы соответствуют общему тренду.

Преимущество 5: Стоп-потеря контролирует риск

Логика стоп-лосса реализует прибыль и контролирует убытки на отдельных сделках.

Анализ рисков

  • Параметры нуждаются в тщательной оптимизации, неправильные настройки приводят к плохой производительности
  • При размещении стоп-лосса должен учитываться риск разрыва
  • Риск ликвидности должен контролироваться для торговых инструментов
  • Проблема обратного просмотра между различными временными рамками

Риск 1: параметры требуют тщательной оптимизации

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

Риск 2: При размещении стоп-лосса необходимо учитывать риск разрыва

Точка остановки потери должна учитывать сценарии ценового разрыва.

Риск 3: Контроль риска ликвидности

Для неликвидных инструментов правила объема могут отфильтровывать слишком много сигналов.

Риск 4: Проблема обратной связи между временными рамками

Сигналы в разные временные рамки могут быть неправильно выровнены. Сигналы должны быть подтверждены.

Возможности для расширения

Стратегия может быть усилена в таких областях, как:

  1. Оптимизировать параметры надежности

  2. Внедрение машинного обучения для адаптивных параметров

  3. Улучшение стратегии стоп-лосса для снижения уровня стоп-лосса

  4. Добавить фильтры для уменьшения частоты торговли

  5. Исследуйте условные заказы или получение прибыли для улучшения вознаграждения

Первая возможность: оптимизировать параметры прочности

Такие методы, как генетические алгоритмы, могут систематически оптимизировать параметры стабильности на рынке.

Возможность 2: внедрение машинного обучения для адаптивных параметров

Модели могут оценивать рыночные условия и соответственно корректировать параметры, достигая динамической оптимизации.

Возможность 3: Улучшить стратегию стоп-лосса для снижения показателя стоп-лосса

Лучшие алгоритмы остановки потерь могут уменьшить ненужные остановки при сохранении контроля риска.

Возможность 4: Добавить фильтры для уменьшения частоты торговли

Укрепление фильтров может уменьшить частоту торговли, снизить затраты и улучшить доходность от торговли.

Возможность 5: изучить условные заказы или получение прибыли

В соответствии с рыночными условиями, условные заказы или стратегии получения прибыли могут лучше максимизировать прибыль, контролируя риск.

Заключение

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


/*backtest
start: 2023-10-02 00:00:00
end: 2023-11-01 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
// SW SVE - Stochastic+Vol+EMAs [Sergio Waldoke]
// Script created by Sergio Waldoke (BETA VERSION v0.5, fine tuning PENDING)
// Stochastic process is the main source of signals, reinforced on buying by Volume. Also by Golden Cross.
// Selling is determined by K and D entering overselling zone or EMA's Death Cross signal, the first occurring,
// and some other signals combined.
// Buy Long when you see a long buy arrow.
// Sell when you see a close arrow.
// This is a version to be tuned and improved, but already showing excelent results after tune some parameters
// according to the kind of market.
// Strategy ready for doing backtests.

// SVE SYSTEM DESIGN:
// Buy Signal Trigger:
// - Both Stoch <= 20 crossing up and both growing and green candle and Vol/sma vol >= 1.40 Avg Vol
//   or
// - Both Stoch growing up and Vol/sma vol >= 1.40 Avg Vol and green candle and
//   both prior Stoch crossing up
//   or
//   [OPTIONAL]: (Bad for BTC 2018, excelent for 2017)
// - Crossingover(fast_ema, slow_ema) and growing(fast_ema) and growing(slow_ema) and green candle

// Exit position:
// - Both Stoch <= 20 and Both Stoch were > 20 during position
//   or
// - CrossingUnder(Fast EMA, Medium EMA)
//   or   [OPTIONAL] (Better for BTC 2018, Worse for BNB 1H)
// - CrossingUnder(k, d) and (k and d starting over over_buying) and (k and d descending) and k crossing down over_buying line

//calc_on_every_tick=true,
//calc_on_order_fills=true,   (affects historical calculation, triggers in middle of the bar, may be better for automatic orders)
strategy("SW SVE - Stochastic+Vol+EMAs [Sergio Waldoke]", shorttitle="SW SVE", overlay=true, max_bars_back=5000,
         default_qty_type=strategy.percent_of_equity, default_qty_value=100, currency="USD",
         commission_type=strategy.commission.percent, commission_value=0.25)

//Strategy Parameters
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromYear  = input(defval = 2018, title = "From Year", minval = 2009, maxval = 2200)
ToDay     = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
ToMonth   = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToYear    = input(defval = 2030, title = "To Year", minval = 2009, maxval = 2200)

//Indicator Parameters
//Original defaults for 4HS: 14, 3, 80, 20,   14, 23, 40,   20, 40,   3:
stoch_k = input(title="Stoch K",  defval=14, minval=1)
stoch_d = input(title="Stoch D",  defval=3, minval=1)
over_buying  = input(title="Stoch Overbuying Zone",  defval=80, minval=0, maxval=100)
over_selling = input(title="Stoch Overselling Zone",  defval=20, minval=0, maxval=100)

fast_ema_periods = input(title="Fast EMA (Death Cross)",  defval=14, minval=1, maxval=600)
slow_ema_periods = input(title="Slow EMA (Death Cross)",  defval=23, minval=1, maxval=600)
trend_ema_periods = input(title="Slowest EMA (Trend Test)",  defval=40, minval=1, maxval=600)

volume_periods = input(title="Volume Periods",  defval=20, minval=1, maxval=600)
volume_factor = input(title="Min Volume/Media Increase (%)",  defval=80, minval=-100) / 100 + 1

threshold_sl_perc = input(title="[Sell Trigger] Stop Loss Threshold %", defval=6.0, type=float, minval=0, maxval=100)

//before_buy = input(title="# Growing Before Buy",  defval=2, minval=1)
//before_sell = input(title="# Decreasing Before Sell",  defval=1, minval=1)
//stepsignal = input(title="Show White Steps", type=bool, defval=true)
//steps_base = input(title="White Steps Base",  defval=242, minval=0)

//Signals
fast_ema = ema(close, fast_ema_periods)
slow_ema = ema(close, slow_ema_periods)
trend_ema = ema(close, trend_ema_periods)
k = stoch(close, high, low, stoch_k)
d = sma(k, stoch_d)
vol_ma = sma(volume, volume_periods)

//REVIEW CONSTANT 1.75:
in_middle_zone(a) => a > over_selling * 1.75 and a < over_buying
growing(a) => a > a[1] 

was_in_middle_zone = k == d
was_in_middle_zone := was_in_middle_zone[1] or in_middle_zone(k) and in_middle_zone(d)

//Buy Signal Trigger:
//- Both Stoch <= 20 crossing up and both growing and 
//  green candle and Vol/sma vol >= 1.40 Avg Vol
buy = k <= over_selling and d <= over_selling and crossover(k, d) and growing(k) and growing(d) and
      close > open and volume/vol_ma >= volume_factor

//or
//- Both Stoch growing up and Vol/sma vol >= 1.40 Avg Vol and green candle and
//  both prior Stoch crossing up
buy := buy or (growing(k) and growing(d) and volume/vol_ma >= volume_factor and close > open and
              crossover(k[1], d[1]) )
//Worse:
//              (crossover(k[1], d[1]) or (crossover(k, d) and k[1] <= over_selling and d[1] <= over_selling) ) )

//or
//  [OPTIONAL]: (Bad for BTC 2018, excelent for 2017)
//- Crossingover(fast_ema, slow_ema) and growing(fast_ema) and growing(slow_ema) and green candle
buy := buy or (crossover(fast_ema, slow_ema) and growing(fast_ema) and growing(slow_ema) and close > open)


//Debug:
//d1 = close > open  ? 400 : 0
//plot(d1+5200, color=white, linewidth = 3, style = stepline)

//Exit position:
//- Both Stoch <= 20 and Both Stoch were > 20 during position
sell = k <= over_selling and d <= over_selling and was_in_middle_zone

//  or
//- CrossingUnder(Fast EMA, Medium EMA)
sell := sell or crossunder(fast_ema, slow_ema)

//  or  [OPTIONAL] (Better for BTC 2018, Worse for BNB 1H)
//- CrossingUnder(k, d) and (k and d starting over over_buying) and (k and d descending) and k crossing down over_buying line
sell := sell or (crossunder(k, d) and k[1] >= over_buying and d[1] >= over_buying and
                 not growing(k) and not growing(d) and k <= over_buying)

color = buy ? green : red

bought_price = close
bought_price := nz(bought_price[1])

already_bought = false
already_bought := nz(already_bought[1], false)

//Date Ranges
buy  := buy and  not already_bought


//d1 = buy ? 400 : 0
//plot(d1+6500, color=white, linewidth = 3, style = stepline)

was_in_middle_zone := (not buy and was_in_middle_zone) or (in_middle_zone(k) and in_middle_zone(d))

already_bought   := already_bought[1] or buy
bought_price := buy ? close * (1 - threshold_sl_perc/100) : bought_price[1]
trigger_SL = close < bought_price[0]
sell := sell or trigger_SL

sell := sell and  
                 already_bought and not buy and (was_in_middle_zone or trigger_SL)

//plot((sell?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)
                 
already_bought   := already_bought[0] and not sell
bought_price := sell ? 0 : bought_price[0]

//plot((was_in_middle_zone?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)

was_in_middle_zone := not sell and was_in_middle_zone

//Plot signals
plot(fast_ema, title="Fast EMA", color=red, linewidth = 4)
plot(slow_ema, title="Slow EMA", color=blue, linewidth = 4)
plot(trend_ema, title="Trend EMA", color=yellow, linewidth = 4)

//Stop Loss
plot(bought_price, color=gray, linewidth=2, style=cross, join=true, title="Stop Loss")

//Y = stepsignal ? lowest(40) : na
//Y = steps_base
//plot(mysignal+Y, title="Steps", color=white, linewidth = 3, style = stepline)
//Unit steps - for debugging
//plot(mysteps+Y, title="Steps2", color=yellow, linewidth = 3, style = stepline)

//Bought or not - for debugging
//plot((already_bought?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)
//plot((sell?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)

plotshape(buy, title="Buy arrows", style=shape.arrowup, location=location.belowbar, color=color, text="Buy", textcolor=color, size=size.huge, transp=30)
plotshape(sell, title="Sell arrows", style=shape.arrowdown, location=location.abovebar, color=color, text="Sell", textcolor=color, size=size.huge, transp=30)

//if n>2000
strategy.entry("buy", strategy.long, when=buy)
strategy.close_all(when=sell)

//plot(strategy.equity, title="Equity", color=white, linewidth = 4, style = line)

//AlertS trigger
//msg = "[SW Magic Signals EMA] BUY/SELL Signal has been triggered." + "(" + tostring(fastema) + ", " + tostring(slowema) + ") on " + tickerid + ", " + period + "."
msg = "SW SVE BUY/SELL Signal has been triggered. (#, #) on EXCH:PAIR, period: #."

alertcondition(buy or sell, title="SW SVE (BUY/SELL SIGNAL)", message=msg)
alertcondition(buy, title="SW SVE (BUY SIGNAL)", message=msg)
alertcondition(sell, title="SW SVE (SELL SIGNAL)", message=msg)


Больше