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

Автор:Чао Чжан, Дата: 2024-01-16 18:18:02
Тэги:

img

Обзор

Треугольная скользящая средняя (TMA) - типичная стратегия технического анализа. Она использует три скользящих средних линии различной продолжительности времени для улавливания тенденций и реализации низкорисковой торговли. Когда краткосрочная скользящая средняя пересекает среднюю скользящую среднюю вверх, а средняя скользящая средняя выше долгосрочной скользящей средней, генерируется сигнал покупки. Когда краткосрочная скользящая средняя пересекает ниже средней скользящей средней вниз, а средняя скользящая средняя на среднесрочной основе ниже долгосрочной скользящей средней, генерируется сигнал продажи.

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

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

Когда краткосрочная скользящая средняя пересекает среднюю скользящую среднюю вверх, это указывает на то, что цена начала расти. В это время, если средняя скользящая средняя выше долгосрочной скользящей средней, это означает, что текущий рынок находится в восходящем тренде. Поэтому здесь генерируется сигнал покупки.

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

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

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

  • Используйте три скользящих средних вместе, чтобы улучшить точность суждения
  • Установка стоп-лосса и прибыли для эффективного контроля риска по сделке
  • Настраиваемые параметры скользящей средней, подходящие для различных продуктов
  • Семь вариантов для типов скользящих средних, диверсифицированных типов стратегий

Анализ рисков и решения

  • Ошибочные сигналы при консолидации трех МА

    Решение: правильное регулирование параметров MA, чтобы избежать ошибочных сигналов

  • Процент чрезмерно агрессивных стоп-потерь/прибыли

    Решение: тонко настроенные проценты; не могут быть слишком большими или слишком малыми

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

    Решение: Испытайте различные комбинации параметров, чтобы найти оптимальный

Руководство по оптимизации

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

  • Испытать различные комбинации типа и длины, чтобы найти оптимальный

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

  • Добавление других технических показателей в качестве сигнальных фильтров

    Добавить такие показатели, как KDJ, MACD и т.д. для многофакторной проверки

  • Выбор параметров на основе характеристик продукта

    Сокращение периодов СО для летучих продуктов; Удлинение периодов для стабильных продуктов

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

    Автоматическое промывание параметров для быстрого нахождения оптимального

Заключение

Стратегия TMA Crossover - это простая в использовании стратегия, следующая за тенденциями в целом. Она использует три MA вместе, чтобы улавливать тенденции и устанавливать стоп-лосс / take-прибыль для контроля рисков, обеспечивая стабильную прибыль. Дальнейшие улучшения могут быть достигнуты путем оптимизации параметров и интеграции дополнительных технических индикаторов. В заключение, эта стратегия подходит для инвесторов, стремящихся к устойчивым прибылям.


