В процессе загрузки ресурсов... загрузка...

Пятикратно сильная стратегия скользящей средней

Автор:Чао Чжан, Дата: 2024-05-23 18:14:35
Тэги:ЕМАWMASMATMAVARWWMAЗЛЕМАТСФ

img

Обзор

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

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

Принцип стратегии

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

  1. Движущаяся средняя уровня 1: настраиваемый дисплей, этикетка, источник данных, временные рамки, длина, ширина строки, цвет и тип.
  2. Движущаяся средняя уровня 2: настраиваемый дисплей, этикетка, источник данных, временные рамки, длина, ширина строки, цвет и тип.
  3. Уровень 3 скользящая средняя: настраиваемый дисплей, этикетка, источник данных, временные рамки, длина, ширина строки, цвет и тип.
  4. Движущаяся средняя уровня 4: в основном используется для вспомогательного суждения, настраиваемого отображения, этикетки, источника данных, временных рамок, длины, ширины линии и цвета.
  5. Движущаяся средняя уровня 5: в основном используется для вспомогательного суждения, настраиваемого отображения, этикетки, источника данных, временных рамок, длины, ширины линии и цвета.

Типы этих пяти скользящих средних могут быть гибко установлены, включая SMA, EMA, WMA, TMA, VAR, WWMA, ZLEMA, TSF и другие 8 типов.

Основная идея этой стратегии заключается в определении направления и силы тренда с использованием нескольких подтверждений тренда скользящих средних различных временных рамок и типов:

  • Если цена закрытия выше скользящих средних уровней 1, 2 и 3, выйти на длинный курс;
  • Если цена закрытия ниже скользящих средних уровней 1, 2 и 3, выйти на короткий курс;
  • При проведении длинной позиции, если цена закрытия упадет ниже скользящих средних уровней 1 и 2, закрыть длинную позицию;
  • При проведении короткой позиции, если цена закрытия выше скользящих средних уровней 1 и 2, закрыть короткую позицию.

Кроме того, эта стратегия будет отображать цвет свечей в соответствии с текущей позицией:

  • При удержании длинной позиции свечник зеленый;
  • При сохранении короткой позиции свечник красный;
  • В других случаях свеча серая.

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

  1. Сильная способность отслеживать тенденции. Эта стратегия использует комбинацию нескольких средне- и долгосрочных скользящих сред для определения тенденций, с сильной способностью распознавания тенденций, которая может эффективно понять основные тенденции рынка.
  2. Гибкие регулируемые параметры: параметры этой стратегии могут быть гибко установлены, включая тип, временные рамки, длительность скользящих средних и т. д., которые могут быть оптимизированы в соответствии с различными характеристиками рынка и предпочтениями инвесторов.
  3. Приспосабливаемость к нескольким рынкам. Эта стратегия основана на самом движении цен и может использоваться на нескольких рынках, таких как акции, фьючерсы, иностранная валюта, криптовалюты и т. д.
  4. Главная логика этой стратегии проста и понятна, легко понять и реализовать, не требуя чрезмерно сложных математических моделей.

Стратегические риски

  1. Эта стратегия обычно выполняется на рынках с ограниченным диапазоном и может иметь больше сделок с небольшими потерями, что приводит к снижению чистой прибыли.
  2. Риск оптимизации параметров. Эта стратегия использует множество параметров. Если не проводится достаточное обратное тестирование исторических данных и оптимизация параметров, это может привести к большему снижению в будущей живой торговле.
  3. Риск обратного тренда. Эта стратегия в основном подходит для трендовых рынков. Как только рыночная тенденция меняется, эта стратегия может продолжать торговать в первоначальном направлении тренда, вызывая убытки.

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

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

Направления оптимизации стратегии

  1. Внедрить больше индикаторов подтверждения тренда, таких как MACD, DMI и т. д., чтобы улучшить точность оценки тренда.
  2. Для рынков с ограниченным диапазоном следует рассмотреть возможность внедрения операционной логики, которая может адаптироваться к рынкам с ограниченным диапазоном, таким как торговля сетями.
  3. Для различных рыночных характеристик оптимизировать параметры стратегии отдельно для повышения адаптивности.
  4. Подумайте о сочетании этой стратегии с другими стратегиями, такими как сочетание стратегии тренда + стратегии диапазона, стратегии тренда + стратегии контртенда и т. д., чтобы повысить надежность стратегии.

Резюме

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


