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

Стратегия хеджирования импульса с использованием множественных показателей RSI-EMA с масштабированием позиций

Автор:Чао Чжан, Дата: 2024-12-04 15:41:10
Тэги:РСИЕМАТПSL

img

Обзор

Эта стратегия использует двойные периоды RSI (RSI-14 и RSI-2) в сочетании с тройными линиями EMA (50, 100, 200) для захвата возможностей для изменения тренда на рынке, реализуя хеджирование с помощью динамического управления позициями.

Принципы стратегии

Стратегия использует RSI-14 и RSI-2 с различными периодами, наряду с EMA-50, EMA-100, и EMA-200 для определения торговых сигналов. Долгие условия требуют RSI-14 ниже 31 и пересечения RSI-2 выше 10, в то время как EMA должны быть в медвежьем выравнивании (EMA-50 < EMA-100 < EMA-200).

Преимущества стратегии

  1. Взаимная проверка нескольких технических показателей повышает надежность сигнала
  2. Динамическое управление позициями позволяет гибко корректировать портфель
  3. Двусторонний торговый механизм позволяет получать прибыль в обоих направлениях
  4. Адаптивные условия получения прибыли предотвращают преждевременный выход
  5. Ясный графический интерфейс, показывающий торговые сигналы и рыночные условия
  6. Механизм хеджирования уменьшает направленный риск
  7. Расчет динамической позиции на основе акций для улучшения контроля рисков

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

  1. Высокий кредитный кредит (20x) может привести к значительным рискам ликвидации
  2. Постепенное позиционирование может привести к серьезным потерям во время волатильности рынка
  3. Отсутствие условий стоп-лосса может привести к постоянным рискам привлечения
  4. Показатели RSI могут генерировать ложные сигналы на рыночных диапазонах
  5. Сочетание нескольких технических индикаторов может уменьшить торговые возможности
  6. Метод управления позициями может накапливать чрезмерный риск во время последовательных операций

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

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

Резюме

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


