Это продвинутая стратегия количественного трейдинга, отслеживающая тенденции динамической сетки. Основная идея этой стратегии заключается в разделении нескольких линий сетки в заранее установленных ценовых диапазонах и автоматическом создании позиций для покупки или продажи, когда цена касается линии сетки, чтобы получить прибыль в шокирующей ситуации. Кроме того, эта стратегия имеет функцию динамического регулирования положения линий сетки и может оптимизировать расположение сетки в соответствии с недавним движением цен.
Основные принципы этой стратегии:
Прежде всего, в зависимости от пользовательских настроек, определяется верхняя и нижняя границы сетки и количество линий сетки. Границы могут быть фиксированными значениями, а также могут быть автоматически рассчитаны на основе недавних высоких и низких точек или скользящих средних.
В пределах определенных границ разделить ценовой диапазон на несколько сеток. Каждая линия сетки соответствует цене покупки или продажи.
Каждый раз, когда цена касается сетчатой линии, стратегия проверяет, есть ли уже позиции, соответствующие этой сетчатой линии. Если нет, то пост покупается, а если есть, то продается.
Так, продавая по относительно высоким ценам и покупая по низким, стратегия может постоянно получать прибыль при колебаниях цен.
В то же время, если пользователь включил функцию автоматической корректировки границ, то местоположение линии сетки будет самостоятельно адаптироваться в зависимости от высоких и низких точек недавних цен или от установленного движущегося среднего значения, чтобы оптимизировать макет сетки.
С помощью вышеуказанных принципов стратегия позволяет реализовать автоматическую низкую покупку и высокую продажу в условиях ценовых колебаний и, в зависимости от тенденции, скорректировать позиции преимущества, что повышает общую прибыль.
Стратегия динамической сетки имеет следующие преимущества:
Высокая адаптивность. Можно адаптироваться к различным рынкам и сортам с помощью параметров, хорошо адаптируется к шокирующим ситуациям.
Высокий уровень автоматизации. Поскольку стратегия основана на строгой математической логике, то есть, когда открывается и закрывается позиция, можно полностью автоматизировать торговлю, уменьшая вмешательство субъективных эмоций.
Контролируемый риск. С помощью параметров, таких как количество и границы сетки, можно эффективно контролировать риск на каждой сделке, тем самым поддерживая общий риск в приемлемом диапазоне.
Тенденционная адаптивность. В стратегию добавлена функция динамической корректировки границ сетки, что позволяет сетке оптимизироваться в соответствии с ценовыми тенденциями, повышая прибыльность в условиях тенденций.
Поскольку сетчатая торговля по своей сути является частыми взлетами и падениями в ценовых колебаниях, эта стратегия может приносить устойчивую прибыль, если цены сохраняют колебания, поэтому в долгосрочной перспективе имеет высокую выигрышную долю.
Несмотря на очевидные преимущества этой стратегии, она сопряжена с определенными рисками:
Тренд-риск. В случае сильного одностороннего тренда цены, нарушающего границу сетки, пространство для получения прибыли для этой стратегии будет ограничено и может столкнуться с большим отступлением.
Оптимизация параметров имеет большую сложность. Стратегия имеет большое количество параметров, включая количество сеток, начальные границы, динамические границы и т. Д. Различные комбинации параметров оказывают большое влияние на эффективность стратегии, и практическая оптимизация имеет большую сложность.
Частые сделки. По сути, стратегия сетки является высокочастотной стратегией, и очень часто устанавливаются и закрываются позиции, что означает более высокие затраты на сделки и потенциальный риск скольжения.
Сильная зависимость от рынка. Стратегия сильно зависит от шокирующих рынков, и в случае, если цена вступает в быструю одностороннюю тенденцию, стратегия может столкнуться с большим отступлением.
В ответ на эти риски можно предпринять улучшения в следующих аспектах: добавление показателей определения тенденции в качестве фильтрующих условий для запуска стратегии, оптимизация пространства и методов поиска параметров, введение логики управления капиталом и контроля позиций, увеличение логики прорыва тенденции. С помощью этих оптимизаций можно еще больше повысить устойчивость и прибыльность этой стратегии.
Основываясь на приведенном выше анализе, можно сделать вывод о том, что стратегия оптимизирована в следующих областях:
Введение условий фильтрации тренда. Добавление показателей, определяющих тренд, таких как движущиеся средние, ADX и т. Д., до запуска стратегии. Стратегия запускается только в случае шокирующей ситуации, а в случае трендовой ситуации сохраняется ожидание, что позволяет эффективно избежать риска отступления в условиях трендовой ситуации.
Поиск оптимальных параметров. Использование интеллектуальных алгоритмов для оптимизации параметров сетки, таких как генетические алгоритмы, алгоритмы групп частиц и т. Д., Чтобы автоматически искать оптимальную комбинацию параметров, повысить эффективность и качество оптимизации.
Улучшение логики управления рисками. Добавление большей логики управления рисками в стратегию, например, изменение ширины сетки в зависимости от динамики ценовой волатильности, установка максимального отступного порога для запуска равных позиций и т. Д., Что позволяет лучше контролировать риск.
Введение трендового остановки. Установка трендового прорыва в пределах сдерживаемой линии, например, границы сетки в определенной пропорции, когда цена прорывает линию сдерживаемой линии и полностью сглаживает позицию, чтобы избежать большого отступления в трендовых условиях.
Оптимизация исполнения сделок. Оптимизация процессов исполнения сделок, например, использование более продвинутых алгоритмов формуляров и заказов, чтобы максимально снизить частоту и стоимость сделок и повысить эффективность исполнения.
Благодаря этим оптимизациям можно будет повысить адаптивность, устойчивость и рентабельность этой стратегии, чтобы она была ближе к реальным потребностям.
В целом, стратегия отслеживания тенденций в динамической сетке - это средне- и высокочастотная стратегия торговли, основанная на принципе торговли в сетке, в то же время включающая механизм динамической корректировки и адаптации к тенденциям. Ее преимущества заключаются в высокой адаптивности, высокой степени автоматизации, управляемом риске, хорошей адаптации к тенденции, стабильности прибыли и т. Д., Но в то же время существует и высокий риск тренда, трудность оптимизации параметров, частота торговли и зависимость от условий поведения.
Торговая концепция сетки сама по себе является относительно зрелым и практичным методом количественной оценки, а преимущества классической торговой концепции сетки расширяются и развиваются за счет динамической оптимизации стратегии и добавления механизмов адаптации к тенденциям. Она предлагает инвесторам новые методы и возможности количественной оценки при шокирующих ситуациях. После дальнейшей оптимизации и улучшения стратегия может стать отличным средне- и высокочастотным инструментом количественной оценки.
/*backtest
start: 2024-03-01 00:00:00
end: 2024-03-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("(IK) Grid Script", overlay=true, pyramiding=14, close_entries_rule="ANY", default_qty_type=strategy.cash, initial_capital=100.0, currency="USD", commission_type=strategy.commission.percent, commission_value=0.1)
i_autoBounds = input(group="Grid Bounds", title="Use Auto Bounds?", defval=true, type=input.bool) // calculate upper and lower bound of the grid automatically? This will theorhetically be less profitable, but will certainly require less attention
i_boundSrc = input(group="Grid Bounds", title="(Auto) Bound Source", defval="Hi & Low", options=["Hi & Low", "Average"]) // should bounds of the auto grid be calculated from recent High & Low, or from a Simple Moving Average
i_boundLookback = input(group="Grid Bounds", title="(Auto) Bound Lookback", defval=250, type=input.integer, maxval=500, minval=0) // when calculating auto grid bounds, how far back should we look for a High & Low, or what should the length be of our sma
i_boundDev = input(group="Grid Bounds", title="(Auto) Bound Deviation", defval=0.10, type=input.float, maxval=1, minval=-1) // if sourcing auto bounds from High & Low, this percentage will (positive) widen or (negative) narrow the bound limits. If sourcing from Average, this is the deviation (up and down) from the sma, and CANNOT be negative.
i_upperBound = input(group="Grid Bounds", title="(Manual) Upper Boundry", defval=0.285, type=input.float) // for manual grid bounds only. The upperbound price of your grid
i_lowerBound = input(group="Grid Bounds", title="(Manual) Lower Boundry", defval=0.225, type=input.float) // for manual grid bounds only. The lowerbound price of your grid.
i_gridQty = input(group="Grid Lines", title="Grid Line Quantity", defval=8, maxval=15, minval=3, type=input.integer) // how many grid lines are in your grid
f_getGridBounds(_bs, _bl, _bd, _up) =>
if _bs == "Hi & Low"
_up ? highest(close, _bl) * (1 + _bd) : lowest(close, _bl) * (1 - _bd)
else
avg = sma(close, _bl)
_up ? avg * (1 + _bd) : avg * (1 - _bd)
f_buildGrid(_lb, _gw, _gq) =>
gridArr = array.new_float(0)
for i=0 to _gq-1
array.push(gridArr, _lb+(_gw*i))
gridArr
f_getNearGridLines(_gridArr, _price) =>
arr = array.new_int(3)
for i = 0 to array.size(_gridArr)-1
if array.get(_gridArr, i) > _price
array.set(arr, 0, i == array.size(_gridArr)-1 ? i : i+1)
array.set(arr, 1, i == 0 ? i : i-1)
break
arr
var upperBound = i_autoBounds ? f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, true) : i_upperBound // upperbound of our grid
var lowerBound = i_autoBounds ? f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, false) : i_lowerBound // lowerbound of our grid
var gridWidth = (upperBound - lowerBound)/(i_gridQty-1) // space between lines in our grid
var gridLineArr = f_buildGrid(lowerBound, gridWidth, i_gridQty) // an array of prices that correspond to our grid lines
var orderArr = array.new_bool(i_gridQty, false) // a boolean array that indicates if there is an open order corresponding to each grid line
var closeLineArr = f_getNearGridLines(gridLineArr, close) // for plotting purposes - an array of 2 indices that correspond to grid lines near price
var nearTopGridLine = array.get(closeLineArr, 0) // for plotting purposes - the index (in our grid line array) of the closest grid line above current price
var nearBotGridLine = array.get(closeLineArr, 1) // for plotting purposes - the index (in our grid line array) of the closest grid line below current price
strategy.initial_capital = 50000
for i = 0 to (array.size(gridLineArr) - 1)
if close < array.get(gridLineArr, i) and not array.get(orderArr, i) and i < (array.size(gridLineArr) - 1)
buyId = i
array.set(orderArr, buyId, true)
strategy.entry(id=tostring(buyId), long=true, qty=(strategy.initial_capital/(i_gridQty-1))/close, comment="#"+tostring(buyId))
if close > array.get(gridLineArr, i) and i != 0
if array.get(orderArr, i-1)
sellId = i-1
array.set(orderArr, sellId, false)
strategy.close(id=tostring(sellId), comment="#"+tostring(sellId))
if i_autoBounds
upperBound := f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, true)
lowerBound := f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, false)
gridWidth := (upperBound - lowerBound)/(i_gridQty-1)
gridLineArr := f_buildGrid(lowerBound, gridWidth, i_gridQty)
closeLineArr := f_getNearGridLines(gridLineArr, close)
nearTopGridLine := array.get(closeLineArr, 0)
nearBotGridLine := array.get(closeLineArr, 1)