Стратегия отскока экспоненциальной скользящей средней

Автор:Чао Чжан, Дата: 2023-12-08 16:47:39
Тэги:

img

Обзор стратегии

Экспоненциальная скользящая средняя (EMA) стратегия отскока - это стратегия, которая отслеживает прорыв цен на линии скользящей средней. Она проверяет, отскакивают ли свечи от нижней линии скользящей средней. Если это так, это бычий сигнал; если свеча отскакивает вниз от верхней линии скользящей средней, это медвежий сигнал.

Наименование стратегии

Стратегия отскока экспоненциальной скользящей средней

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

Эта стратегия основана на экспоненциальной скользящей средней (EMA) линии. Она рассчитывает линию EMA в реальном времени. Затем она проверяет, отскакивает ли цена обратно от линии EMA:

  • Если цена сначала прорвется через линию EMA, а затем отскочит обратно выше линии EMA, это бычий сигнал.
  • Если цена сначала пробивается через линию EMA, а затем опять опускается ниже линии EMA, это медвежий сигнал.

Такой отскок является сигналом входа в стратегию.

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

Торгуйте с трендом, избегайте ловушки

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

Небольшие вычеты, хорошая историческая доходность

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

Легко понять, гибкая настройка параметров

Стратегия отскока EMA опирается просто на скользящие средние, что легко понять для новичков.

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

Склонность к ложным сигналам

Часто возникают плотные ложные прорывы вокруг линии EMA, что может вызвать неправильные сигналы.

Торговля с тенденцией, не в состоянии предсказать поворотные моменты

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

Стоп-лосс с вероятностью выбытия

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

Оптимизация

Включить другие индикаторы для фильтрации сигнала

Индикаторы, такие как RSI и MACD, могут быть добавлены, чтобы подтвердить изменение цены и отфильтровать ложные сигналы.

Оптимизировать методы стоп-лосса

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

Оптимизация параметров

Оптимизируйте параметры EMA периода, чтобы найти лучшие комбинации параметров.

Заключение

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


/*backtest
start: 2022-12-01 00:00:00
end: 2023-12-07 00:00:00
period: 1d
basePeriod: 1h
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/
// © tweakerID

// Simple strategy that checks for price bounces over an Exponential Moving Average. If the CLOSE of the candle bounces
// back from having it's LOW below the EMA, then it's a Bull Bounce. If the CLOSE of the candle bounces down from having it's
// high above the EMA, then it's a Bear Bounce. This logic can be reverted.

//@version=4
strategy("EMA Bounce", overlay=true, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, 
     initial_capital=10000, 
     commission_value=0.04, 
     calc_on_every_tick=false, 
     slippage=0)

direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

/////////////////////// STRATEGY INPUTS ////////////////////////////////////////
title1=input(true, "-----------------Strategy Inputs-------------------")  

i_EMA=input(20, title="EMA Length")

/////////////////////// BACKTESTER /////////////////////////////////////////////
title2=input(true, "-----------------General Inputs-------------------")  

// Backtester General Inputs
i_SL=input(true, title="Use Swing Stop Loss and Take Profit")
i_SPL=input(defval=10, title="Swing Point Loopback")
i_PercIncrement=input(defval=.2, step=.1, title="Swing Point SL Perc Increment")*0.01
i_TPRRR = input(1.2, step=.1, title="Take Profit Risk Reward Ratio")

// Bought and Sold Boolean Signal
bought = strategy.position_size > strategy.position_size[1] 
 or strategy.position_size < strategy.position_size[1]

// Price Action Stop and Take Profit
LL=(lowest(i_SPL))*(1-i_PercIncrement)
HH=(highest(i_SPL))*(1+i_PercIncrement)
LL_price = valuewhen(bought, LL, 0)
HH_price = valuewhen(bought, HH, 0)
entry_LL_price = strategy.position_size > 0 ? LL_price : na 
entry_HH_price = strategy.position_size < 0 ? HH_price : na 
tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR
stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR


/////////////////////// STRATEGY LOGIC /////////////////////////////////////////

EMA=ema(close, i_EMA)
LowAboveEMA=low > EMA
LowBelowEMA=low < EMA
HighAboveEMA=high > EMA
HighBelowEMA=high < EMA
BullBounce=LowAboveEMA[1] and LowBelowEMA and close > EMA //and close > open
BearBounce=HighBelowEMA[1] and HighAboveEMA and close < EMA //and close < open
plot(EMA)

BUY=BullBounce
SELL=BearBounce

//Inputs
DPR=input(false, "Allow Direct Position Reverse")
reverse=input(false, "Reverse Trades")

// Entries
if reverse
    if not DPR
        strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0)
    else     
        strategy.entry("long", strategy.long, when=SELL)
        strategy.entry("short", strategy.short, when=BUY)
else
    if not DPR 
        strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0)
    else
        strategy.entry("long", strategy.long, when=BUY)
        strategy.entry("short", strategy.short, when=SELL)


SL=entry_LL_price
SSL=entry_HH_price
TP=tp
STP=stp

strategy.exit("TP & SL", "long", limit=TP, stop=SL, when=i_SL)
strategy.exit("TP & SL", "short", limit=STP, stop=SSL, when=i_SL)

/////////////////////// PLOTS //////////////////////////////////////////////////

plot(strategy.position_size > 0 ? SL : na , title='SL', style=plot.style_cross, color=color.red)
plot(strategy.position_size < 0 ? SSL : na , title='SSL', style=plot.style_cross, color=color.red)
plot(strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green)
plot(strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green)
// Draw price action setup arrows
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, 
 color=color.green, title="Bullish Setup", transp=80, size=size.auto)
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, 
 color=color.red, title="Bearish Setup", transp=80, size=size.auto)


Больше