Стратегия торговли на основе радужной скользящей средней


Дата создания: 2023-09-28 11:01:59 Последнее изменение: 2023-09-28 11:01:59
Копировать: 0 Количество просмотров: 757
1
Подписаться
1617
Подписчики

Обзор

Стратегия Rainbow Moving Average Trading Strategy основана на Rainbow Moving Average Indicator Design. Стратегия определяет направление тренда путем построения Rainbow Moving Average System, содержащего 7 движущихся средних, в сочетании с RSI, фильтрующим ложные сигналы, для обеспечения низкого риска для входа в торговлю.

Стратегический принцип

Стратегия заключается в следующем:

  1. Построение системы радужных скользящих средних. Система содержит 7 скользящих средних, первая из которых имеет 12 циклов, исходные данные - это средняя стоимость закрытия.

  2. Если первая скользящая средняя находится в верхней части радужной скользящей средней, она определяется как тенденция к росту; если она находится в нижней части, она определяется как тенденция к снижению; если она находится в середине, она определяется как сворачивание.

  3. Производит торговый сигнал. Когда тренд в системе движущихся средних радуг переходит от повышения к понижению, генерирует сигнал продажи; когда тренд переходит от понижения к повышению, генерирует сигнал покупки; когда тренд переходит от свертывания к повышению или снижению, устраняет текущую позицию.

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

Стратегические преимущества

Эта стратегия имеет следующие преимущества:

  1. Система движущихся средних радуги позволяет точно определить направление тренда. Несколько комбинаций движущихся средних могут эффективно фильтровать рыночный шум и идентифицировать обратный тренд.

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

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

  4. При активном выравнивании позиций на этапе ликвидации можно избежать риска ликвидации рынка региональным выбором.

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

Стратегический риск

Основные риски этой стратегии:

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

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

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

  4. Параметры могут отфильтровывать часть правильного сигнала или создавать задержку. Параметры должны быть скорректированы в зависимости от особенностей разных сортов.

Направление оптимизации

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

  1. Оптимизация параметров скользящих средних. Можно оптимизировать такие параметры, как продолжительность цикла скользящих средних, соотношение циклической разницы, способ скольжения средних (SMA или EMA), чтобы получить более точные оценки тенденций.

  2. Оптимизация параметров RSI. Можно оптимизировать параметры RSI, такие как длина цикла, зоны перекупа, зоны перепродажи, нейтральные зоны, чтобы сделать фильтрацию более точной и эффективной.

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

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

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

Подвести итог

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

