Треугольная скользящая средняя (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)