Стратегия торговли с пересечением нескольких скользящих средних

Автор:Чао Чжан, Дата: 2023-12-06 17:10:00
Тэги:

img

Обзор стратегии

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

Наименование стратегии

Стратегия перекрестного использования нескольких скользящих средних

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

Эта стратегия использует 3 скользящих средних с различными периодами, включая 7-дневные, 13-дневные и 21-дневные линии.

  1. Когда краткосрочная 7-дневная МА пересекает среднесрочную 13-дневную МА вверх, в то время как долгосрочная 21-дневная МА имеет тенденцию к росту, генерируется длинный сигнал.
  2. Когда краткосрочный 7-дневный MA переходит ниже среднесрочного 13-дневного MA вниз, а долгосрочный 21-дневный MA находится в нисходящей тенденции, генерируется короткий сигнал.

Объединяя скользящие средние за разные временные рамки, стратегия может более точно оценить рыночные тенденции и избежать ложных сделок.

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

  1. Использование нескольких линий MA позволяет лучше определить движения рынка и избежать ошибок, вызванных ложными прорывами или краткосрочными колебаниями на рынке.
  2. Сигналы генерируются только тогда, когда тенденция ясна, тем самым сокращая ненужные сделки и снижая затраты на транзакции.
  3. Гибкое настройка параметров - периоды МО могут быть скорректированы в соответствии с личными предпочтениями, чтобы соответствовать различным продуктам и рыночным условиям.

Риски

  1. Частые ложные сигналы могут возникнуть на колеблющемся рынке.
  2. МА как индикаторы тенденции не могут точно определить переломные моменты.
  3. Задержка подачи сигнала через перекресток MA может лишить часть прибыли.
  4. Риски могут быть уменьшены путем внедрения других технических показателей для проверки сигналов и оптимизации параметров MA.

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

  1. Подумайте о включении показателей волатильности для оценки силы тренда и избегания торговли на нестабильных рынках.
  2. Попробуйте применить модели машинного обучения для автоматической оптимизации параметров MA.
  3. Добавьте стратегии стоп-лосса, чтобы сократить убытки вовремя, когда увеличиваются выводы.
  4. Используйте ограничительные приказы, когда происходит перекрестное пересечение MA, чтобы уменьшить скольжение.

Заключение

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


/*backtest
start: 2022-11-29 00:00:00
end: 2023-12-05 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/
// © Crypto-Oli

//@version=4
strategy("CryptOli 3 MAs long/short Backtest", initial_capital=5000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, overlay=true)

// this is an educational Script - basicly its very simple - you can see how minimal changes impact results, thats why i posted it
// Credits to Quantnomad to publish tons of free educational script
// this Script is based on https://www.tradingview.com/script/0NgUadGr-Ultimate-MA-Cross-Indicator/ Quantnomads Ultimate MA Indicator 
// HA - Option for calcucaltion based on HA-Candles (very famous recently)
// Source Input - Option (Candletype for calculation, close, ohlc4 ect.) --- there are huge differences --- try it by your own

////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE

// From Date Inputs
fromDay = input(defval=1, title="From Day", minval=1, maxval=31)
fromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
fromYear = input(defval=2015, title="From Year", minval=1970)

// To Date Inputs
toDay = input(defval=1, title="To Day", minval=1, maxval=31)
toMonth = input(defval=1, title="To Month", minval=1, maxval=12)
toYear = input(defval=2030, title="To Year", minval=1970)

// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate

////////////////////////////////////////////////////////////////////////////////

h = input(false, title = "Signals from Heikin Ashi Candles")

ma_type      = input(title = "MA Type",         type = input.string,  defval = "SMMA", options = ['SMA', 'EMA', 'WMA', 'VWMA', 'HMA', 'SMMA', 'DEMA'])
src = input(ohlc4)

short_ma_len = input(title = "Short MA Length", type = input.integer, defval = 7,     minval = 1)
short_ma_src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, src, lookahead = false) : close
middle_ma_len  = input(title = "Middle MA Length",  type = input.integer, defval = 13,    minval = 2)
middle_ma_src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, src, lookahead = false) : close
long_ma_len  = input(title = "Long MA Length",  type = input.integer, defval = 21,    minval = 2)
long_ma_src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, src, lookahead = false) : close


tick_round(x) => 
    round(x / syminfo.mintick) * syminfo.mintick

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

// Simple Moving Average (SMA)
if ma_type == 'SMA' 
    short_ma := sma(short_ma_src, short_ma_len)
    middle_ma := sma(middle_ma_src, middle_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)
    middle_ma := ema(middle_ma_src, middle_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)
    middle_ma := wma(middle_ma_src, middle_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)))
    middle_ma := wma(2*wma(middle_ma_src, middle_ma_len/2)-wma(middle_ma_src, middle_ma_len), round(sqrt(middle_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)
    middle_ma := vwma(middle_ma_src, middle_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
    middle_ma := na(middle_ma[1]) ? sma(middle_ma_src, middle_ma_len) : (middle_ma[1] * (middle_ma_len - 1) + middle_ma_src) / middle_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_middle = ema(middle_ma_src, middle_ma_len)
    e1_long  = ema(long_ma_src,  long_ma_len)
    
    short_ma := 2 * e1_short - ema(e1_short, short_ma_len)
    middle_ma := 2 * e1_middle - ema(e1_middle, middle_ma_len)
    long_ma  := 2 * e1_long  - ema(e1_long,  long_ma_len)

// Plot MAs
plot(short_ma, color = color.green,   linewidth = 1)
plot(middle_ma, color = color.yellow,   linewidth = 1)
plot(long_ma,  color = color.red, linewidth = 1)

if close>long_ma and short_ma>middle_ma and time_cond
    strategy.entry("Long", strategy.long)


if close<long_ma and short_ma<middle_ma and time_cond
    strategy.entry("Short", strategy.short)


Больше