
Эта стратегия основана на индикаторе ценового канала, в которой установлены динамические параметры, которые образуют среднюю линию ценового канала путем вычисления среднего значения максимальных и минимальных цен за разные циклы и используют ее в качестве ориентира для установления длинной и короткой линий. Когда цена пробивает длинную линию, делайте больше; когда цена пробивает короткую линию, делайте пустую.
Эта стратегия использует индикатор ценового канала, чтобы рассчитать среднее значение наивысшей и самой низкой цены в течение разных периодов, образуя среднюю линию ценового канала. Используя среднюю линию в качестве основы, устанавливайте длинную и короткую линию с помощью параметров сдвига. В частности, формула для расчета длинной линии: средняя линия + (((средняя линия × длинная линия параметры %); формула для расчета короткой линии: средняя линия + (((средняя линия × короткая линия параметры %).
Когда цена ниже длинной линии, используйте ограничительную линию, чтобы открыть многополюс; когда цена выше короткой линии, используйте ограничительную линию, чтобы открыть многополюс. Стоп-убыток многополюса заключается в том, что цена возвращается к средней линии канала.
Эта стратегия имеет следующие преимущества:
Однако эта стратегия также несет в себе некоторые риски:
Оптимизация параметров, установка стоп-лосса или решение в сочетании с другими показателями может снизить вышеуказанный риск.
Эта стратегия может быть оптимизирована в следующих аспектах:
Эта стратегия основана на четкой концепции дизайна индикатора ценового канала, использование прорывного открытия позиции может эффективно контролировать риск. Но также существует большой простор для оптимизации параметров, механизм остановки убытков должен быть усовершенствован. В целом, эта стратегия имеет некоторую практическую ценность и заслуживает дальнейшего тестирования и оптимизации.
/*backtest
start: 2022-11-29 00:00:00
end: 2023-12-05 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//Noro
//2018
//@version=3
strategy(title = "Noro's PCMA Strategy v1.0", shorttitle = "PCMA 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)
//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot, %")
per = input(3, title = "Length")
shortlevel = input(10.0, title = "Short line (red)")
longlevel = input(-5.0, title = "Long line (lime)")
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")
//Price Channel
h = highest(high, per)
l = lowest(low, per)
c = (h + l) / 2
ll = c + ((c / 100) * longlevel)
sl = c + ((c / 100) * shortlevel)
//Lines
shortcolor = needshort ? red : na
longcolor = needlong ? lime : na
plot(sl, linewidth = 2, color = shortcolor, title = "Short line")
plot(c, linewidth = 2, color = blue, title = "SMA line")
plot(ll, linewidth = 2, color = longcolor, title = "Long line")
//Trading
size = strategy.position_size
lot = 0.0
lot := size == 0 ? strategy.equity / close * capital / 100 : lot[1]
if (not na(close[per])) and size == 0 and needlong
strategy.entry("L", strategy.long, lot, limit = ll, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
if (not na(close[per])) and size == 0 and needshort
strategy.entry("S", strategy.short, lot, limit = sl, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
if (not na(close[per])) and size > 0
strategy.entry("Close", strategy.short, 0, limit = c, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
if (not na(close[per])) and size < 0
strategy.entry("Close", strategy.long, 0, limit = c, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
if time > timestamp(toyear, tomonth, today, 23, 59)
strategy.close_all()