Исходный код стратегии
/*backtest
start: 2023-08-28 00:00:00
end: 2023-09-27 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//╔════════════════════════════════════════════════════════════════════════════╗
//║Rainbow Backtesting base on "Rainbow Moving Average" Strategy as below:     ║
//║1.Rainbow Moving Average setup                                              ║
//║- Source: source of 1st MA                                                  ║
//║- Type: SMA/EMA                                                             ║
//║- Period: period of 1st MA                                                  ║
//║- Displacement: period of 2nd MA to 7th MA with source is previous MA       ║
//║2.Trend Define                                                              ║
//║- Up Trend: Main MA moving at the top of Rainbow                            ║
//║- Down Trend: Main MA moving at the bottom of Rainbow                       ║
//║- Sideway: Main MA moving between the top and the bottom of Rainbow         ║
//║3.Signal                                                                    ║
//║- Buy Signal: When Rainbow change to Up Trend.                              ║
//║- Sell Signal: When Rainbow change to Down Trend.                           ║
//║- Exit: When Rainbow change to Sideway.                                     ║
//║4.RSI Filter                                                                ║
//║- "Enable": Only signals have 1st RSI moving between Overbought and Oversold║
//║and 2nd RSI moving outside Middle Channel are accepted.                     ║
//║- The filter may help trader avoid bull trap, bear trap and choppy market.  ║
//╚════════════════════════════════════════════════════════════════════════════╝

//@version=4
strategy("Rainbow Strategy Backtesting",overlay=false)
//++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++ Rainbow Moving Average +++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++
rainbow_tt="=== Rainbow Moving Average ==="
ma1_source=input(hlc3,title="Source",type=input.source, inline="set1", group=rainbow_tt)
rb_type=input("SMA",title="Type",options=["SMA","EMA"], inline="set1", group=rainbow_tt)
ma1_len=input(12,title="Period", inline="set2", group=rainbow_tt)
dis_len=input(3,title="Displacement", inline="set2", group=rainbow_tt,minval=2)
trend_tt="=== Trend Color ==="
up_col=input(color.new(color.blue,0),title="Up",inline="Color",group=trend_tt)
dn_col=input(color.new(color.red,0),title="Down",inline="Color",group=trend_tt)
sw_col=input(color.new(color.yellow,0),title="No",inline="Color",group=trend_tt)
//1st
ma1=rb_type=="SMA"?sma(ma1_source,ma1_len):ema(ma1_source,ma1_len)
//2nd
ma2=rb_type=="SMA"?sma(ma1,dis_len):ema(ma1,dis_len)
//3rd
ma3=rb_type=="SMA"?sma(ma2,dis_len):ema(ma2,dis_len)
//4
ma4=rb_type=="SMA"?sma(ma3,dis_len):ema(ma3,dis_len)
//5
ma5=rb_type=="SMA"?sma(ma4,dis_len):ema(ma4,dis_len)
//6
ma6=rb_type=="SMA"?sma(ma5,dis_len):ema(ma5,dis_len)
//7
ma7=rb_type=="SMA"?sma(ma6,dis_len):ema(ma6,dis_len)
//MinMax
rb_max=max(ma1,ma2,ma3,ma4,ma5,ma6,ma7)
rb_min=min(ma1,ma2,ma3,ma4,ma5,ma6,ma7)
dir_col=
       ma1==rb_max?up_col:
       ma1==rb_min?dn_col:
       sw_col
dir_style=shape.circle
plotshape(dir_col[1]==dir_col?0:na,title="Trend",style=dir_style,color=dir_col,location=location.absolute)
//++++++++++++++++++++++++++++++++++++++
//+++++++++++++ RSI Filter +++++++++++++
//++++++++++++++++++++++++++++++++++++++
rsi_tt="=== RSI Filter ==="
rsi_filter=input("Enable",title="Filter",options=["Enable","Disable"],inline="set",group=rsi_tt)
over_tt="Over Filter"
rsi_len_1=input(12,title="Period",inline="set",group=over_tt)
rsi_ovb=input(65,title="Overbought",inline="set",group=over_tt)
rsi_ovs=input(35,title="Oversold",inline="set",group=over_tt)
rsi_1=rsi(close,rsi_len_1)
mid_tt="Middle Filter"
rsi_len_2=input(9,title="Period",inline="set",group=mid_tt)
rsi_mid_top=input(56,title="Upper",inline="set",group=mid_tt)
rsi_mid_bot=input(44,title="Lower",inline="set",group=mid_tt)
rsi_2=rsi(close,rsi_len_2)
//Status
var rsi_status="None"
if (rsi_1>rsi_ovs and rsi_1<rsi_ovb) and (rsi_2[1]<rsi_mid_bot or rsi_2[1]>rsi_mid_top)
    rsi_status:="Normal"
else
    rsi_status:="None"
//Signal
BuySignal= 
       rsi_filter=="Disable"?
       dir_col[1]!=up_col
       and
       dir_col[0]==up_col
       :
       dir_col[1]!=up_col
       and
       dir_col[0]==up_col
       and
       rsi_status=="Normal"
       
SellSignal= 
       rsi_filter=="Disable"?
       dir_col[1]!=dn_col
       and
       dir_col[0]==dn_col
       :
       dir_col[1]!=dn_col
       and
       dir_col[0]==dn_col
       and
       rsi_status=="Normal"
       
exit=
       (dir_col[1]!=sw_col
       and
       dir_col[0]==sw_col)
buycol =
       BuySignal?
       up_col: na

sellcol =
       SellSignal?
       dn_col: na

exitcol =
       exit?
       sw_col: na

buy_style=shape.arrowup
sell_style=shape.arrowdown
exit_style=shape.square
plotshape(BuySignal?0:na,title="Buy",text="Buy",style=buy_style,color=buycol,location=location.absolute)
plotshape(SellSignal?0:na,title="Sell",text="Sell",style=sell_style,color=sellcol,location=location.absolute)
plotshape(exit?0:na,title="Exit",text="Exit",style=exit_style,color=exitcol,location=location.absolute)

filter=
       rsi_filter=="Enable"?
       dir_col[1]!=dir_col 
       and BuySignal==false 
       and SellSignal==false 
       and exit==false:
       na
filter_style=shape.xcross
filtercol=
       filter?
       dir_col:na
plotshape(filter?0:na,title="Filter",text="Filter",style=filter_style,color=filtercol,location=location.absolute)

//+++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++ Backtesting ++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++
strategy.entry("Long", strategy.long, when=BuySignal)
strategy.close("Long", when=exit or filter)
strategy.entry("Short", strategy.short, when=SellSignal)
strategy.close("Short", when=exit or filter)
//EOF