Стратегия торговли дивергенцией по РСИ

Автор:Чао Чжан, Дата: 2023-10-25 16:47:14
Тэги:

img

Обзор

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

Принцип

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

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

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

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

Стратегия торговли дивергенцией по РСИ имеет следующие преимущества:

  1. Зафиксирование расхождений RSI позволяет заранее обнаружить изменение тренда.

  2. RSI широко используется и доступен на большинстве торговых площадок.

  3. Параметры RSI гибки и могут быть скорректированы в зависимости от различных рыночных условий.

  4. Стоп-лосс, прибыль и последующий стоп-лосс эффективно контролируют риск.

  5. Стратегия имеет умеренную частоту сигнала, избегая чрезмерной торговли.

  6. Логика проста и легко запрограммирована для автоматизации.

Риски

Стратегия также сопряжена с некоторыми рисками:

  1. Дивергенции RSI не являются полностью надежными и могут генерировать ложные сигналы.

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

  3. Слишком короткие периоды увеличивают частоту и риск.

  4. Слишком строгое установление стоп-лосса сокращает прибыль; слишком свободное установление не ограничивает риск.

  5. Продолжающаяся остановка может быть преждевременно прекращена во время волатильности рынков.

Риски могут быть смягчены путем:

  1. Добавление других индикаторов, таких как MACD, полосы Боллинджера для фильтрации сигналов и уменьшения ложных сигналов.

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

  3. Оптимизация параметров RSI, выбор оптимальных периодов обратной связи, тестирование параметров для разных рынков.

  4. Установка разумных уровней стоп-лосса и получения прибыли на основе исторических обратных тестов.

  5. Корректировка дистанции остановки на основе волатильности рынка и желания рисковать.

Оптимизация

Стратегия может быть улучшена в следующих аспектах:

  1. Включить другие индикаторы для фильтрации сигналов и повышения надежности.

  2. Используйте машинное обучение для автоматической оптимизации параметров RSI.

  3. Дизайн динамических алгоритмов стоп-лосса в соответствии с рыночным режимом.

  4. Создать динамическую модель размещения позиций на основе волатильности для корректировки размеров позиций.

  5. Введение волатильности в отслеживании остановки на расстоянии отслеживания на основе колебаний цен.

  6. Развернуть стратегию на других рынках, таких как форекс и криптовалюты.

  7. Разработка количественной торговой системы для автоматизации.

Заключение

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


