Месячная стратегия перекрестного ценообразования по цене закрытия и скользящей средней

Автор:Чао Чжан, Дата: 2023-11-23 17:09:01
Тэги:

img

Обзор

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

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

Основная логика этой стратегии заключается в следующем:

  1. Возьмите параметр скользящей средней продолжительности в качестве входа. Выберите между SMA и EMA.
  2. Возможность отображения скользящей средней линии.
  3. Опция использовать в качестве источника сигнала цену закрытия другого тикера.
  4. Определить торговые сигналы на основе взаимосвязи между месячной ценой закрытия и скользящей средней:
    • Закрытие ценового пересечения выше MA - Длинный
    • Ключевые позиции, не подлежащие отмене

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

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

Основными преимуществами этой стратегии являются:

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

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

Риски

Следует также отметить некоторые риски:

  1. Ежемесячные данные обновляются медленно, не способные отражать изменения цен в режиме реального времени
  2. Отстает и может упустить краткосрочные возможности
  3. У МА есть врожденные задержки, время сигнала непредсказуемо.
  4. Неоптимальный выбор параметров приводит к чрезмерному консерватизму или упущенным возможностям

Предложенные способы снижения рисков:

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

Возможности для расширения

Эта стратегия имеет большой потенциал для совершенствования:

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

Заключение

Стратегия ежемесячного закрытия и MA имеет простую, прямолинейную логику и может быть адаптирована к различным тикерам через настройку параметров. Она особенно подходит для средне-долгосрочных инвесторов.


/*backtest
start: 2022-11-16 00:00:00
end: 2023-11-22 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/
// © universique

//@version=4
strategy("Monthly MA Close ", shorttitle="MMAC", overlay=true, default_qty_type =  strategy.percent_of_equity, default_qty_value = 100)
//MAY 6 2020 18:00

// No repaint function 
// Function to securely and simply call `security()` so that it never repaints and never looks ahead.
f_secureSecurity(_symbol, _res, _src) => security(_symbol, _res, _src[1], lookahead = barmerge.lookahead_on)
//sec10 = f_secureSecurity(syminfo.tickerid, higherTf, data)

// ————— Converts current chart resolution into a float minutes value.
f_resInMinutes() => 
    _resInMinutes = timeframe.multiplier * (
      timeframe.isseconds ? 1. / 60             :
      timeframe.isminutes ? 1.                  :
      timeframe.isdaily   ? 60. * 24            :
      timeframe.isweekly  ? 60. * 24 * 7        :
      timeframe.ismonthly ? 60. * 24 * 30.4375  : na)
// ————— Returns the float minutes value of the string _res.
f_tfResInMinutes(_res) =>
    // _res: resolution of any TF (in "timeframe.period" string format).
    // Dependency: f_resInMinutes().
    security(syminfo.tickerid, _res, f_resInMinutes())

// —————————— Determine if current timeframe is smaller that higher timeframe selected in Inputs.
// Get higher timeframe in minutes.
//higherTfInMinutes = f_tfResInMinutes(higherTf)
// Get current timeframe in minutes.
currentTfInMinutes = f_resInMinutes()
// Compare current TF to higher TF to make sure it is smaller, otherwise our plots don't make sense.
//chartOnLowerTf = currentTfInMinutes < higherTfInMinutes

// Input
switch1=input(true, title="Show MA")
exponential = input(true, title="Exponential MA")
ticker = input(false, title="Other ticker MA")

tic_ma = input(title="Ticker MA", type=input.symbol, defval="BTC_USDT:swap")
res_ma = input(title="Time MA (W, D, [min])", type=input.string, defval="M")
len_ma = input(8, minval=1, title="Period MA")

ma_cus = exponential?f_secureSecurity(tic_ma, res_ma, ema(close,len_ma)) : f_secureSecurity(tic_ma, res_ma, sma(close,len_ma))
ma_long = exponential?f_secureSecurity(syminfo.tickerid, res_ma, ema(close,len_ma)) : f_secureSecurity(syminfo.tickerid, res_ma, sma(close,len_ma))

cl1 = f_secureSecurity(syminfo.tickerid, 'M', close)
cl2 = f_secureSecurity(tic_ma, 'M', close)

// Input Backtest Range
showDate  = input(defval = false, title = "Show Date Range", type = input.bool)
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 1995, title = "From Year",       type = input.integer, minval = 1850)
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2112, title = "Thru Year",       type = input.integer, minval = 1850)

// Funcion Example
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false       // create function "within window of time"

// Calculation
bullish_cross = ticker?cl2>ma_cus : cl1>ma_long
bearish_cross = ticker?cl2<ma_cus : cl1<ma_long

MAColor = bullish_cross ? color.green : bearish_cross ? color.red : color.orange

// Strategy
strategy.entry("long", strategy.long, when = window() and bullish_cross)
strategy.close("long", when = window() and bearish_cross)

// Output
plot(switch1?ma_long:na,color = MAColor,linewidth=4)

// Alerts
alertcondition(bullish_cross, title='Bullish', message='Bullish')
alertcondition(bearish_cross, title='Bearish', message='Bearish')

Больше