Кроссоверная стратегия ALMA

Автор:Чао Чжан, Дата: 2023-09-23 15:11:02
Тэги:

Обзор

Эта стратегия использует две скользящие средние Arnaud Legoux (ALMA), одну быструю и одну медленную, для генерации перекрестных сигналов. ALMA уменьшает задержку и сглаживает линию сигнала по сравнению с традиционными MAs.

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

Основными показателями и правилами являются:

  1. Быстрая АЛМА: более короткий период для обнаружения прорывов.

  2. Медленная ALMA: более длительный период для оценки тенденции.

  3. Фильтр объема: действителен, когда короткая EMA пересекает длинную EMA.

  4. Сигнал покупки: быстрая ALMA пересекает медленную ALMA и проходит через фильтр объема.

  5. Сигнал продажи: быстрая ALMA пересекает медленную ALMA.

  6. Краткий сигнал: быстрая ALMA пересекает медленную ALMA и проходит через фильтр объема.

  7. Сигнал покрытия: быстрая ALMA пересекает медленную ALMA.

Стратегия сочетает в себе анализ тренда, импульса и объема для надежных сигналов.

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

По сравнению с традиционными стратегиями скользящих средних основными преимуществами являются:

  1. ALMA уменьшает задержку и улучшает качество сигнала.

  2. Фильтр объема избегает потерь от ложных прорывов.

  3. Комбинация "быстрый/медленный" измеряет направление тренда.

  4. Простые и интуитивно понятные правила, легко внедряемые.

  5. Гибкая настройка параметров ОД для разных рынков.

  6. Разумное управление рисками.

  7. Дальнейший потенциал оптимизации посредством настройки параметров.

  8. В целом улучшенная стабильность и качество по сравнению с традиционными стратегиями перекрестного использования.

Риски

Несмотря на все преимущества, следует отметить следующие риски:

  1. Системы кроссовера по своей сути уязвимы к випсовам.

  2. Производительность ALMA зависит от настройки параметров.

  3. Увеличение объема может ввести в заблуждение генерацию сигнала.

  4. Некоторые задержки всегда существуют, не может избежать всех потерь.

  5. Риск чрезмерной оптимизации.

  6. Сигналы отключаются, когда громкость нарушается.

  7. Методы машинного обучения могут дать лучшие результаты.

  8. Следите за соотношением доходности и риска, чтобы избежать чрезмерного привлечения средств.

Улучшение

Для устранения рисков можно улучшить следующие области:

  1. Оптимизируйте параметры ALMA для лучшей чувствительности.

  2. Экспериментируйте с различными измерениями объема.

  3. Ввести стоп-лосс для контроля по сделке.

  4. Включить другие индикаторы для надежных сигналов.

  5. Добавьте модуль машинного обучения для более умной настройки сигнала.

  6. Развернуть на нескольких продуктах для диверсификации стратегии.

  7. Оптимизировать модели размещения позиций для различных рынков.

  8. Исследование прочности, чтобы предотвратить переустановку.

Заключение

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


/*backtest
start: 2022-09-16 00:00:00
end: 2023-09-22 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/
// © Sarahann999
// Calculations for TP/SL based off: https://kodify.net/tradingview/orders/percentage-profit/
//@version=5
strategy("ALMA Cross", overlay=true)

//User Inputs
src= (close)
long_entry = input(true, title='Long Entry')
short_entry = input(true, title='Short Entry')

//Fast Settings
ALMA1 = input(100, "ALMA Lenghth 1", group= "ALMA Fast Length Settings")
alma_offset = input.float(defval=0.85, title='Arnaud Legoux (ALMA) - Offset Value', minval=0, step=0.01)
alma_sigma = input.int(defval=6, title='Arnaud Legoux (ALMA) - Sigma Value', minval=0)
Alma1 = ta.alma(src, ALMA1, alma_offset, alma_sigma)

//Slow Settings
ALMA2 = input(120, "ALMA Length 2", group = "ALMA Slow Length Settings")
alma_offset2 = input.float(defval=0.85, title='Arnaud Legoux (ALMA) - Offset Value', minval=0, step=0.01)
alma_sigma2 = input.int(defval=6, title='Arnaud Legoux (ALMA) - Sigma Value', minval=0)
Alma2 = ta.alma(src, ALMA2, alma_offset2, alma_sigma2)

//Volume
var cumVol = 0.
cumVol += nz(volume)
if barstate.islast and cumVol == 0
    runtime.error("No volume is provided by the data vendor.")
shortlen = input.int(5, minval=1, title = "Short Length", group= "Volume Settings")
longlen = input.int(10, minval=1, title = "Long Length")
short = ta.ema(volume, shortlen)
long = ta.ema(volume, longlen)
osc = 100 * (short - long) / long

//Define Cross Conditions
buy = ta.crossover(Alma1, Alma2)
sell = ta.crossunder(Alma1, Alma2)

//Calculate Take Profit Percentage
longProfitPerc = input.float(title="Long Take Profit", group='Take Profit Percentage',
     minval=0.0, step=0.1, defval=2) / 100
shortProfitPerc = input.float(title="Short Take Profit",
     minval=0.0, step=0.1, defval=2) / 100
     
// Figure out take profit price 1
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)
shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc)

// Make inputs that set the stop %  1
longStopPerc = input.float(title="Long Stop Loss", group='Stop Percentage',
     minval=0.0, step=0.1, defval=2.5) / 100
shortStopPerc = input.float(title="Short Stop Loss",
     minval=0.0, step=0.1, defval=2.5) / 100

// Figure Out Stop Price
longStopPrice  = strategy.position_avg_price * (1 - longStopPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortStopPerc)

//Define Conditions
buySignal = buy and osc > 0
     and strategy.position_size == 0

//sellSignal 
sellSignal = sell and osc > 0
     and strategy.position_size == 0

// Submit entry orders
if buySignal and long_entry
    strategy.entry(id="Long", direction=strategy.long, alert_message="Enter Long")
    alert(message="BUY Trade Entry Alert", freq=alert.freq_once_per_bar)
    
if sellSignal and short_entry
    strategy.entry(id="Short", direction=strategy.short, alert_message="Enter Short")
    alert(message="SELL Trade Entry Alert", freq=alert.freq_once_per_bar)
    
// Submit exit orders based on take profit price
if (strategy.position_size > 0)
    strategy.exit(id="Long TP/SL", limit=longExitPrice, stop=longStopPrice, alert_message="Long Exit 1 at {{close}}")
if (strategy.position_size < 0)
    strategy.exit(id="Short TP/SL", limit=shortExitPrice, stop=shortStopPrice, alert_message="Short Exit 1 at {{close}}")

//Draw
plot(Alma1,"Alma Fast", color=color.purple, style=plot.style_circles)
plot(Alma2,"Alma Slow", color=#acb5c2, style=plot.style_circles)

Больше