/*backtest
start: 2023-05-17 00:00:00
end: 2024-05-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Quintuple Strong Moving Average Strategy","QuisMa", overlay=true, margin_long=100, margin_short=100)

// 1
mav1_show = input.bool(true, 'Show Plot', group='Level 1 ', inline='mav1_0')
mav1_label = input.bool(true, 'Show Label', group='Level 1 ', inline='mav1_0')
mav1_source = input.source(close, '', group='Level 1 ', inline='mav1_1')
mav1_timeframe = input.timeframe('5', '', group='Level 1 ', inline='mav1_1')
mav1_length = input.int(50, 'Length', group='Level 1 ', inline='mav1_3')
mav1_size = input.int(2000, 'Size', minval=1, group='Level 1 ', inline='mav1_3')
mav1_width = input.int(2, '', minval=0, group='Level 1 ', inline='mav1_2')
mav1_color = input.color(color.new(#ffd000, 0), '', group='Level 1 ', inline='mav1_2')
mav1_type = input.string(title='Moving Average Type 1', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 2
mav2_show = input.bool(true, 'Show Plot', group='Level 2', inline='mav2_0')
mav2_label = input.bool(true, 'Show Label', group='Level 2', inline='mav2_0')
mav2_source = input.source(close, '', group='Level 2', inline='mav2_1')
mav2_timeframe = input.timeframe('30', '', group='Level 2', inline='mav2_1')
mav2_length = input.int(50, 'Length', group='Level 2', inline='mav2_3')
mav2_size = input.int(2000, 'Size', minval=1, group='Level 2', inline='mav2_3')
mav2_width = input.int(2, '', minval=0, group='Level 2', inline='mav2_2')
mav2_color = input.color(color.new(#ffd000, 0), '', group='Level 2', inline='mav2_2')
mav2_type = input.string(title='Moving Average Type 2', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 3
mav3_show = input.bool(true, 'Show Plot', group='Level 3', inline='mav3_0')
mav3_label = input.bool(true, 'Show Label', group='Level 3', inline='mav3_0')
mav3_source = input.source(close, '', group='Level 3', inline='mav3_1')
mav3_timeframe = input.timeframe('60', '', group='Level 3', inline='mav3_1')
mav3_length = input.int(50, 'Length', group='Level 3', inline='mav3_3')
mav3_size = input.int(2000, 'Size', minval=1, group='Level 3', inline='mav3_3')
mav3_width = input.int(2, '', minval=0, group='Level 3', inline='mav3_2')
mav3_color = input.color(color.new(#ffd000, 0), '', group='Level 3', inline='mav3_2')
mav3_type = input.string(title='Moving Average Type 3', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 4
mav4_show = input.bool(true, 'Show Plot', group='Level 4', inline='mav4_0')
mav4_label = input.bool(true, 'Show Label', group='Level 4', inline='mav4_0')
mav4_source = input.source(close, '', group='Level 4', inline='mav4_1')
mav4_timeframe = input.timeframe('480', '', group='Level 4', inline='mav4_1')
mav4_length = input.int(50, 'Length', group='Level 4', inline='mav4_3')
mav4_size = input.int(2000, 'Size', minval=1, group='Level 4', inline='mav4_3')
mav4_width = input.int(2, '', minval=0, group='Level 4', inline='mav4_2')
mav4_color = input.color(color.new(#ffd000, 0), '', group='Level 4', inline='mav4_2')
mav4_type = input.string(title='Moving Average Type 4', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 5
mav5_show = input.bool(true, 'Show Plot', group='Level 5', inline='mav5_0')
mav5_label = input.bool(true, 'Show Label', group='Level 5', inline='mav5_0')
mav5_source = input.source(close, '', group='Level 5', inline='mav5_1')
mav5_timeframe = input.timeframe('720', '', group='Level 5', inline='mav5_1')
mav5_length = input.int(50, 'Length', group='Level 5', inline='mav5_3')
mav5_size = input.int(2000, 'Size', minval=1, group='Level 5', inline='mav5_3')
mav5_width = input.int(2, '', minval=0, group='Level 5', inline='mav5_2')
mav5_color = input.color(color.new(#ffd000, 0), '', group='Level 5', inline='mav5_2')
mav5_type = input.string(title='Moving Average Type 5', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])


// FUNCTIONS {{{
candle_size_ms = time - time[1]  // milliseconds of a candle

timetostring(tms) =>
    d_ = math.floor(tms / 86400)
    h_ = math.floor((tms - d_ * 86400) / 3600)
    m_ = math.floor((tms - d_ * 86400 - h_ * 3600) / 60)
    s_ = math.floor(tms - d_ * 86400 - h_ * 3600 - m_ * 60)
    ret = d_ > 0 ? str.tostring(d_) + ' D ' : ''
    ret += (h_ > 0 ? str.tostring(h_) + ' H ' : '')
    ret += (m_ > 0 ? str.tostring(m_) + ' m ' : '')
    if d_ == 0
        ret += (s_ > 0 ? str.tostring(s_) + ' s ' : '')
        ret
    ret

tftostring(tf) =>
    tfa = str.split(tf, '')
    tfalast = array.get(tfa, array.size(tfa) - 1)
    tfalastIsNum = na(str.tonumber(tfalast)) ? false : true
    txt = tfalastIsNum ? timetostring(str.tonumber(tf) * 60) : tf
    txt

htfLabel(htfy, tf, col) =>
    txt = tftostring(tf)
    htftxt = 'ᐊ ' + txt
    htftip = 'HTF  [ ' + txt + ' ] ' + str.tostring(htfy, '#.##')
    label.new(x=time + candle_size_ms * 2, y=htfy, xloc=xloc.bar_time, yloc=yloc.price, color=color.new(color.black, 100), textcolor=col, style=label.style_label_left, size=size.normal, text=htftxt, tooltip=htftip)

// Moving Averages Functions {{{
Var_Func(src, length) =>
    valpha = 2 / (length + 1)
    vud1 = src > src[1] ? src - src[1] : 0
    vdd1 = src < src[1] ? src[1] - src : 0
    vUD = math.sum(vud1, 9)
    vDD = math.sum(vdd1, 9)
    vCMO = nz((vUD - vDD) / (vUD + vDD))
    VAR = 0.0
    VAR := nz(valpha * math.abs(vCMO) * src) + (1 - valpha * math.abs(vCMO)) * nz(VAR[1])
    VAR

Wwma_Func(src, length) =>
    wwalpha = 1 / length
    WWMA = 0.0
    WWMA := wwalpha * src + (1 - wwalpha) * nz(WWMA[1])
    WWMA

Zlema_Func(src, length) =>
    zxLag = length / 2 == math.round(length / 2) ? length / 2 : (length - 1) / 2
    zxEMAData = src + src - src[zxLag]
    ZLEMA = ta.ema(zxEMAData, length)
    ZLEMA

Tsf_Func(src, length) =>
    lrc = ta.linreg(src, length, 0)
    lrc1 = ta.linreg(src, length, 1)
    lrs = lrc - lrc1
    TSF = ta.linreg(src, length, 0) + lrs
    TSF

getMA(src, length, mav_type) =>
    ma = 0.0
    if mav_type == 'SMA'
        ma := ta.sma(src, length)
    if mav_type == 'EMA'
        ma := ta.ema(src, length)
    if mav_type == 'WMA'
        ma := ta.wma(src, length)
    if mav_type == 'TMA'
        ma := ta.sma(ta.sma(src, math.ceil(length / 2)), math.floor(length / 2) + 1)
    if mav_type == 'VAR'
        ma := Var_Func(src, length)
    if mav_type == 'WWMA'
        ma := Wwma_Func(src, length)
    if mav_type == 'ZLEMA'
        ma := Zlema_Func(src, length)
    if mav_type == 'TSF'
        ma := Tsf_Func(src, length)
    ma

mav1 = request.security(syminfo.tickerid, mav1_timeframe, getMA(mav1_source, mav1_length, mav1_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav1_show ? mav1 : na, 'mav 1', color=mav1_color, linewidth=mav1_width, show_last=mav1_size)
var label mav1lbl = na
label.delete(mav1lbl)
mav1lbl := mav1_label ? htfLabel(mav1, mav1_timeframe, mav1_color) : na

mav2 = request.security(syminfo.tickerid, mav2_timeframe, getMA(mav2_source, mav2_length, mav2_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav2_show ? mav2 : na, 'mav 2', color=mav2_color, linewidth=mav2_width, show_last=mav2_size)
var label mav2lbl = na
label.delete(mav2lbl)
mav2lbl := mav2_label ? htfLabel(mav2, mav2_timeframe, mav2_color) : na

mav3 = request.security(syminfo.tickerid, mav3_timeframe, getMA(mav3_source, mav3_length, mav3_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav3_show ? mav3 : na, 'mav 3', color=mav3_color, linewidth=mav3_width, show_last=mav3_size)
var label mav3lbl = na
label.delete(mav3lbl)
mav3lbl := mav3_label ? htfLabel(mav3, mav3_timeframe, mav3_color) : na

mav4 = request.security(syminfo.tickerid, mav4_timeframe, getMA(mav4_source, mav4_length, mav4_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav4_show ? mav4 : na, 'mav 4', color=mav4_color, linewidth=mav4_width, show_last=mav4_size)
var label mav4lbl = na
label.delete(mav4lbl)
mav4lbl := mav4_label ? htfLabel(mav4, mav4_timeframe, mav4_color) : na

mav5 = request.security(syminfo.tickerid, mav5_timeframe, getMA(mav5_source, mav5_length, mav5_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav5_show ? mav5 : na, 'mav 5', color=mav5_color, linewidth=mav5_width, show_last=mav5_size)
var label mav5lbl = na
label.delete(mav5lbl)
mav5lbl := mav5_label ? htfLabel(mav5, mav5_timeframe, mav5_color) : na

// Alış ve Satış Koşulları
alisKosulu = close > mav1 and close > mav2 and close > mav3
satisKosulu = close < mav1 and close < mav2 and close < mav3

// Alış ve Satış Sinyalleri
if (alisKosulu and not satisKosulu)
    strategy.entry("Alış", strategy.long)
if (satisKosulu and not alisKosulu)
    strategy.entry("Satış", strategy.short)

// Pozisyonları Kapatma Koşulları
if (strategy.opentrades > 0)
    if (close < mav1 and close < mav2 and strategy.position_size > 0)
        strategy.close("Alış")
    if (close > mav1 and close > mav2 and strategy.position_size < 0)
        strategy.close("Satış")

// Mum Rengi Ayarlama
longKosul = strategy.opentrades > 0 and strategy.position_size > 0
shortKosul = strategy.opentrades > 0 and strategy.position_size < 0

barcolor(longKosul ? color.green : shortKosul ? color.red : color.gray)


Связанные

Больше