Альфа-Тренд пересекающийся период стратегии

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

Обзор

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

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

  1. Расчет показателя ATR для измерения волатильности рынка
  2. Использовать ИРС для определения направления рынка, если нет данных о объеме; использовать МФИ, если имеются данные о объеме
  3. Расчет верхней и нижней полос на основе ATR и направления рынка
  4. Вычислить кривую AlphaTrend, которая включает динамические верхние и нижние полосы
  5. Создание сигналов покупки и продажи при пересечении цены выше или ниже кривой AlphaTrend

Стратегия опирается в основном на кривую AlphaTrend для определения направления ценового тренда. Она учитывает ATR, RSI / MFI и может эффективно отслеживать тенденцию. Когда цена проникает в кривую, она сигнализирует об изменении тренда и формирует точку входа.

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

  1. AlphaTrend объединяет сильные стороны RSI и MFI, приспосабливаясь как к бычьим, так и к медвежьим рынкам
  2. Динамические верхние и нижние диапазоны автоматически корректируются на основе волатильности рынка
  3. Включает как информацию о цене, так и объеме, избегая ложных сигналов
  4. Прорывный подход четко определяет направление тренда
  5. Простая и понятная логика

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

Риски

  1. Кривая AlphaTrend может иметь ложные прорывы, требующие подтверждения от других индикаторов.
  2. Во время консолидации рынка может возникнуть множество ложных сигналов
  3. Неэффективные результаты от плохой настройки параметров
  4. Стоп-лосс может быть сделан во время пиков, при этом возникают большие потери.

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

Возможности для расширения

  1. Испытать различные комбинации параметров для оптимизированных настроек
  2. Включить другие показатели для формирования условий подтверждения
  3. Использование динамического или последующего стоп-лосса для контроля рисков
  4. Торговля в разные временные рамки (5 м, 15 м и т.д.) на основе рыночных условий
  5. Усовершенствовать систему времени входа для более точного входа

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

Заключение

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


/*backtest
start: 2023-09-20 00:00:00
end: 2023-09-26 00:00:00
period: 30m
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/
// author © KivancOzbilgic
// developer © KivancOzbilgic
// pv additions, simplification and strategy conversion @ treigen
//@version=5
strategy('AlphaTrend For ProfitView', overlay=true, calc_on_every_tick=true, process_orders_on_close=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1, initial_capital=1000)
coeff = input.float(1.5, 'Multiplier', step=0.1)
AP = input(15, 'Common Period')
ATR = ta.sma(ta.tr, AP)
novolumedata = input(title='Change calculation (no volume data)?', defval=false)

i_startTime = input(defval = timestamp("01 Jan 2014 00:00 +0000"), title = "Backtesting Start Time", inline="timestart", group='Backtesting')
i_endTime = input(defval = timestamp("01 Jan 2100 23:59 +0000"), title = "Backtesting End Time", inline="timeend", group='Backtesting')
timeCond = true

pv_ex = input.string('', title='Exchange', tooltip='Leave empty to use the chart ticker instead (Warning: May differ from actual market name in some instances)', group='PV Settings')
pv_sym = input.string('', title='Symbol', tooltip='Leave empty to use the chart ticker instead (Warning: May differ from actual market name in some instances)', group='PV Settings')
pv_acc = input.string("", title="Account", group='PV Settings')
pv_alert_long = input.string("", title="PV Alert Name Longs", group='PV Settings')
pv_alert_short = input.string("", title="PV Alert Name Shorts", group='PV Settings')
pv_alert_test = input.bool(false, title="Test Alerts", tooltip="Will immediately execute the alerts, so you may see what it sends. The first line on these test alerts will be excluded from any real alert triggers" ,group='PV Settings')

upT = low - ATR * coeff
downT = high + ATR * coeff
AlphaTrend = 0.0
AlphaTrend := (novolumedata ? ta.rsi(close, AP) >= 50 : ta.mfi(hlc3, AP) >= 50) ? upT < nz(AlphaTrend[1]) ? nz(AlphaTrend[1]) : upT : downT > nz(AlphaTrend[1]) ? nz(AlphaTrend[1]) : downT


k1 = plot(AlphaTrend, color=color.new(#0022FC, 0), linewidth=3)
k2 = plot(AlphaTrend[2], color=color.new(#FC0400, 0), linewidth=3)

buySignalk = ta.crossover(AlphaTrend, AlphaTrend[2])
sellSignalk = ta.crossunder(AlphaTrend, AlphaTrend[2])

var exsym = ""
if barstate.isfirst
    exsym := pv_ex == "" ? "" : "ex=" + pv_ex + ","
    exsym := pv_sym == "" ? exsym : exsym + "sym=" + pv_sym + ","


if barstate.isconfirmed and timeCond 
    if strategy.position_size <= 0 and buySignalk
        strategy.entry("Buy", strategy.long)
        alert(pv_alert_long + "(" + exsym + "acc=" + pv_acc + ")", alert.freq_once_per_bar_close)
    if strategy.position_size >= 0 and sellSignalk
        strategy.entry("Sell", strategy.short)
        alert(pv_alert_short + "(" + exsym + "acc=" + pv_acc + ")", alert.freq_once_per_bar_close)


//  Only used for testing/debugging alert messages
if pv_alert_test
    alert("<![Alert Test]!>\n" + pv_alert_long + "(" + exsym + "acc=" + pv_acc + ")", alert.freq_once_per_bar)
    alert("<![Alert Test]!>\n" + pv_alert_short + "(" + exsym + "acc=" + pv_acc + ")", alert.freq_once_per_bar)


Больше