Стратегия пересечения скользящих средних Momentum


Дата создания: 2023-09-21 21:29:22 Последнее изменение: 2023-09-21 21:29:22
Копировать: 1 Количество просмотров: 596
1
Подписаться
1617
Подписчики

Обзор

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

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

Стратегия использует две движущиеся средние, одну быструю и одну медленную. Параметры быстрой линии составляют 3-дневную ЭМА, а медленной - 15-дневную ЭМА.

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

Конкретные параметры сигналов управления следующие:

  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))