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

Автор:Чао Чжан, Дата: 2021-09-21 21:29:22
Тэги:

Обзор

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

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

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

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

Специфические сигналы работы устанавливаются как:

  1. Быстрая линия пересекает над медленной линией снизу, идти долго

  2. Быстрая линия пересекает ниже медленная линия сверху, идти короткий

  3. Прорыв цены ниже линии быстрого выхода, закрытие длинной позиции

  4. Цена выходит выше линии быстрого выхода, снова входит в длинный

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

  • Простой в использовании, нужно только настроить два параметра скользящей средней, легко реализовать

  • Достаточные данные об обратном тестировании, использующие общие показатели для оценки жизнеспособности

  • Многие настраиваемые параметры для оптимизации

  • Принимает линию быстрого выхода как стоп-лосс для лучшего контроля риска

  • Ясная логика стратегии, ясные сигналы покупки и продажи

  • Соответствующая частота операций, избегание чрезмерной торговли

Риски

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

  • Движущиеся средние имеют отстающий характер, могут пропустить повороты

  • Фиксированные параметры не могут адаптироваться к изменениям рынка, необходимо оптимизировать

  • Стоп-лосс может быть слишком мягким, не в состоянии остановить потерю вовремя

  • Частые сигналы могут привести к более высоким торговым затратам

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

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

Улучшение

  • Испытание и оптимизация параметров для лучшего соответствия рыночным условиям

  • Внедрить больше показателей для формирования надежной системы

  • Создание адаптивных параметров на основе рынка в реальном времени

  • Применение моделей машинного обучения для более умной оптимизации

  • Установка динамического или последующего стоп-лосса для лучшего контроля риска

  • Комбинировать показатели объема, чтобы избежать расхождений

Заключение

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


/*backtest
start: 2023-01-01 00:00:00
end: 2023-02-03 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/
// © ehaarjee, ECHKAY, JackBauer007

//@version=4
//study(title="Tale_indicators", overlay=true)
strategy("Tale Indicators Strategy", overlay=true, precision=8, max_bars_back=200, pyramiding=0, initial_capital=20000, commission_type="percent", commission_value=0.1)

len_fast = input(3, minval=1, title="FAST EMA")
src_fast = input(close, title="Source for Fast")
fastMA = ema(src_fast, len_fast)
plot(fastMA, title="Slow EMA", color=color.orange)

len_slow = input(15, minval=1, title="SLOW EMA")
src_slow = input(close, title="Source for Slow")
slowMA = ema(src_slow, len_slow)
plot(slowMA, title="Fast EMA", color=color.blue)

len_fast_exit = input(3, minval=1, title="FAST EMA Exit")
src_fast_exit = input(close, title="Source for Fast Exit")
fastMAE = ema(src_fast_exit, len_fast_exit)
plot(fastMAE, title="Fast EMA Ex", color=color.red)


src_slow_enter_short = input(low, title="Source for Short Entry")
slowMASEn = ema(src_slow_enter_short, len_slow)

src_slow_enter_long = input(high, title="Source for Long Entry")
slowMALEn = ema(src_slow_enter_long, len_slow)

src_slow_exit_short = input(low, title="Source for Short Exit")
slowMASEx = ema(src_slow_enter_short, len_slow)

src_slow_exit_long = input(high, title="Source for Long Exit")
slowMALEx = ema(src_slow_enter_long, len_slow)

enter_long = crossover(fastMA, slowMALEn)
enter_short = crossunder(fastMA, slowMASEn)
exit_long = crossunder(fastMAE, slowMALEx)
exit_short = crossover(fastMAE, slowMALEx)

out_enter = iff(enter_long == true, 1, iff(enter_short == true, -1, 0))
plotarrow(out_enter, "Plot Enter Points", colorup=color.green, colordown=color.red, maxheight = 30)

bull = fastMA > slowMALEn
bear = fastMA < slowMASEn

c = bull ? color.green : bear ? color.red  : color.white
bgcolor(c)

exit_tuner = input(0.005, title="Exit Tuner to touch slowEMA")

bull_exit = (bull and (low>(fastMAE*(1+exit_tuner)))) or exit_long or (not(bear) and (fastMAE>high))
bear_exit = (bear and ((fastMAE*(1-exit_tuner))>high)) or exit_short or (not(bull) and (low>fastMAE))

bull_r = (bull and ((bull_exit[1]) or (bull_exit[2] and bull_exit[1])) and (low<=fastMAE))
bear_r = (bear and ((bear_exit[1]) or (bull_exit[2] and bull_exit[1])) and (fastMAE<=high))

bull_re = (bull and (low<slowMALEn)) and not(enter_long)
bear_re = (bear and (high>slowMASEn)) and not(enter_short)

bull_ree = (bull and ((low<slowMALEn) and not(bull_re[1] or enter_long[1]))) 
bear_ree = (bear and ((high>slowMASEn) and not(bear_re[1] or enter_short[1])))

bull_reenter =  (bull_r) and not(enter_long)
bear_reenter =  (bear_r) and not(enter_short)

plotshape(bull_exit, "Plot Bull Exit", style = shape.arrowdown, color=color.green, size=size.small, text="ExL", location=location.abovebar)
plotshape(bear_exit, "Plot Bear Exit", style = shape.arrowup, color=color.red, size=size.small, text="ExS", location=location.belowbar)

plotshape(bull_reenter, "Plot Bull ReEnter", style = shape.arrowup, color=color.green, size=size.small, text="ReL", location=location.belowbar)
plotshape(bear_reenter, "Plot Bear ReEnter", style = shape.arrowdown, color=color.red, size=size.small, text="ReS", location=location.abovebar)

run_strategy = input(true, title="Run Strategy")
// === INPUT BACKTEST RANGE ===
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 2020, title = "From Year",       type = input.integer, minval = 2000)
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2100, title = "Thru Year",       type = input.integer, minval = 2000)

// === INPUT SHOW PLOT ===
showDate  = input(defval = true, title = "Show Date Range", type = input.bool)
// === FUNCTION EXAMPLE ===
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => true       // create function "within window of time"

var long_position_open = false
var short_position_open = false


if (enter_long and not(bull_exit) and not(long_position_open))
//    strategy.entry("LO", strategy.long, qty=4)
    long_position_open := true
    if (short_position_open)
//        strategy.close("SO")
        short_position_open := false

if (bull_reenter and not(long_position_open))  
//    strategy.entry("LO", strategy.long, qty=1)
    long_position_open := true

if (bull_exit and long_position_open)
//  strategy.close("LO")
    long_position_open := false
    
if (enter_short and not(bear_exit) and not(short_position_open))
//    strategy.entry("SO", strategy.short, qty=4)
    short_position_open := true
    if(long_position_open)
//        strategy.close("LO")
        long_position_open := false

if (bear_reenter and not(short_position_open))  
//    strategy.entry("SO", strategy.long, qty=1)
    long_position_open := true

if (bear_exit and short_position_open)
//    strategy.close("SO")
    short_position_open := false

if(run_strategy)
    strategy.entry("LO", strategy.long, when=(window() and enter_long), qty=4)
    strategy.entry("LO", strategy.long, when=(window() and bull_reenter and not(long_position_open)), qty=1)
    strategy.close("LO", when=(window() and bull_exit and long_position_open))
    strategy.entry("SO", strategy.short, when=(window() and enter_short), qty=4)
    strategy.entry("SO", strategy.short, when=(window() and bear_reenter and not(short_position_open)), qty=1)
    strategy.close("SO", when=(window() and bear_exit and short_position_open))


Больше