Стратегия торговли по пересечению предельных ордеров

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

img

Резюме

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

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

  1. Вычислить простую скользящую среднюю величину (SMA) и направление тренда.

  2. Если включен фильтр Anti-Saw, восходящий тренд определяется, когда минимумы выше SMA, нисходящий тренд определяется, когда максимумы ниже SMA. Если отключен фильтр Anti-Saw, восходящий тренд определяется, когда закрытие выше SMA, нисходящий тренд определяется, когда закрытие ниже SMA.

  3. Размещать лимитные ордера по цене SMA в соответствии с направлением тренда и направлениями торговли needlong и needshort:

    • Если нужна длинная торговля (недостаток длинной торговли является правдой) и в восходящем тренде, разместите длинный лимитный ордер по цене SMA

    • Если необходима короткая торговля (необходимость короткой торговли является истинной) и в нисходящем тренде, разместите короткий лимитный ордер по цене SMA

  4. Установите логику остановки потери для выхода из позиций, если направление позиции не соответствует направлению тренда.

  5. Торговать только в пределах указанного диапазона дат на основе параметров диапазона дат.

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

  1. Использование SMA для определения тренда может эффективно фильтровать шум рынка и блокировать долгосрочную тенденцию.

  2. Размещение лимитных ордеров по цене SMA может получить хорошие точки входа, когда начинается тренд.

  3. Гибкость для длинного или короткого курса в зависимости от личного стиля торговли.

  4. Остановить потери на месте, чтобы избежать увеличения потерь.

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

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

  1. SMA как индикатор тренда имеет эффект отставания, может пропустить поворотные моменты тренда и вызвать убытки.

  2. Лимитные ордера не имеют гибкости, могут не входить в позиции из-за краткосрочных корректировок тренда.

  3. Параметр периода SMA нуждается в правильной конфигурации, неправильные настройки приводят к неправильному определению тренда.

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

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

  1. Подумайте о добавлении других показателей для подтверждения многопоказателей, избегая проблем с отставанием SMA.

  2. Переключение на отслеживание рыночных ордеров, когда цена превышает SMA, улучшая гибкость отслеживания.

  3. Динамически оптимизировать период SMA для адаптации к различным рыночным циклам.

  4. Для более гибких остановок установить стоп-лосс на колебание низко/высоко вместо строго на цене SMA.

  5. Увеличить алгоритмические элементы для более умных динамических торговых сессий, избегая крупных рисковых событий.

Резюме

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


/*backtest
start: 2022-10-27 00:00:00
end: 2023-03-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2020

//@version=4
strategy(title = "Noro's CrossLimit", shorttitle = "CrossLimit", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 0, commission_value = 0.0)

needlong = input(true, "long")
needshort = input(true, "short")
lotsize = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot, %")
src = input(close, defval = close, title = "MA Source")
len = input(5, defval = 5, minval = 1, title = "SMA length")
off = input(0, defval = 0, minval = 0, title = "SMA offset")
anti = input(true, defval = true, title = "Anti-saw filter")
rev = input(false, defval = false, title = "Reverse")
showma = input(true, defval = true, title = "Show MA")
showbg = input(false, defval = false, title = "Show background")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//MA
ma = sma(src, len)[off]
macol = showma ? color.blue : na
plot(ma, color = macol, linewidth = 3, transp = 0)

//Background
trend = 0
trend := anti == false and close > ma ? 1 : anti == false and close < ma ? -1 : low > ma ? 1 : high < ma ? -1 : trend[1]
bgcol = showbg ? trend == 1 ? color.lime : trend == -1 ? color.red : na : na
bgcolor(bgcol, transp = 70)

//Signals
bar = close > open ? 1 : close < open ? -1 : 0
up = (trend == 1 and rev == false) or (trend == -1 and rev == true)
dn = (trend == -1 and rev == false) or (trend == 1 and rev == true)

//Trading
size = strategy.position_size
truetime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)
lot = 0.0
lot := size != size[1] ? strategy.equity / close * lotsize / 100 : lot[1]
if trend != 0
    strategy.entry("Long", strategy.long, lot, limit = ma, when = needlong and truetime and up)
    strategy.entry("Short", strategy.short, lot, limit = ma, when = needshort and truetime and dn)
if size > 0 and needshort == false and trend == -1
    strategy.exit("Stop Long", "Long", limit = ma)
if size < 0 and needlong == false and trend == 1
    strategy.exit("Stop Short", "Short", limit = ma)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()
    strategy.cancel("Long")
    strategy.cancel("Short")

Больше