Стратегия торговли лимитовыми ордерами с несколькими MA

Автор:Чао Чжан, Дата: 2023-09-22 14:16:20
Тэги:

Обзор

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

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

Стратегия использует скользящие средние для определения направления тренда. В частности, она определяет количество длинных лимитных ордеров на основе того, проходит ли цена через 3 линии MA вверх. И она определяет количество коротких лимитных ордеров на основе того, проходит ли цена через 3 линии MA вниз.

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

Вся стратегия сочетает в себе открытие в стиле пирамиды с закрытием в стиле прорыва, чтобы сформировать логику торговли.

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

Преимущества этой стратегии включают:

  1. Использование MAs для определения тенденций, простой и интуитивно понятный для работы.

  2. Пирамидальное открытие может получить лучшие средние цены на ранней стадии трендов.

  3. Средний стоп-лосс MA может своевременно остановить потери и контролировать риски.

  4. Ограничьте приказы, избегайте проскальзывания.

  5. Настраиваемые параметры адаптируются к различным продуктам.

  6. Ясная структура, легкая для понимания и расширения.

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

Риски этой стратегии включают:

  1. Отставание от МО может привести к ошибочным оценкам.

  2. Неудачные ограничительные заказы могут лишить вас шансов на вход.

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

  4. Неправильное настройка параметров может привести к слишком большим позициям.

  5. Недостаточный период обратного испытания может привести к переустановке.

  6. Не учитывается стоимость сделки.

Решения:

  1. Добавить другие показатели для подтверждения, оптимизировать параметры.

  2. Установите срок годности, настроите предельные цены.

  3. Добавьте прибыль или логику при среднем MA стоп-лосс.

  4. Оптимизируйте параметры, оценивайте соотношение риск-вознаграждение.

  5. Расширить период обратных тестов, многорыночные обратные тесты.

  6. Добавьте затраты на транзакции и логику скольжения.

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

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

  1. Оптимизировать параметры для большего количества продуктов, используя методы машинного обучения.

  2. Добавить другие индикаторы для подтверждения, например MACD, KDJ и т.д.

  3. Добавьте логику получения прибыли на средней линии MA.

  4. Динамически регулируйте размеры позиций и уровни остановки.

  5. Оптимизировать предельные цены для улучшения затрат на вход, например, на основе волатильности.

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

  7. Испытание параметров на различных продуктах для создания пулов параметров.

Заключение

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


/*backtest
start: 2022-09-15 00:00:00
end: 2023-09-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2019

//@version=4
strategy(title = "Robot WhiteBox MultiMA", shorttitle = "Robot WhiteBox MultiMA", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 3)

//Settings
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot")
len = input(3, minval = 1, title = "MA Length")
s = input(defval = "7. OHLC4", options = ["1. Open", "2. High", "3. Low", "4. Close", "5. HL2", "6. HLC3", "7. OHLC4", "8. OC2", "9. PCMA"], title = "Data")
short3 = input(true, title = "short 3")
short2 = input(true, title = "short 2")
short1 = input(true, title = "short 1")
long1 = input(true, title = "long 1")
long2 = input(true, title = "long 2")
long3 = input(true, title = "long 3")
shortlevel3 = input(15.0, title = "Short line 3")
shortlevel2 = input(10.0, title = "Short line 2")
shortlevel1 = input(5.0, title = "Short line 1")
longlevel1 = input(-5.0, title = "Long line 1")
longlevel2 = input(-10.0, title = "Long line 2")
longlevel3 = input(-15.0, title = "Long line 3")
needoffset = input(true, title = "Offset")
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")

//Variables
size = strategy.position_size
mult = 1 / syminfo.mintick
needtime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)

//MA
oc2 = (open + close) / 2
pcma = (highest(high, len) + lowest(low, len)) / 2
src = s == "1. Open" ? open : s == "2. High" ? high : s == "3. Low" ? low : s == "4. Close" ? close : s == "5. HL2" ? hl2 : s == "6. HLC3" ? hlc3 : s == "7. OHLC4" ? ohlc4 : s == "8. OC2" ? oc2: close
sma = sma(src, len)
ma = s == "9. PCMA" ? round(pcma * mult) / mult : round(sma * mult) / mult

//Levels
longline1 = long1 ? round(ma * ((100 + longlevel1) / 100) * mult) / mult : close
longline2 = long2 ? round(ma * ((100 + longlevel2) / 100) * mult) / mult : close
longline3 = long3 ? round(ma * ((100 + longlevel3) / 100) * mult) / mult : close
shortline1 = short1 ? round(ma * ((100 + shortlevel1) / 100) * mult) / mult : close
shortline2 = short2 ? round(ma * ((100 + shortlevel2) / 100) * mult) / mult : close
shortline3 = short3 ? round(ma * ((100 + shortlevel3) / 100) * mult) / mult : close

//Lines
colorlong1 = long1 ? color.lime : na
colorlong2 = long2 ? color.lime : na
colorlong3 = long3 ? color.lime : na
colorshort1 = short1 ? color.red : na
colorshort2 = short2 ? color.red : na
colorshort3 = short3 ? color.red : na
offset = needoffset ? 1 : 0
plot(shortline3, offset = offset, color = colorshort3, title = "Short line 3")
plot(shortline2, offset = offset, color = colorshort2, title = "Short line 2")
plot(shortline1, offset = offset, color = colorshort1, title = "Short line 1")
plot(ma, offset = offset, color = color.blue, title = "MA line")
plot(longline1, offset = offset, color = colorlong1, title = "Long line 1")
plot(longline2, offset = offset, color = colorlong2, title = "Long line 2")
plot(longline3, offset = offset, color = colorlong3, title = "Long line 3")

//Trading
lot = 0.0
lot := size == 0 ? strategy.equity / close * capital / 100 : lot[1]
lots = 0.0
if ma > 0
    lots := round(size / lot)
    strategy.entry("L1", strategy.long, lot, limit = longline1, when = (lots == 0 and long1 and needtime))
    lots := round(size / lot)
    strategy.entry("L2", strategy.long, lot, limit = longline2, when = (lots <= 1 and long2 and needtime))
    lots := round(size / lot)
    strategy.entry("L3", strategy.long, lot, limit = longline3, when = (lots <= 2 and long3 and needtime))
    lots := round(size / lot)
    strategy.entry("S1", strategy.short, lot, limit = shortline1, when = (lots == 0 and short1 and needtime))
    lots := round(size / lot)
    strategy.entry("S2", strategy.short, lot, limit = shortline2, when = (lots >= -1 and short2 and needtime))
    lots := round(size / lot)
    strategy.entry("S3", strategy.short, lot, limit = shortline3, when = (lots >= -2 and short3 and needtime))
if size > 0
    strategy.entry("TPL", strategy.short, 0, limit = ma)
if size < 0
    strategy.entry("TPS", strategy.long, 0, limit = ma)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()

Больше