Ротация импульса в течение временных рамок

Автор:Чао Чжан, Дата: 2023-11-17 17:32:11
Тэги:

img

Обзор

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

Первоначальное понимание

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

В частности, 5-дневная быстрая линия через 20-дневную среднюю линию рассматривается как сигнал короткой линии. 20-дневная медленная линия через 40-дневную среднюю линию рассматривается как сигнал средней линии. Когда быстрая средняя медленная 3-дневная линия правильна ((5-дневная> 20-дневная> 40-дневная), она рассматривается как многоглавный цикл; когда быстрая средняя медленная 3-дневная линия перевернута ((5-дневная < 20-дневная < 40-дневная), она рассматривается как пустой цикл.

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

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

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

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

  • Простая реализация, и для новичков это легко.

  • Высокая эффективность использования капитала, чтобы использовать его как можно больше.

  • Контролируемые риски и эффективные механизмы предотвращения крупных потерь

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

  • Высокие шансы на победу, хорошее качество сигналов, меньше ошибок в работе трассы

Риски и улучшения

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

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

  • Фиксированная величина торможения, оптимизируемая для динамического торможения

  • Можно рассмотреть возможность добавления дополнительных условий фильтрации, таких как энергия объема торговли и т.д.

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

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

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

Обзор

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

Логика торговли

Стратегия использует 5-, 20- и 40-дневные скользящие средние для определения выравнивания тенденций в разные временные рамки.

В частности, пересечение 5-дневного быстрого MA выше 20-дневного среднего MA указывает на восходящий тренд в краткосрочной перспективе. Пересечение 20-дневного среднего MA выше 40-дневного медленного MA сигнализирует о восходящем тренде в среднесрочной перспективе. Когда быстрые, средние и медленные MA положительно выравниваются (5-дневные > 20-дневные > 40-дневные), это бычий цикл. Когда они отрицательно выравниваются (5-дневные < 20-дневные < 40-дневные), это медвежий цикл.

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

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

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

  • Гибкая конфигурация для различных инструментов и стилей торговли

  • Просто внедрить даже для начинающих трейдеров

  • Высокая эффективность капитала для максимального использования заемных средств

  • Эффективное управление рисками для предотвращения значительных потерь

  • Сильная тенденция после устойчивой способности к прибыли

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

Риски и улучшения

  • Кроссоверы MA могут задерживаться и приводить к позднему обнаружению тренда

  • Определение силы одной свечи может вызвать преждевременный вход, расслабление состояния.

  • Фиксированная потеря остановки ATR, оптимизация на динамические остановки

  • Подумайте о добавлении дополнительных фильтров, таких как объем

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

Заключение

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


/*backtest
start: 2023-10-17 00:00:00
end: 2023-11-16 00:00:00
period: 1h
basePeriod: 15m
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/
// © kgynofomo

//@version=5
strategy(title="[Salavi] | Andy Advance Pro Strategy [BTC|M15]",overlay = true, pyramiding = 1,initial_capital = 10000, default_qty_type = strategy.cash,default_qty_value = 10000)

ema_short = ta.ema(close,5)
ema_middle = ta.ema(close,20)
ema_long = ta.ema(close,40)

cycle_1 = ema_short>ema_middle and ema_middle>ema_long
cycle_2 = ema_middle>ema_short and ema_short>ema_long
cycle_3 = ema_middle>ema_long and ema_long>ema_short
cycle_4 = ema_long>ema_middle and ema_middle>ema_short
cycle_5 = ema_long>ema_short and ema_short>ema_middle
cycle_6 = ema_short>ema_long and ema_long>ema_middle

bull_cycle = cycle_1 or cycle_2 or cycle_3
bear_cycle = cycle_4 or cycle_5 or cycle_6
// label.new("cycle_1")
// bgcolor(color=cycle_1?color.rgb(82, 255, 148, 60):na)
// bgcolor(color=cycle_2?color.rgb(82, 255, 148, 70):na)
// bgcolor(color=cycle_3?color.rgb(82, 255, 148, 80):na)
// bgcolor(color=cycle_4?color.rgb(255, 82, 82, 80):na)
// bgcolor(color=cycle_5?color.rgb(255, 82, 82, 70):na)
// bgcolor(color=cycle_6?color.rgb(255, 82, 82, 60):na)

// Inputs
a = input(2, title='Key Vaule. \'This changes the sensitivity\'')
c = input(7, title='ATR Period')
h = false

xATR = ta.atr(c)
nLoss = a * xATR

src = h ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close, lookahead=barmerge.lookahead_off) : close

xATRTrailingStop = 0.0
iff_1 = src > nz(xATRTrailingStop[1], 0) ? src - nLoss : src + nLoss
iff_2 = src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), src + nLoss) : iff_1
xATRTrailingStop := src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), src - nLoss) : iff_2

pos = 0
iff_3 = src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0)
pos := src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0) ? 1 : iff_3

xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue

ema = ta.ema(src, 1)
above = ta.crossover(ema, xATRTrailingStop)
below = ta.crossover(xATRTrailingStop, ema)

buy = src > xATRTrailingStop and above
sell = src < xATRTrailingStop and below

barbuy = src > xATRTrailingStop
barsell = src < xATRTrailingStop




atr = ta.atr(14)
atr_length = input.int(25)
atr_rsi = ta.rsi(atr,atr_length)
atr_valid = atr_rsi>50

long_condition =  buy and bull_cycle and atr_valid
short_condition =  sell and bear_cycle and atr_valid

Exit_long_condition = short_condition
Exit_short_condition = long_condition

if long_condition
    strategy.entry("Andy Buy",strategy.long, limit=close,comment="Andy Buy Here")

if Exit_long_condition
    strategy.close("Andy Buy",comment="Andy Buy Out")
    // strategy.entry("Andy fandan Short",strategy.short, limit=close,comment="Andy 翻單 short Here")
    // strategy.close("Andy fandan Buy",comment="Andy short Out")


if short_condition
    strategy.entry("Andy Short",strategy.short, limit=close,comment="Andy short Here")


// strategy.exit("STR","Long",stop=longstoploss)
if Exit_short_condition
    strategy.close("Andy Short",comment="Andy short Out")
    // strategy.entry("Andy fandan Buy",strategy.long, limit=close,comment="Andy 翻單 Buy Here")
    // strategy.close("Andy fandan Short",comment="Andy Buy Out")




inLongTrade = strategy.position_size > 0
inLongTradecolor = #58D68D
notInTrade = strategy.position_size == 0
inShortTrade = strategy.position_size < 0

// bgcolor(color = inLongTrade?color.rgb(76, 175, 79, 70):inShortTrade?color.rgb(255, 82, 82, 70):na)
plotshape(close!=0,location = location.bottom,color = inLongTrade?color.rgb(76, 175, 79, 70):inShortTrade?color.rgb(255, 82, 82, 70):na)


plotshape(long_condition, title='Buy', text='Andy Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(short_condition, title='Sell', text='Andy Sell', style=shape.labeldown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)


//atr > close *0.01* parameter

// MONTHLY TABLE PERFORMANCE - Developed by @QuantNomad
// *************************************************************************************************************************************************************************************************************************************************************************
show_performance = input.bool(true, 'Show Monthly Performance ?', group='Performance - credits: @QuantNomad')
prec = input(2, 'Return Precision', group='Performance - credits: @QuantNomad')

if show_performance
    new_month = month(time) != month(time[1])
    new_year  = year(time)  != year(time[1])
    
    eq = strategy.equity
    
    bar_pnl = eq / eq[1] - 1
    
    cur_month_pnl = 0.0
    cur_year_pnl  = 0.0
    
    // Current Monthly P&L
    cur_month_pnl := new_month ? 0.0 : 
                     (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1 
    
    // Current Yearly P&L
    cur_year_pnl := new_year ? 0.0 : 
                     (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1  
    
    // Arrays to store Yearly and Monthly P&Ls
    var month_pnl  = array.new_float(0)
    var month_time = array.new_int(0)
    
    var year_pnl  = array.new_float(0)
    var year_time = array.new_int(0)
    
    last_computed = false
    
    if (not na(cur_month_pnl[1]) and (new_month or barstate.islastconfirmedhistory))
        if (last_computed[1])
            array.pop(month_pnl)
            array.pop(month_time)
            
        array.push(month_pnl , cur_month_pnl[1])
        array.push(month_time, time[1])
    
    if (not na(cur_year_pnl[1]) and (new_year or barstate.islastconfirmedhistory))
        if (last_computed[1])
            array.pop(year_pnl)
            array.pop(year_time)
            
        array.push(year_pnl , cur_year_pnl[1])
        array.push(year_time, time[1])
    
    last_computed := barstate.islastconfirmedhistory ? true : nz(last_computed[1])
    
    // Monthly P&L Table    
    var monthly_table = table(na)
    
    if (barstate.islastconfirmedhistory)
        monthly_table := table.new(position.bottom_center, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1)
    
        table.cell(monthly_table, 0,  0, "",     bgcolor = #cccccc)
        table.cell(monthly_table, 1,  0, "Jan",  bgcolor = #cccccc)
        table.cell(monthly_table, 2,  0, "Feb",  bgcolor = #cccccc)
        table.cell(monthly_table, 3,  0, "Mar",  bgcolor = #cccccc)
        table.cell(monthly_table, 4,  0, "Apr",  bgcolor = #cccccc)
        table.cell(monthly_table, 5,  0, "May",  bgcolor = #cccccc)
        table.cell(monthly_table, 6,  0, "Jun",  bgcolor = #cccccc)
        table.cell(monthly_table, 7,  0, "Jul",  bgcolor = #cccccc)
        table.cell(monthly_table, 8,  0, "Aug",  bgcolor = #cccccc)
        table.cell(monthly_table, 9,  0, "Sep",  bgcolor = #cccccc)
        table.cell(monthly_table, 10, 0, "Oct",  bgcolor = #cccccc)
        table.cell(monthly_table, 11, 0, "Nov",  bgcolor = #cccccc)
        table.cell(monthly_table, 12, 0, "Dec",  bgcolor = #cccccc)
        table.cell(monthly_table, 13, 0, "Year", bgcolor = #999999)
    
    
        for yi = 0 to array.size(year_pnl) - 1
            table.cell(monthly_table, 0,  yi + 1, str.tostring(year(array.get(year_time, yi))), bgcolor = #cccccc)
            
            y_color = array.get(year_pnl, yi) > 0 ? color.new(color.teal, transp = 40) : color.new(color.gray, transp = 40)
            table.cell(monthly_table, 13, yi + 1, str.tostring(math.round(array.get(year_pnl, yi) * 100, prec)), bgcolor = y_color, text_color=color.new(color.white, 0))
            
        for mi = 0 to array.size(month_time) - 1
            m_row   = year(array.get(month_time, mi))  - year(array.get(year_time, 0)) + 1
            m_col   = month(array.get(month_time, mi)) 
            m_color = array.get(month_pnl, mi) > 0 ? color.new(color.teal, transp = 40) : color.new(color.gray, transp = 40)
            
            table.cell(monthly_table, m_col, m_row, str.tostring(math.round(array.get(month_pnl, mi) * 100, prec)), bgcolor = m_color, text_color=color.new(color.white, 0))



Больше