/*backtest
start: 2024-11-26 00:00:00
end: 2024-12-03 00:00:00
period: 10m
basePeriod: 10m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Custom RSI EMA Strategy Hedge", overlay=true, default_qty_type=strategy.fixed, default_qty_value=1)

// Definování vstupních podmínek
rsi_14 = ta.rsi(close, 14)
rsi_2 = ta.rsi(close, 2)
ema_50 = ta.ema(close, 50)
ema_100 = ta.ema(close, 100)
ema_200 = ta.ema(close, 200)

// Pákový efekt
leverage = 20

// Podmínky pro long pozici
longCondition = (rsi_14[1] < 31) and ta.crossover(rsi_2, 10) and (ema_50 < ema_100) and (ema_100 < ema_200)

// Podmínky pro short pozici
shortCondition = (rsi_14[1] > 69) and ta.crossunder(rsi_2, 90) and (ema_50 > ema_100) and (ema_100 > ema_200)

// Identifikátory pozic
long_id = "Long"
short_id = "Short"

// Definování průměrné ceny pozice pro long a short
var float long_avg_price = na
var float short_avg_price = na

// Sledujeme, zda se velikost pozice změnila
var float last_long_position_size = na
var float last_short_position_size = na

// Přerušení průměrné ceny pozice při změně pozice
if (last_long_position_size != strategy.position_size and strategy.position_size > 0)
    long_avg_price := na
if (last_short_position_size != strategy.position_size and strategy.position_size < 0)
    short_avg_price := na

// Aktualizace průměrné ceny pozice
if (strategy.position_size > 0)
    long_avg_price := strategy.position_avg_price
else
    long_avg_price := na

if (strategy.position_size < 0)
    short_avg_price := strategy.position_avg_price
else
    short_avg_price := na

// Uložení aktuální velikosti pozice pro příští bar
if (strategy.position_size > 0)
    last_long_position_size := strategy.position_size
else if (strategy.position_size < 0)
    last_short_position_size := strategy.position_size

// Podmínky pro take profit
takeProfitLongCondition = (rsi_14 > 69) and (rsi_2 > 90) and (long_avg_price < close)
takeProfitShortCondition = (rsi_14 < 31) and (rsi_2 < 10) and (short_avg_price > close)

// Velikost pozice
new_long_position_size = strategy.position_size == 0 ? na : math.abs(strategy.position_size) * 2
new_short_position_size = strategy.position_size == 0 ? na : math.abs(strategy.position_size) * 2

// Úprava velikosti pozice s ohledem na pákový efekt
position_value = strategy.equity * leverage
trade_qty_long = position_value / close
trade_qty_short = position_value / close

// Vstup do long pozice s dvojnásobkem aktuální pozice nebo standardní velikostí při první pozici
if (longCondition)
    strategy.entry(long_id, strategy.long, qty=new_long_position_size == na ? trade_qty_long : new_long_position_size)

// Vstup do short pozice s dvojnásobkem aktuální pozice nebo standardní velikostí při první pozici
if (shortCondition)
    strategy.entry(short_id, strategy.short, qty=new_short_position_size == na ? trade_qty_short : new_short_position_size)

// Výstup z long pozice při splnění podmínek pro take profit
if (takeProfitLongCondition)
    strategy.close(long_id)

// Výstup z short pozice při splnění podmínek pro take profit
if (takeProfitShortCondition)
    strategy.close(short_id)

// Zvýraznění části grafu, kde platí podmínky pro long
highlightLongCondition = (ema_50 < ema_100) and (ema_100 < ema_200)
bgcolor(highlightLongCondition ? color.new(color.green, 90) : na)

// Zvýraznění části grafu, kde platí podmínky pro short
highlightShortCondition = (ema_50 > ema_100) and (ema_100 > ema_200)
bgcolor(highlightShortCondition ? color.new(color.red, 90) : na)

// Přidání bodů pozic do grafu
plotshape(series=longCondition, location=location.belowbar, color=color.green, style=shape.labelup, text="L")
plotshape(series=shortCondition, location=location.abovebar, color=color.red, style=shape.labeldown, text="S")

// Vykreslení průměrné ceny pozice pro long a short pouze pokud pozice existuje
plot(strategy.position_size > 0 ? long_avg_price : na, title="Long Avg Price", color=color.blue, linewidth=2)
plot(strategy.position_size < 0 ? short_avg_price : na, title="Short Avg Price", color=color.orange, linewidth=2)

// Zvýraznění čtverců pro RSI14 > 70 (červeně) a RSI14 < 30 (zeleně)
var int rsi_above_70_start = na
var int rsi_below_30_start = na

var float top_value_above_70 = na
var float bottom_value_above_70 = na

var float top_value_below_30 = na
var float bottom_value_below_30 = na

// Identifikace začátku a konce období pro RSI14 > 70
if (rsi_14[1] > 70 and rsi_14[2] > 70)
    if na(rsi_above_70_start)
        rsi_above_70_start := bar_index
        top_value_above_70 := high
        bottom_value_above_70 := low
    else
        top_value_above_70 := math.max(top_value_above_70, high)
        bottom_value_above_70 := math.min(bottom_value_above_70, low)
else
    if not na(rsi_above_70_start)
        // box.new(left = rsi_above_70_start, right = bar_index - 1, top = top_value_above_70, bottom = bottom_value_above_70, border_color = color.red, border_width = 2, bgcolor=color.new(color.red, 90))
        rsi_above_70_start := na
        top_value_above_70 := na
        bottom_value_above_70 := na

// Identifikace začátku a konce období pro RSI14 < 30
if (rsi_14[1] < 30 and rsi_14[2] < 30)
    if na(rsi_below_30_start)
        rsi_below_30_start := bar_index
        top_value_below_30 := high
        bottom_value_below_30 := low
    else
        top_value_below_30 := math.max(top_value_below_30, high)
        bottom_value_below_30 := math.min(bottom_value_below_30, low)
else
    if not na(rsi_below_30_start)
        // box.new(left = rsi_below_30_start, right = bar_index - 1, top = top_value_below_30, bottom = bottom_value_below_30, border_color = color.green, border_width = 2, bgcolor=color.new(color.green, 90))
        rsi_below_30_start := na
        top_value_below_30 := na
        bottom_value_below_30 := na


Связанные

Больше