Стратегия торговли с дивергенцией RSI генерирует сигналы купли и продажи путем выявления расхождений между индикатором RSI и движением цены. Стратегия также включает стоп-лосс, прибыль и стоп-лосс для эффективного управления рисками.
Эта стратегия в основном использует расхождения в индикаторе RSI для выявления торговых возможностей. В частности, стратегия сначала рассчитывает значения RSI в течение определенного периода, а затем графизирует линии тренда как для индикатора RSI, так и для цены. Когда линия RSI отклоняется от ценовой линии, то есть RSI повышается, когда цена падает, или RSI падает, когда цена повышается, стратегия воспринимает это как признак надвигающегося изменения тренда и генерирует торговые сигналы.
Если стратегия обнаруживает, что линия RSI опускается до дна, в то время как линия цены превышает, генерируется сигнал покупки. Если линия RSI достигает вершины, в то время как линия цены опускается, генерируется сигнал продажи. После того, как происходит торговый сигнал, стратегия может торговать в соответствии с размером стоимости RSI.
Кроме того, стратегия имеет функции остановки потери, получения прибыли и отслеживания стоп-потери. Стоп-потери контролируют риски снижения, блокируют прибыль в прибыли, а отслеживание остановки позволяет получать прибыль. Эти настройки эффективно управляют рисками для каждой сделки.
Стратегия торговли дивергенцией по РСИ имеет следующие преимущества:
Зафиксирование расхождений RSI позволяет заранее обнаружить изменение тренда.
RSI широко используется и доступен на большинстве торговых площадок.
Параметры RSI гибки и могут быть скорректированы в зависимости от различных рыночных условий.
Стоп-лосс, прибыль и последующий стоп-лосс эффективно контролируют риск.
Стратегия имеет умеренную частоту сигнала, избегая чрезмерной торговли.
Логика проста и легко запрограммирована для автоматизации.
Стратегия также сопряжена с некоторыми рисками:
Дивергенции RSI не являются полностью надежными и могут генерировать ложные сигналы.
Дивергенции могут не удаться на сильно развивающихся рынках, что следует избегать.
Слишком короткие периоды увеличивают частоту и риск.
Слишком строгое установление стоп-лосса сокращает прибыль; слишком свободное установление не ограничивает риск.
Продолжающаяся остановка может быть преждевременно прекращена во время волатильности рынков.
Риски могут быть смягчены путем:
Добавление других индикаторов, таких как MACD, полосы Боллинджера для фильтрации сигналов и уменьшения ложных сигналов.
Использование стратегии только на рынках с ограниченным диапазоном, избегая сильных тенденций.
Оптимизация параметров RSI, выбор оптимальных периодов обратной связи, тестирование параметров для разных рынков.
Установка разумных уровней стоп-лосса и получения прибыли на основе исторических обратных тестов.
Корректировка дистанции остановки на основе волатильности рынка и желания рисковать.
Стратегия может быть улучшена в следующих аспектах:
Включить другие индикаторы для фильтрации сигналов и повышения надежности.
Используйте машинное обучение для автоматической оптимизации параметров RSI.
Дизайн динамических алгоритмов стоп-лосса в соответствии с рыночным режимом.
Создать динамическую модель размещения позиций на основе волатильности для корректировки размеров позиций.
Введение волатильности в отслеживании остановки на расстоянии отслеживания на основе колебаний цен.
Развернуть стратегию на других рынках, таких как форекс и криптовалюты.
Разработка количественной торговой системы для автоматизации.
Стратегия дивергентной торговли 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)