/*backtest
start: 2023-09-24 00:00:00
end: 2023-10-24 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © faytterro

//@version=5
// strategy("RSI Divergence Strategy", overlay=true, scale = scale.none)
rsilen=input.int(14, title="rsi length")
rsisrc=input(close, title="source")
x=ta.rsi(rsisrc,rsilen)
len=input.int(14, title="RSI Divergence length", maxval=500)
tpb = input.float(25, title="take profit", group = "buy", step = 0.5)
sb = input.float(5, title="stop", group = "buy", step = 0.5)
tsb = input.float(0.25, title="trailing stop", group = "buy", step = 0.5)
tps = input.float(25, title="take profit", group = "sell", step = 0.5)
ss =input.float(5, title="stop", group = "sell", step = 0.5)
tss = input.float(0.25, title="trailing stop", group = "sell", step = 0.5)
src=close
extrapolation=0
zoom=input.int(0, title="zoom", maxval=27, minval=-27)
hline(300-zoom*10, color=color.rgb(54, 58, 69, 100))
hline(10, color=color.rgb(54, 58, 69, 100))
// for ax+b
xo=0.0
yo=0.0
xyo=0.0
xxo=0.0
for i=0 to len-1
    xo:= xo + i/(len)
    yo:= yo + x[len-1-i]/(len)
    xyo:= xyo + i*x[len-1-i]/(len)
    xxo:= xxo + i*i/(len)
dnm=ta.lowest(low,200)
dizi=array.new_float(len*2+1+extrapolation)
// linedizi=array.new_line()
a=(xo*yo-xyo)/(xo*xo-xxo)
b=yo-a*xo
for i=0 to len-1+extrapolation
    array.set(dizi,i,a*i+b)
//// for src
// for ax+b
xo2=0.0
yo2=0.0
xyo2=0.0
xxo2=0.0
for i=0 to len-1
    xo2:= xo2 + i/(len)
    yo2:= yo2 + src[len-1-i]/(len)
    xyo2:= xyo2 + i*src[len-1-i]/(len)
    xxo2:= xxo2 + i*i/(len)

dizi2=array.new_float(len*2+1+extrapolation)
// linedizi2=array.new_line()
a2=(xo2*yo2-xyo2)/(xo2*xo2-xxo2)
b2=yo2-a*xo2
for i=0 to len-1+extrapolation
    array.set(dizi2,i,a2*i+b2)
ttk=((array.get(dizi,0)<array.get(dizi,1)) and (array.get(dizi2,0)>array.get(dizi2,1)))? 1 : 
 ((array.get(dizi,0)>array.get(dizi,1)) and (array.get(dizi2,0)<array.get(dizi2,1)))? -1 : 0
cg=((array.get(dizi,0)<array.get(dizi,1)) and (array.get(dizi2,0)>array.get(dizi2,1)))// and ta.highest(ttk[1],len/2)<1)
cr=((array.get(dizi,0)>array.get(dizi,1)) and (array.get(dizi2,0)<array.get(dizi2,1)))// and ta.lowest(ttk[1],len/2)>-1)
bgcolor(color=(cg and ta.highest(ttk[1],len/2)<1)? color.rgb(76, 175, 79, 50) : 
 (cr and ta.lowest(ttk[1],len/2)>-1)? color.rgb(255, 82, 82, 50) : na, offset=0, display=display.none)
plot(x)

// for ax+b
xo3=0.0
yo3=0.0
xyo3=0.0
xxo3=0.0
for i=0 to len-1
    xo3:= xo3 + i/(len)
    yo3:= yo3 + x[len-1-i+(ta.barssince(cg))]/(len)
    xyo3:= xyo3 + i*x[len-1-i+(ta.barssince(cg))]/(len)
    xxo3:= xxo3 + i*i/(len)

dizi3=array.new_float(len*2+1+extrapolation)
// linedizi3=array.new_line()
a3=(xo3*yo3-xyo3)/(xo3*xo3-xxo3)
b3=yo3-a3*xo3
for i=0 to len-1+extrapolation
    array.set(dizi3,i,a3*i+b3)

// for ax+b
xo4=0.0
yo4=0.0
xyo4=0.0
xxo4=0.0
for i=0 to len-1
    xo4:= xo4 + i/(len)
    yo4:= yo4 + x[len-1-i+(ta.barssince(cr))]/(len)
    xyo4:= xyo4 + i*x[len-1-i+(ta.barssince(cr))]/(len)
    xxo4:= xxo4 + i*i/(len)

dizi4=array.new_float(len*2+1+extrapolation)
// linedizi4=array.new_line()
a4=(xo4*yo4-xyo4)/(xo4*xo4-xxo4)
b4=yo4-a4*xo4
for i=0 to len-1+extrapolation
    array.set(dizi4,i,a4*i+b4)

// line=line.new((last_bar_index-ta.barssince(cg)-len),
//  array.get(dizi3,0), 
//  last_bar_index-ta.barssince(cg),
//  array.get(dizi3,len-1), color=color.rgb(0,255,0), width=2)
// line2=line.new((last_bar_index-ta.barssince(cr)-len),
//  array.get(dizi4,0), 
//  last_bar_index-ta.barssince(cr),
//  array.get(dizi4,len-1), color=color.rgb(255, 0, 0, 0), width=2)
// line.delete(line[1])
// line.delete(line2[1])

alert=((array.get(dizi,0)<array.get(dizi,1)) and (array.get(dizi2,0)>array.get(dizi2,1)) and ta.highest(ttk[1],len/2)<1)
 or ((array.get(dizi,0)>array.get(dizi,1)) and (array.get(dizi2,0)<array.get(dizi2,1)) and ta.lowest(ttk[1],len/2)>-1)
alertcondition(alert)
hline(50)
rs=hline(30)
rss=hline(70)
fill(rs, rss, color=color.rgb(126, 87, 194, 90), title="RSI Background Fill")

longCondition = cg and ta.highest(ttk[1],len/2)<1 
if (longCondition)
    strategy.entry("Long", strategy.long)
    strategy.exit("exit long", "Long", limit = close*(100+tpb)/100 , stop =close*(100-sb)/100 , trail_price = close , trail_offset = close*tsb)

shortCondition = cr and ta.lowest(ttk[1],len/2)>-1 
if (shortCondition)
    strategy.entry("Short", strategy.short)
    strategy.exit("exit short", "Short", limit = close*(100-tps)/100, stop = close*(100+ss)/100, trail_price = close , trail_offset = close*tss)


Больше