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

Автор:Чао Чжан, Дата: 2023-09-28 11:01:59
Тэги:

Обзор

Стратегия торговли радужной скользящей средней разработана на основе индикатора радужной скользящей средней. Эта стратегия определяет направление тренда через систему радужной скользящей средней с 7 скользящими средними и фильтрует ложные сигналы с помощью индикатора RSI для достижения низкорискового входа.

Логика стратегии

Стратегия генерирует торговые сигналы через следующие этапы:

  1. Создать систему радужной скользящей средней. Она содержит 7 скользящих средних. Первая скользящая средняя имеет период 12 и принимает цену закрытия в качестве источника данных. Остальные 6 скользящих средних имеют прогрессивно уменьшающиеся периоды 3, с предыдущей скользящей средней в качестве источника.

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

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

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

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

Преимущества этой стратегии включают:

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

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

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

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

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

Риски

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

  1. Неясное изменение тренда может вызвать ложные сигналы и привести к потерям.

  2. Частое открытие и закрытие во время длительной консолидации увеличивает затраты и скольжение.

  3. Задержка реверсии увеличивает потери после первоначального сигнала.

  4. Неправильные параметры могут отфильтровывать правильные сигналы или вызывать задержку сигнала.

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

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

  1. Оптимизация параметров скользящей средней, включая длину периода, соотношение периода, тип MA и т.д., чтобы сделать более точные оценки тренда.

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

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

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

  5. Добавление стоп-лосса и прибыли для контроля риска и размера прибыли.

Заключение

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


/*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

Больше