Стратегия двойного MA с временным ограничением

Автор:Чао Чжан, Дата: 2023-11-14 16:45:03
Тэги:

img

Обзор

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

Принцип

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

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

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

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

  • Двойные МА эффективно отражают среднесрочные и краткосрочные тенденции
  • Модуль ограничения времени точно контролирует время выполнения стратегии, избегая ненужных сделок при неблагоприятных рыночных условиях
  • Опция инверсии торговли добавляет гибкости

Риски и решения

  • Двойные МА могут генерировать чрезмерные торговые сигналы, увеличивая частоту торговли и затраты
  • Неправильная конфигурация ограничения времени может привести к упущенным возможностям
  • Неправильная инверсия торговли может привести к неправильным торговым сигналам

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

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

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

Резюме

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


/*backtest
start: 2023-11-06 00:00:00
end: 2023-11-13 00:00:00
period: 45m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2

strategy(title = "Strategy Code Example", shorttitle = "Strategy Code Example", overlay = true)

// Revision:        1
// Author:          @JayRogers
//
// *** THIS IS JUST AN EXAMPLE OF STRATEGY TIME LIMITING ***
//
//  This is a follow up to my previous strategy example for risk management, extended to include a time limiting factor.

// === GENERAL INPUTS ===
// short ma
maFastSource   = input(defval = open, title = "Fast MA Source")
maFastLength   = input(defval = 14, title = "Fast MA Period", minval = 1)
// long ma
maSlowSource   = input(defval = open, title = "Slow MA Source")
maSlowLength   = input(defval = 21, title = "Slow MA Period", minval = 1)

// === STRATEGY RELATED INPUTS ===
tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
// Risk management
inpTakeProfit   = input(defval = 1000, title = "Take Profit", minval = 0)
inpStopLoss     = input(defval = 200, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 200, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)
// *** FOCUS OF EXAMPLE ***
// Time limiting
// a toggle for enabling/disabling
useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
// set up where we want to run from
startYear       = input(defval = 2016, title = "Start From Year",  minval = 0, step = 1)
startMonth      = input(defval = 05, title = "Start From Month",  minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day",  minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour",  minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute",  minval = 0,step = 1)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

// *** FOCUS OF EXAMPLE ***
// === TIME LIMITER CHECKING FUNCTION ===
// using a multi line function to return true or false depending on our input selection
// multi line function logic must be indented.
startTimeOk() =>
    // get our input time together
    inputTime   = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    // check the current time is greater than the input time and assign true or false
    timeOk      = time > inputTime ? true : false
    // last line is the return value, we want the strategy to execute if..
    // ..we are using the limiter, and the time is ok -OR- we are not using the limiter
    r = (useTimeLimit and timeOk) or not useTimeLimit

// === SERIES SETUP ===
/// a couple of ma's..
maFast = ema(maFastSource, maFastLength)
maSlow = ema(maSlowSource, maSlowLength)

// === PLOTTING ===
fast = plot(maFast, title = "Fast MA", color = green, linewidth = 2, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = red, linewidth = 2, style = line, transp = 50)

// === LOGIC ===
// is fast ma above slow ma?
aboveBelow = maFast >= maSlow ? true : false
// are we inverting our trade direction?
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

// *** FOCUS OF EXAMPLE ***
// wrap our strategy execution in an if statement which calls the time checking function to validate entry
// like the function logic, content to be included in the if statement must be indented.
if( startTimeOk() )
    // === STRATEGY - LONG POSITION EXECUTION ===
    enterLong = not tradeDirection[1] and tradeDirection
    exitLong = tradeDirection[1] and not tradeDirection
    strategy.entry( id = "Long", long = true, when = enterLong )
    strategy.close( id = "Long", when = exitLong )
    
    // === STRATEGY - SHORT POSITION EXECUTION ===
    enterShort = tradeDirection[1] and not tradeDirection
    exitShort = not tradeDirection[1] and tradeDirection
    strategy.entry( id = "Short", long = false, when = enterShort )
    strategy.close( id = "Short", when = exitShort )
    
    // === STRATEGY RISK MANAGEMENT EXECUTION ===
    strategy.exit("Exit Long", from_entry = "Long", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
    strategy.exit("Exit Short", from_entry = "Short", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)


Больше