Эта стратегия рассчитывает три группы индикаторов RSI с различными параметрами и их соответствующими шестью скользящими средними линиями для формирования трех скользящих средних полос и оценивает направление рыночной тенденции для долгосрочных операций.
Вычислить три группы индикаторов RSI: быстрый период RSI = 50, нормальный период RSI = 75, медленный период RSI = 100.
Для каждой группы индикаторов RSI вычисляют 5, 30, 50, 70, 90, 100 периодов простых или экспоненциальных скользящих средних соответственно для формирования скользящих средних полос.
Когда все линии быстрого скользящего среднего показателя RSI поднимаются, это рассматривается как длинный сигнал; когда все линии быстрого скользящего среднего показателя RSI снижаются, это рассматривается как короткий сигнал.
Торговые сигналы, даваемые скользящими средними диапазонами, соответствующими нормальному и медленному RSI, одинаковы.
В течение данного периода времени торговли, при появлении сигнала покупки, займите длинную позицию на 100%; закрыть предыдущую длинную позицию при появлении сигнала продажи.
Стратегия сочетает в себе преимущества индикаторов RSI и скользящих средних. Она использует три группы RSI с различными параметрами, чтобы фиксировать изменения тренда на разных уровнях цикла. В то же время она использует шесть скользящих средних линий, чтобы отфильтровать шум и улучшить надежность сигнала.
По сравнению с одним RSI и скользящей средней, эта комбинация формирует основу для суждения с использованием систематического метода, не полагаясь на оптимизацию параметров.
Стратегия сочетания скользящих средних показателей RSI основана на параметровых настройках. Если параметры установлены неправильно, могут возникнуть неправильные сигналы. Кроме того, колебания на быстрых рынках также могут вызвать ложные сигналы.
Для уменьшения риска ложных сигналов параметры цикла RSI должны быть соответствующим образом скорректированы, или число циклов скользящей средней следует скорректировать, чтобы найти оптимальную комбинацию параметров.
Стратегия может быть дополнительно оптимизирована в следующих аспектах:
Добавьте логику стоп-лосса. Нынешняя стратегия не устанавливает стоп-лосс, на который легко влияют резкие колебания рынка.
Оптимизируйте параметры. Можно протестировать больше комбинаций, чтобы найти лучшие параметры.
Для подтверждения сигналов могут быть введены другие индикаторы, такие как MACD и Bollinger Bands.
Избегайте ложных сигналов в течение ненормальных периодов времени и громкости.
Стратегия трех скользящих средних полос RSI объединяет преимущества нескольких индикаторов и формирует торговые сигналы с помощью строгих логических суждений для определения долгосрочных тенденций. Стратегия отличается простотой, легкостью понимания и подходит для изучения и практики торговых стратегий скользящих средних полос. С постоянной оптимизацией параметров и комбинаций, эффект стратегии, как ожидается, будет еще лучше.
/*backtest start: 2024-01-21 00:00:00 end: 2024-02-20 00:00:00 period: 1h 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/ // © exlux99 //@version=4 strategy(title="3 RSI MA movement crypto strategy", overlay=true, initial_capital = 100, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.03, pyramiding=1 ) /////////////// fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) fromYear = input(defval = 2019, title = "From Year", minval = 1970) //monday and session // To Date Inputs toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31) toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12) toYear = input(defval = 2021, title = "To Year", minval = 1970) startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00) finishDate = timestamp(toYear, toMonth, toDay, 00, 00) time_cond = true source = input(ohlc4) RSIFast = rsi(source, 50) RSINorm = rsi(source, 75) RSISlow = rsi(source, 100) // plot(RSIFast, color=color.silver, style=plot.style_area, histbase=50) // plot(RSINorm, color=#98b8be, style=plot.style_area, histbase=50) // plot(RSISlow, color=#be9e98, style=plot.style_area, histbase=50) // plot(RSIFast, color=color.gray, style=plot.style_line, linewidth=1) // plot(RSINorm, color=color.purple, style=plot.style_line, linewidth=2) // plot(RSISlow, color=color.black, style=plot.style_line, linewidth=3) exponential = false//input(false, title="Exponential MA") src = (RSIFast) ma05 = exponential ? ema(src, 05) : sma(src, 05) ma30 = exponential ? ema(src, 30) : sma(src, 30) ma50 = exponential ? ema(src, 50) : sma(src, 50) ma70 = exponential ? ema(src, 70) : sma(src, 70) ma90 = exponential ? ema(src, 90) : sma(src, 90) ma100 = exponential ? ema(src, 100) : sma(src, 100) leadMAColor = change(ma30)>=0 and ma30>ma100 ? color.lime : change(ma30)<0 and ma30>ma100 ? color.red : change(ma30)<=0 and ma30<ma100 ? color.maroon : change(ma30)>=0 and ma30<ma100 ? color.green : color.gray maColor(ma, maRef) => change(ma)>=0 and ma30>maRef ? color.lime : change(ma)<0 and ma30>maRef ? color.red : change(ma)<=0 and ma30<maRef ? color.maroon : change(ma)>=0 and ma30<maRef ? color.green : color.gray // plot( ma30, color=maColor(ma30,ma100), style=plot.style_line, title="MMA30", linewidth=2) // plot( ma50, color=maColor(ma50,ma100), style=plot.style_line, title="MMA50", linewidth=2) // plot( ma70, color=maColor(ma70,ma100), style=plot.style_line, title="MMA70", linewidth=2) // plot( ma90, color=maColor(ma90,ma100), style=plot.style_line, title="MMA90", linewidth=2) long0=(leadMAColor==color.lime and maColor(ma30,ma100)==color.lime and maColor(ma50,ma100)==color.lime and maColor(ma70,ma100)==color.lime and maColor(ma90,ma100)==color.lime ) or (leadMAColor==color.green and maColor(ma30,ma100)==color.green and maColor(ma50,ma100)==color.green and maColor(ma70,ma100)==color.green and maColor(ma90,ma100)==color.green ) exit0=leadMAColor==color.maroon and maColor(ma30,ma100)==color.maroon and maColor(ma50,ma100)==color.maroon and maColor(ma70,ma100)==color.maroon and maColor(ma90,ma100)==color.maroon exponential1 = false//input(false, title="Exponential MA") src1 = (RSINorm) ma051 = exponential1 ? ema(src1, 05) : sma(src1, 05) ma301 = exponential1 ? ema(src1, 30) : sma(src1, 30) ma501 = exponential1 ? ema(src1, 50) : sma(src1, 50) ma701 = exponential1 ? ema(src1, 70) : sma(src1, 70) ma901 = exponential1 ? ema(src1, 90) : sma(src1, 90) ma1001 = exponential1 ? ema(src1, 100) : sma(src1, 100) leadMAColor1 = change(ma051)>=0 and ma051>ma1001 ? color.lime : change(ma051)<0 and ma051>ma1001 ? color.red : change(ma051)<=0 and ma051<ma1001 ? color.maroon : change(ma051)>=0 and ma051<ma1001 ? color.green : color.gray maColor1(ma, maRef) => change(ma)>=0 and ma05>maRef ? color.lime : change(ma)<0 and ma05>maRef ? color.red : change(ma)<=0 and ma05<maRef ? color.maroon : change(ma)>=0 and ma05<maRef ? color.green : color.gray // plot( ma051, color=leadMAColor1, style=plot.style_line, title="MMA05", linewidth=1) // plot( ma301, color=maColor1(ma301,ma1001), style=plot.style_line, title="MMA30", linewidth=3) // plot( ma501, color=maColor1(ma501,ma1001), style=plot.style_line, title="MMA50", linewidth=3) // plot( ma701, color=maColor1(ma701,ma1001), style=plot.style_line, title="MMA70", linewidth=3) // plot( ma901, color=maColor1(ma901,ma1001), style=plot.style_line, title="MMA90", linewidth=3) long1=(leadMAColor1==color.lime and maColor1(ma301,ma1001)==color.lime and maColor1(ma501,ma1001)==color.lime and maColor1(ma701,ma1001)==color.lime and maColor1(ma901,ma1001)==color.lime ) or (leadMAColor1==color.green and maColor1(ma301,ma1001)==color.green and maColor1(ma501,ma1001)==color.green and maColor1(ma701,ma1001)==color.green and maColor1(ma901,ma100)==color.green ) exit1=leadMAColor1==color.maroon and maColor1(ma301,ma1001)==color.maroon and maColor1(ma501,ma1001)==color.maroon and maColor1(ma701,ma1001)==color.maroon and maColor1(ma901,ma1001)==color.maroon exponential2 = false//input(false, title="Exponential MA") src2 = (RSISlow) ma052 = exponential2 ? ema(src2, 05) : sma(src2, 05) ma302 = exponential2 ? ema(src2, 30) : sma(src2, 30) ma502 = exponential2 ? ema(src2, 50) : sma(src2, 50) ma702 = exponential2 ? ema(src2, 70) : sma(src2, 70) ma902 = exponential2 ? ema(src2, 90) : sma(src2, 90) ma1002 = exponential2 ? ema(src2, 100) : sma(src2, 100) leadMAColor2 = change(ma052)>=0 and ma052>ma1002 ? color.lime : change(ma052)<0 and ma052>ma1002 ? color.red : change(ma052)<=0 and ma052<ma1002 ? color.maroon : change(ma052)>=0 and ma052<ma1002 ? color.green : color.gray maColor2(ma, maRef) => change(ma)>=0 and ma05>maRef ? color.lime : change(ma)<0 and ma05>maRef ? color.red : change(ma)<=0 and ma05<maRef ? color.maroon : change(ma)>=0 and ma05<maRef ? color.green : color.gray // plot( ma052, color=leadMAColor2, style=plot.style_line, title="MMA05", linewidth=1) // plot( ma302, color=maColor2(ma302,ma1001), style=plot.style_line, title="MMA30", linewidth=4) // plot( ma502, color=maColor2(ma502,ma1001), style=plot.style_line, title="MMA50", linewidth=4) // plot( ma702, color=maColor2(ma701,ma1001), style=plot.style_line, title="MMA70", linewidth=4) // plot( ma902, color=maColor2(ma901,ma1001), style=plot.style_line, title="MMA90", linewidth=4) long2=(leadMAColor2==color.lime and maColor2(ma302,ma1002)==color.lime and maColor2(ma502,ma1002)==color.lime and maColor2(ma702,ma1002)==color.lime and maColor2(ma902,ma1002)==color.lime ) or (leadMAColor2==color.green and maColor2(ma302,ma1002)==color.green and maColor2(ma502,ma1002)==color.green and maColor2(ma701,ma1002)==color.green and maColor2(ma901,ma1002)==color.green ) exit2=leadMAColor2==color.maroon and maColor2(ma302,ma1002)==color.maroon and maColor2(ma502,ma1002)==color.maroon and maColor2(ma702,ma1002)==color.maroon and maColor2(ma902,ma1002)==color.maroon long= long1 or long2 exit= exit1 or exit2 // ------------------------- Strategy Logic --------------------------------- // var longOpened = false var shortOpened = false var int timeOfBuy = na longConditionLongOnly= long and not longOpened if longConditionLongOnly longOpened := true timeOfBuy := time longExitSignal = exit exitLongConditionLongOnly = longOpened[1] and longExitSignal if exitLongConditionLongOnly longOpened := false timeOfBuy := na //plotshape(longConditionLongOnly, color=color.green, text= "Buy", location= location.belowbar,style= shape.labelup, textcolor=color.white, size = size.tiny, title="Buy Alert",editable=false, transp=60) //plotshape(exitLongConditionLongOnly, color=color.red, text= "exit", location= location.abovebar,style= shape.labeldown, textcolor=color.white, size = size.tiny, title="Sell Alert", editable=false, transp=60) //alertcondition(longConditionLongOnly ,title='Buy Alert', message='Buy Alert') //alertcondition(exitLongConditionLongOnly , title='exit Alert', message='exit Alert') if(time_cond) strategy.entry("long",1,when=longConditionLongOnly) strategy.entry("short",0,when=exitLongConditionLongOnly)