
Основная идея этой стратегии заключается в том, чтобы использовать индикатор Ratio OCHL Averager с различными циклами для построения нескольких средних линий и создания сигнала покупки или продажи в зависимости от перекрестной формы средних линий. Она может динамически улавливать ценовые тенденции и подходит для среднесрочных и краткосрочных торгов.
В этой стратегии используются два разных цикла Ratio OCHL Averager, как быстрые и медленные линии. Формула расчета Ratio OCHL Averager выглядит так:
b = abs(close-open)/(high - low)
c = min(max(b, 0), 1)
Ratio OCHL Averager = c*close + (1-c)*前一日Ratio OCHL Averager
Ratio OCHL Averager включает в себя четыре цены: открытие, закрытие, максимум и минимум, чтобы построить среднюю линию.
Эта стратегия устанавливает короткий и длинный циклы быстрого и медленного движения. При прохождении медленного пути на быстром пути появляется сигнал покупки, а при прохождении медленного пути на коротком пути появляется сигнал продажи.
Ratio OCHL Averager позволяет сгладить данные о ценах, эффективно отфильтровывая рыночный шум и делая торговые сигналы более надежными.
Двойная равнолинейная пересека в сочетании с различными циклами определяет направление тренда, что позволяет лучше определить начало нового тренда.
Периодические параметры быстрой и медленной линий могут быть адаптированы к различным рыночным условиям.
Стратегическая концепция проста, интуитивно понятна и легко реализуема.
Гибкость в установке стандартов стоп-стоп для устранения убытков и контроля риска.
Стратегия равнолинейного пересечения может привести к появлению большего количества ложных сигналов, что требует фильтрации в сочетании с другими техническими показателями.
Недостатки в выборе параметров могут повлиять на эффективность стратегии.
Стратегия двойного равнолинейного пересечения относится к стратегии отслеживания тенденции, она не подходит для шокирующих ситуаций, а должна использоваться для тенденционных ситуаций.
Необходимо соответствующим образом изменить точку остановки для снижения риска потерь, а также разумно установить точку остановки.
Можно рассмотреть возможность фильтрации сигнала в сочетании с динамическими индикаторами, чтобы повысить качество сигнала. Например, MACD, KDJ и т. Д.
Можно тестировать различные комбинации параметров быстрого и медленного цикла, чтобы найти оптимальный параметр.
Оптимизируйте остановку на основе результатов обратной связи, чтобы найти оптимальную настройку.
Можно рассматривать параметры динамической корректировки в определенных рыночных условиях, например, увеличение циклических параметров при колебаниях в крупных биржах.
Общая концепция стратегии ясна и понятна, она является динамической стратегией отслеживания, подходящей для краткосрочных и среднесрочных сделок. Существует большой простор для оптимизации, эффективность стратегии может быть улучшена путем корректировки параметров, фильтрации сигналов и т. Д. В целом, это гибкая и практичная стратегия торговли тенденциями.
/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="[XC] Adaptive Strategy V3 - Ratio OCHL Averager no repaint",shorttitle="R_OHCL", overlay=true, currency=currency.EUR,initial_capital=10000,
default_qty_value=100, default_qty_type=strategy.percent_of_equity , calc_on_every_tick=false, calc_on_order_fills=true)
// ╔═ SETTINGS ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░
strategy_1 = input ( defval=true , type=input.bool , title="STRATEGY 1? —>" )
Recursive = input(false)
RES201 = "Min",RES202= "D",RES203 = "W",RES204 = "M"
//++ Resolution 1 ++
inp_resolution1 = input(600, minval=1, title="Resolution Line 1")
restype1 = input ( defval="Min" , type=input.string , title= "Resolution Line 1" , options=[ "Min","D","W","M"])
multiplier1 = restype1 == "Min" ? "" : restype1 == "D" ? "D" : restype1 == "W" ? "W" : "M"
resolution1 = tostring(inp_resolution1)+ multiplier1
//++ Resolution 2 ++
inp_resolution2 = input(1440, minval=1, title="Resolution Line 2")
restype2 = input ( defval="Min" , type=input.string , title= "Resolution Line 2" , options=["Min","D","W","M"])
multiplier2 = restype2 == "Min" ? "" : restype2 == "D" ? "D" : restype2 == "W" ? "W" : "M"
resolution2 = tostring(inp_resolution2)+ multiplier2
StopLoss = input(defval = 500 , title = "Stop Loss", minval = 0)
TakeProfit = input(defval = 2500 , title = "Take Profit", minval = 0)
// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit = TakeProfit >= 1 ? TakeProfit : na
useStopLoss = StopLoss >= 1 ? StopLoss : na
// ╔═ BACKTEST RANGE ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░
line_breakBTR = input ( defval = true , type=input.bool , title="BACKTEST RANGE —" )
FromYear = input ( defval = 2019, title = "From Year", minval = 2017)
FromMonth = input ( defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay = input ( defval = 2, title = "From Day", minval = 1, maxval = 31)
//FromHour = input ( defval = 1, title = "From Hour", minval = 1, maxval = 24)
ToYear = input ( defval = 9999, title = "To Year", minval = 2017)
//ToHour = input ( defval = 0, title = "From Hour", minval = 0, maxval = 24)
ToMonth = input ( defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay = input ( defval = 1, title = "To Day", minval = 1, maxval = 31)
// === FUNCTION EXAMPLE ===
start = timestamp(syminfo.timezone, FromYear, FromMonth, FromDay, 0, 00) // backtest start window
finish = timestamp(syminfo.timezone, ToYear , ToMonth , ToDay , 0, 59) // backtest finish window
window() => time >= start and time <= finish ? true : false // create function "within window of time"
// ╔═ INDICATOR ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░
// "Ratio OCHL Averager" -> alexgrover / tradingview.com/script/RGAtOI6h-Ratio-OCHL-Averager-An-Alternative-to-VWAP/
rochla( res,Recursive)=>
//Recursive = false
H = security(syminfo.tickerid,res,high[1],gaps = barmerge.gaps_off, lookahead = barmerge.lookahead_on)
L = security(syminfo.tickerid,res,low[1] ,gaps = barmerge.gaps_off, lookahead = barmerge.lookahead_on)
d = 0.
//----
a = Recursive ? nz(d[1],open) : open
b = abs(close-a)/(H - L)
c = b > 1 ? 1 : b
d := c*close+(1-c)*nz(d[1],close)
strat1_line1=rochla(resolution1,Recursive)
strat1_line2=rochla(resolution2,Recursive)
plot(strat1_line1, title="Ratio OCHL Averager 1", color=#DAA520,linewidth=2,transp=0)
plot(strat1_line2, title="Ratio OCHL Averager 2", color=#B22222,linewidth=2,transp=0)
// ╔═ STRATEGY 1 ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░
trading_strat1_line1 = strategy_1 == 1 ? strat1_line1 : na
trading_strat1_line2 = strategy_1 == 1 ? strat1_line2 : na
longCross = crossunder (trading_strat1_line2, trading_strat1_line1) ? true : false
shortCross = crossover (trading_strat1_line2, trading_strat1_line1) ? true : false
plot( longCross ? trading_strat1_line1 : na , title = "Long" , color=color.aqua, style=plot.style_circles, linewidth=5, offset= 0)
plot( shortCross ? trading_strat1_line2 : na , title = "Short" , color=color.red , style=plot.style_circles, linewidth=5, offset= 0)
// ╔═ Backtest 1 ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░
strategy.exit("close",loss = useStopLoss, profit = useTakeProfit)
if longCross and window() and strategy_1 == 1
strategy.entry("Go Long", strategy.long)
if shortCross and window() and strategy_1 == 1
strategy.entry("Go Short", strategy.short)
//end