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


Дата создания: 2024-01-29 16:52:46 Последнее изменение: 2024-01-29 16:52:46
Копировать: 3 Количество просмотров: 596
1
Подписаться
1617
Подписчики

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

Обзор

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

Стратегический принцип

Эта стратегия начинается с выбора типа движущейся средней в зависимости от настроек, включая EMA, SMA, RMA, WMA и VWMA. Затем устанавливается цикл вычисления движущейся средней, обычно от 10 до 250 K-линий. Выбор различных типов движущихся средних и количества циклов может иметь совершенно разный эффект в зависимости от различных валютных пар.

Конкретная логика сделки в этой стратегии:

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

При создании позиции считается предзнаменованием повышения цены, а при ликвидации - снижения цены.

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

Эта стратегия имеет следующие преимущества:

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

Анализ рисков

Однако эта стратегия также несет в себе некоторые риски:

  1. При некоторых валютных параметрах и параметрах уровень доходности и стабильности невысоки;
  2. Неэффективное реагирование на краткосрочные ценовые изменения, неэффективное реагирование на высоко волатильные валюты;
  3. Выбор циклов скользящих средних на основе недостаточно научного обоснования, есть определенная субъективность.

Как реагировать и оптимизировать:

  1. Выбор максимально возможных длинных периодов времени, таких как 12-часовой и однодневный, позволяет сократить ненужные сделки и повысить стабильность;
  2. Добавлена функция оптимизации параметров, которая автоматически тестирует различные комбинации параметров, чтобы найти оптимальные параметры;
  3. Добавлена функция адаптации для выбора циклов подвижных средних, позволяющая системе автоматически определять оптимальные циклы.

Подвести итог

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

Исходный код стратегии
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//Author @divonn1994

initial_balance = 100
strategy(title='Close v Open Moving Averages Strategy', shorttitle = 'Close v Open', overlay=true, pyramiding=0, default_qty_value=100, default_qty_type=strategy.percent_of_equity, precision=7, currency=currency.USD, commission_value=0.1, commission_type=strategy.commission.percent, initial_capital=initial_balance)

//Input for number of bars for moving average, Switch to choose moving average type, Display Options and Time Frame of trading----------------------------------------------------------------

bars = input.int(66, "Moving average length (number of bars)", minval=1, group='Strategy') //66 bars and VWMA for BTCUSD on 12 Hours.. 35 bars and VWMA for BTCUSD on 1 Day
strategy = input.string("VWMA", "Moving Average type", options = ["EMA", "SMA", "RMA", "WMA", "VWMA"], group='Strategy')

redOn = input.string("On", "Red Background Color On/Off", options = ["On", "Off"], group='Display')
greenOn = input.string("On", "Green Background Color On/Off", options = ["On", "Off"], group='Display')
maOn = input.string("On", "Moving Average Plot On/Off", options = ["On", "Off"], group='Display')

startMonth = input.int(title='Start Month 1-12 (set any start time to 0 for furthest date)', defval=1, minval=0, maxval=12, group='Beginning of Strategy')
startDate = input.int(title='Start Date 1-31 (set any start time to 0 for furthest date)', defval=1, minval=0, maxval=31, group='Beginning of Strategy')
startYear = input.int(title='Start Year 2000-2100 (set any start time to 0 for furthest date)', defval=2011, minval=2000, maxval=2100, group='Beginning of Strategy')

endMonth = input.int(title='End Month 1-12 (set any end time to 0 for today\'s date)', defval=0, minval=0, maxval=12, group='End of Strategy')
endDate = input.int(title='End Date 1-31 (set any end time to 0 for today\'s date)', defval=0, minval=0, maxval=31, group='End of Strategy')
endYear = input.int(title='End Year 2000-2100 (set any end time to 0 for today\'s date)', defval=0, minval=0, maxval=2100, group='End of Strategy')

//Strategy Calculations-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

inDateRange = true

maMomentum = switch strategy
    "EMA" => (ta.ema(close, bars) > ta.ema(open, bars)) ? 1 : -1
    "SMA" => (ta.sma(close, bars) > ta.sma(open, bars)) ? 1 : -1
    "RMA" => (ta.rma(close, bars) > ta.rma(open, bars)) ? 1 : -1
    "WMA" => (ta.wma(close, bars) > ta.wma(open, bars)) ? 1 : -1
    "VWMA" => (ta.vwma(close, bars) > ta.vwma(open, bars)) ? 1 : -1
    =>
        runtime.error("No matching MA type found.")
        float(na)

openMA = switch strategy
    "EMA" => ta.ema(open, bars)
    "SMA" => ta.sma(open, bars)
    "RMA" => ta.rma(open, bars)
    "WMA" => ta.wma(open, bars)
    "VWMA" => ta.vwma(open, bars)
    =>
        runtime.error("No matching MA type found.")
        float(na)
        
closeMA = switch strategy
    "EMA" => ta.ema(close, bars)
    "SMA" => ta.sma(close, bars)
    "RMA" => ta.rma(close, bars)
    "WMA" => ta.wma(close, bars)
    "VWMA" => ta.vwma(close, bars)
    =>
        runtime.error("No matching MA type found.")
        float(na)

//Enter or Exit Positions--------------------------------------------------------------------------------------------------------------------------------------------------------------------

if ta.crossover(maMomentum, 0)
    if inDateRange
        strategy.entry('long', strategy.long, comment='long')
if ta.crossunder(maMomentum, 0)
    if inDateRange
        strategy.close('long')

//Plot Strategy Behavior---------------------------------------------------------------------------------------------------------------------------------------------------------------------

plot(series = maOn == "On" ? openMA : na, title = "Open moving Average", color = color.new(color.purple,0), linewidth=3, offset=1)
plot(series = maOn == "On" ? closeMA : na, title = "Close Moving Average", color = color.new(color.white,0), linewidth=2, offset=1)
bgcolor(color = inDateRange and (greenOn == "On") and maMomentum > 0 ? color.new(color.green,75) : inDateRange and (redOn == "On") and maMomentum <= 0 ? color.new(color.red,75) : na, offset=1)