Стратегия торговли срочными контрактами на соединенные инструменты быстрого контроля рисков RSI

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

img

Обзор

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

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

  1. Вычислить быстрый RSI с параметрами 7 дней и перекупленной линией 25, перепроданной линией 75. Когда RSI пересекает перекупленную линию, это сигнал перекупленности. Когда RSI пересекает ниже перепроданной линии, это сигнал перепроданности.

  2. Установите фильтр на теле свечи. Требуется открытие как медвежья свеча с длиной тела не менее 20% от средней длины тела вчера.

  3. Установите фильтр на цвет свечи. Требуйте, чтобы последние 4 свечи были медвежими, когда вы идете коротко, и последние 4 свечи были бычьими, когда вы идете долго.

  4. Закрыть позицию, когда цена движется в неблагоприятном направлении.

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

  6. Используйте фиксированный процент капитала для каждой сделки и удвойте размер позиции после каждой потери.

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

  1. Быстрые параметры RSI, установленные разумно, могут быстро улавливать тенденции.

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

  3. Встроенный механизм остановки потерь ограничивает потерю на одну сделку.

  4. Динамическое размещение позиций обеспечивает умеренно агрессивное управление капиталом.

  5. Настраиваемые торговые временные рамки избегают шума от крупных событий.

Риски и оптимизации

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

  2. Трудно определить конец тренда.

  3. Слишком агрессивный метод измерения положения, может ввести блокировку положения.

  4. Может оптимизировать параметры для разных рынков, чтобы найти лучшие комбинации параметров.

Заключение

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


/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Robot BitMEX Fast RSI v1.0", shorttitle = "Robot BitMEX Fast RSI v1.0", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 10)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(true, defval = true, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
rsiperiod = input(7, defval = 7, minval = 2, maxval = 100, title = "RSI Period")
rsilimit = input(25, defval = 25, minval = 1, maxval = 30, title = "RSI limit")
rsibars = input(1, defval = 1, minval = 1, maxval = 20, title = "RSI Bars")
useocf = input(true, defval = true, title = "Use Open Color Filter")
useccf = input(true, defval = true, title = "Use Close Color Filter")
openbars = input(4, defval = 4, minval = 1, maxval = 20, title = "Open Color Bars")
closebars = input(1, defval = 1, minval = 1, maxval = 20, title = "Close Color Bars")
useobf = input(true, defval = true, title = "Use Open Body Filter")
usecbf = input(true, defval = true, title = "Use Close Body Filter")
openbody = input(20, defval = 20, minval = 0, maxval = 1000, title = "Open Body Minimum, %")
closebody = input(50, defval = 50, minval = 0, maxval = 1000, title = "Close Body Minimum, %")
usecnf = input(true, defval = true, title = "Use Close Norma Filter")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From Day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To Day")

//RSI
uprsi = rma(max(change(close), 0), rsiperiod)
dnrsi = rma(-min(change(close), 0), rsiperiod)
rsi = dnrsi == 0 ? 100 : uprsi == 0 ? 0 : 100 - (100 / (1 + uprsi / dnrsi))
uplimit = 100 - rsilimit
dnlimit = rsilimit
rsidn = rsi < dnlimit ? 1 : 0
rsiup = rsi > uplimit ? 1 : 0
rsidnok = sma(rsidn, rsibars) == 1
rsiupok = sma(rsiup, rsibars) == 1

//Body Filter
body = abs(close - open)
abody = sma(body, 10)
openbodyok = body >= abody / 100 * openbody or useobf == false
closebodyok = body >= abody / 100 * closebody or usecbf == false

//Color Filter
bar = close > open ? 1 : close < open ? -1 : 0
gbar = bar == 1 ? 1 : 0
rbar = bar == -1 ? 1 : 0
opengbarok = sma(gbar, openbars) == 1 or useocf == false
openrbarok = sma(rbar, openbars) == 1 or useocf == false
closebarok = (strategy.position_size > 0 and bar == 1) or (strategy.position_size < 0 and bar == -1) or useccf == false

//Norma Filter
norma = (rsi > dnlimit and rsi < uplimit) or usecnf == false

//Signals
up = openrbarok and rsidnok and openbodyok and (strategy.position_size == 0 or close < strategy.position_avg_price)
dn = opengbarok and rsiupok and openbodyok and (strategy.position_size == 0 or close > strategy.position_avg_price)
exit = ((strategy.position_size > 0 and closebarok and norma) or (strategy.position_size < 0 and closebarok and norma)) and closebodyok

//Indicator
plot(rsi, color = blue, linewidth = 3, title = "Double RSI")
plot(uplimit, color = black, title = "Upper Line")
plot(dnlimit, color = black, title = "Lower Line")
colbg = rsi > uplimit ? red : rsi < dnlimit ? lime : na
bgcolor(colbg, transp = 20)

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Больше