Стратегия торговли биткойнами на основе RVI и EMA

Автор:Чао Чжан, Дата: 2024-02-22 13:50:17
Тэги:

img

Обзор

Эта стратегия основана на показателях RVI (Relative Vigor Index) и EMA (Exponential Moving Average). Она длится, когда RVI дает сигнал входа, а быстрая EMA находится выше медленной EMA, и становится короткой, когда RVI дает сигнал входа, а медленная EMA находится выше быстрой EMA, реализуя количественную торговую стратегию, основанную на тренде и условиях перекупки-перепродажи.

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

  1. Используйте RVI, чтобы судить о условиях перекупления и перепродажи. Когда линия индикатора RVI пересекает линию своего сигнала, это сигнал о перекуплении, чтобы пойти длинным. Когда линия RVI пересекает линию своего сигнала, это сигнал о перепродаже, чтобы пойти коротким.

  2. Используйте двойные EMA для определения направления тренда. Когда быстрая EMA выше медленной EMA, это быстрый тренд. Когда медленная EMA выше быстрой EMA, это медленная тенденция.

  3. Продолжайте продавать только тогда, когда RVI дает сигнал о входе, а EMA показывает рост, а затем продолжайте продавать только тогда, когда RVI дает сигнал о входе, а EMA показывает спад.

  4. Стоп-лосс после длинного хода устанавливается ниже недавнего минимума на расстояние AtrAtrSL, а прибыль от продажи установлена выше недавнего максимума на расстояние от atrСтоп-лосс после короткого выхода устанавливается выше недавнего максимума на расстояние отАТРSL, а прибыль от продажи была установлена ниже недавнего минимума на расстояние отatrTP.

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

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

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

  3. Уравняет качество тренда и уровни перекупленности/перепроданности, улучшая точность сигнала.

  4. Обширные обратные тесты, оптимизированные параметры, хорошие реальные торговые показатели.

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

  1. Частые изменения тренда, которые оцениваются EMA на рыночных рынках, могут привести к переоценке.

  2. Параметры RVI и периоды EMA должны быть оптимизированы для различных торговых инструментов, в противном случае производительность может пострадать.

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

Руководство по оптимизации

  1. Можно добавить больше индикаторов, оценивающих качество тренда, таких как осцилляторы, полосы Боллинджера и т. д., чтобы сделать торговые решения более точными.

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

  3. Комбинации параметров могут быть проверены и оптимизированы отдельно для различных инструментов для повышения надежности стратегии.

Заключение

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


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

//this strategy works well on h4 (btc or eth)


//@version=5
strategy(title="Relative Vigor Index", shorttitle="RVGI",overlay=true)
//indicator(title="Relative Vigor Index", shorttitle="RVGI", format=format.price, precision=4, timeframe="", timeframe_gaps=true)
len = input.int(4, title="Length rvi", minval=1)
rvi = math.sum(ta.swma(close-open), len)/math.sum(ta.swma(high-low),len)
sig = ta.swma(rvi)
offset = input.int(0, "Offset rvi", minval = -500, maxval = 500)


atrlength = input.int(19,title="Atr Length",minval=1)
ema1 =  input.int(95,title="Long EMA rapida",minval=1,step=10)
ema2 =  input.int(200,title="Long EMA lenta",minval=1,step=10)

atrSL = input.float(2.0,title="Atr SL", step=0.1)
atrTP = input.float(1.0,title="Atr TP", step=0.1)

atr = ta.atr(atrlength)
esalcista = low > ta.ema(close,ema1) and ta.ema(close,ema1) > ta.ema(close,ema2)
bajista = high < ta.ema(close,ema1) and ta.ema(close,ema1) < ta.ema(close,ema2)


//plot(high + atr)
//plot(low - atr)

//strategy.entry("compra",strategy.long, when=ta.crossover(rvi,sig))
//strategy.close("compra",when=ta.crossunder(rvi,sig))

//plot(rvi, color=#008000, title="RVGI", offset = offset)
//plot(sig, color=#FF0000, title="Signal", offset = offset)
//plotshape(true,style=shape.xcross)

var TP = 0.0
var SL = 0.0

comprado = strategy.position_size>0
vendido = strategy.position_size<0

crucepositivo = ta.crossover(rvi,sig)
crucenegativo = ta.crossunder(rvi,sig)

if comprado
    // ver SL
    if low < SL
        strategy.close("BUY",comment="SL")
        
        
if comprado    
    //ver tp
    if high > TP
        strategy.close("BUY",comment="TP")
        
       
    
    
    
if not comprado and not vendido
    if crucepositivo and esalcista
        strategy.entry("BUY",strategy.long)
        SL := low - (atr * atrSL)
        TP := high + (atr * atrTP)
        alert("BUY",alert.freq_once_per_bar)



//---------------

if vendido
    // ver SL
    if high > SL
        strategy.close("SELL",comment="SL")
        
        
if vendido    
    //ver tp
    if low < TP
        strategy.close("SELL",comment="TP")
        
       

if not vendido and not comprado
    if crucenegativo and bajista
        strategy.entry("SELL",strategy.short)
        SL := high + (atr * atrSL)
        TP := low - (atr * atrTP)
        alert("SELL",alert.freq_once_per_bar)







//----------------

//plotshape(comprado,style=shape.xcross)
plot( comprado ? SL : na, color=color.red,style=plot.style_circles)
plot( comprado ? TP : na, color=color.blue,style=plot.style_circles)

plot( ta.ema(close,ema1),color=color.orange)
plot( ta.ema(close,ema2),color=color.yellow)


plot( vendido ? SL : na, color=color.red,style=plot.style_circles)
plot( vendido ? TP : na, color=color.blue,style=plot.style_circles)


Больше