/*backtest
start: 2024-01-08 00:00:00
end: 2024-01-15 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Kozlod - 3 MA strategy with SL/PT", shorttitle="kozlod_3ma", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 5)

// 
// author: Kozlod
// date: 2018-03-25
// 

////////////
// INPUTS //
////////////

ma_type        = input(title = "MA Type",            defval = "SMA", options = ['SMA', 'EMA', 'WMA', 'VWMA', 'HMA', 'SMMA', 'DEMA'])
short_ma_len   = input(title = "Short MA Length",    defval = 5,     minval = 1)
short_ma_src   = input(title = "Short MA Source",    defval = close)
medium_ma_len  = input(title = "Medium MA Length",   defval = 20,    minval = 2)
medium_ma_src  = input(title = "Medium MA Source",   defval = close)
long_ma_len    = input(title = "Long MA Length",     defval = 100,   minval = 3)
long_ma_src    = input(title = "Long MA Source",     defval = close)

sl_lev_perc    = input(title = "SL Level % (0 - Off)", type = float,   defval = 0,  minval = 0, step = 0.01)
pt_lev_perc    = input(title = "PT Level % (0 - Off)", type = float,   defval = 0,  minval = 0, step = 0.01)

// Set initial values to 0
short_ma  = 0.0
long_ma   = 0.0
medium_ma = 0.0

// Simple Moving Average (SMA)
if ma_type == 'SMA' 
    short_ma  := sma(short_ma_src,  short_ma_len)
    medium_ma := sma(medium_ma_src, medium_ma_len)
    long_ma   := sma(long_ma_src,   long_ma_len)

// Exponential Moving Average (EMA)
if ma_type == 'EMA'
    short_ma  := ema(short_ma_src,  short_ma_len)
    medium_ma := ema(medium_ma_src, medium_ma_len)
    long_ma   := ema(long_ma_src,   long_ma_len)

// Weighted Moving Average (WMA)
if ma_type == 'WMA'
    short_ma  := wma(short_ma_src,  short_ma_len)
    medium_ma := wma(medium_ma_src, medium_ma_len)
    long_ma   := wma(long_ma_src,   long_ma_len)

// Hull Moving Average (HMA)
if ma_type == 'HMA'
    short_ma  := wma(2*wma(short_ma_src,  short_ma_len  / 2) - wma(short_ma_src,  short_ma_len),  round(sqrt(short_ma_len)))
    medium_ma := wma(2*wma(medium_ma_src, medium_ma_len / 2) - wma(medium_ma_src, medium_ma_len), round(sqrt(medium_ma_len)))
    long_ma   := wma(2*wma(long_ma_src,   long_ma_len   / 2) - wma(long_ma_src,   long_ma_len),   round(sqrt(long_ma_len)))

// Volume-weighted Moving Average (VWMA)
if ma_type == 'VWMA'
    short_ma  := vwma(short_ma_src,  short_ma_len)
    medium_ma := vwma(medium_ma_src, medium_ma_len)
    long_ma   := vwma(long_ma_src,   long_ma_len)

// Smoothed Moving Average (SMMA)    
if ma_type == 'SMMA'
    short_ma  := na(short_ma[1])  ? sma(short_ma_src, short_ma_len)   : (short_ma[1]  * (short_ma_len  - 1) + short_ma_src)  / short_ma_len
    medium_ma := na(medium_ma[1]) ? sma(medium_ma_src, medium_ma_len) : (medium_ma[1] * (medium_ma_len - 1) + medium_ma_src) / medium_ma_len
    long_ma   := na(long_ma[1])   ? sma(long_ma_src,  long_ma_len)    : (long_ma[1]   * (long_ma_len   - 1) + long_ma_src)   / long_ma_len

// Double Exponential Moving Average (DEMA)
if ma_type == 'DEMA'
    e1_short  = ema(short_ma_src , short_ma_len)
    e1_medium = ema(medium_ma_src, medium_ma_len)
    e1_long   = ema(long_ma_src,   long_ma_len)
    
    short_ma  := 2 * e1_short  - ema(e1_short,  short_ma_len)
    medium_ma := 2 * e1_medium - ema(e1_medium, medium_ma_len)
    long_ma   := 2 * e1_long   - ema(e1_long,   long_ma_len)

/////////////
// SIGNALS //
/////////////

long_signal  = crossover( short_ma, medium_ma) and medium_ma > long_ma
short_signal = crossunder(short_ma, medium_ma) and medium_ma < long_ma

// Calculate PT/SL levels 
// Initial values 
last_signal    = 0
prev_tr_price  = 0.0
pt_level       = 0.0
sl_level       = 0.0

// Calculate previous trade price
prev_tr_price := (long_signal[1] and nz(last_signal[2]) != 1) or (short_signal[1] and nz(last_signal[2]) != -1) ? open : nz(last_signal[1]) != 0 ? prev_tr_price[1] : na

// Calculate SL/PT levels 
pt_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 + pt_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 - pt_lev_perc / 100)  : na
sl_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 - sl_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 + sl_lev_perc / 100)  : na

// Calculate if price hit sl/pt 
long_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) ==  1 and close >= pt_level
long_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) ==  1 and close <= sl_level

short_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) ==  -1 and close <= pt_level
short_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) ==  -1 and close >= sl_level

// What is last active trade? 
last_signal := long_signal ? 1 : short_signal ? -1 : long_hit_pt or long_hit_sl or short_hit_pt or short_hit_sl ? 0 : nz(last_signal[1])

//////////////
// PLOTTING //
//////////////

// Plot MAs
plot(short_ma,  color = red,    linewidth = 2)
plot(medium_ma, color = green,  linewidth = 2)
plot(long_ma,   color = yellow, linewidth = 2)


// Plot Levels 
plotshape(prev_tr_price, style = shape.cross, color = gray, location  = location.absolute, size = size.small)


plotshape(sl_lev_perc > 0 ? sl_level : na, style = shape.cross, color = red,   location  = location.absolute, size = size.small)
plotshape(pt_lev_perc > 0 ? pt_level : na, style = shape.cross, color = green, location  = location.absolute, size = size.small)

//////////////
// STRATEGY //
//////////////

strategy.entry("long",  true,  when = long_signal)
strategy.entry("short", false, when = short_signal)

strategy.close("long",  when = long_hit_pt  or long_hit_sl)
strategy.close("short", when = short_hit_pt or short_hit_sl)

Больше