Эта стратегия разрабатывает стратегию обратной торговли, основанную на индикаторе Keltner Channel. Она оценивает сроки потенциальных переворотов цен, сравнивая цену с верхними и нижними рельсами Keltner Channel, и принимает соответствующие длинные и короткие позиции.
Эта стратегия использует индикатор Keltner Channel для оценки ценовых тенденций. Keltner Channel состоит из скользящей средней и среднего истинного диапазона (ATR). Верхняя рельса равна скользящей средней плюс N раз ATR; нижняя рельса равна скользящей средней минус N раз ATR. Когда цена проходит через нижнюю рельсу канала снизу вверх, считается, что бытовая сила усиливается и можно занять длинные позиции; когда цена проходит через верхнюю рельсу сверху вниз, считается, что медленная сила усиливается и можно занять короткие позиции.
Кроме того, основой стратегии для оценки возможностей отката является то, что цена снова касается или прорывается через границу канала. Например, после того, как цена поднимается, чтобы прорваться через нижнюю рельсу, если она снова падает, чтобы коснуться нижней рельсы, не касаясь верхней рельсы, это возможность для длительного отступления. Стратегия откроет длинные позиции в это время.
Это торговая стратегия, которая использует характеристики снижения цен.
Основными рисками этой стратегии являются:
Контрмеры:
Стратегия может быть оптимизирована в следующих аспектах:
Эта стратегия объединяет методы оценки тренда и обратной торговли, и имеет уникальные преимущества в обнаружении обратных тенденций.
/*backtest start: 2023-11-26 00:00:00 end: 2023-12-26 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("Keltner bounce from border. No repaint. (by Zelibobla)", shorttitle="Keltner border bounce", overlay=true) price = close // build Keltner keltnerLength = input(defval=200, minval=1, title="Keltner EMA Period Length") keltnerATRLength = input(defval=200, minval=1, title="Keltner ATR Period Length (the same as EMA length in classic Keltner Channels)") keltnerDeviation = input(defval=8, minval=1, maxval=15, title="Keltner band width (in ATRs)") closeOnEMATouch = input(type=bool, defval=false, title="Close trade on EMA touch? (less drawdown, but less profit and higher commissions impact)") enterOnBorderTouchFromInside = input(type=bool, defval=false, title="Enter on border touch from inside? (by default from outside, which is less risky but less profitable)") SL = input(defval=50, minval=0, maxval=10000, title="Stop loss in ticks (leave zero to skip)") EMA = sma(price, keltnerLength) ATR = atr(keltnerATRLength) top = EMA + ATR * keltnerDeviation bottom = EMA - ATR * keltnerDeviation buyEntry = crossover(price, bottom) sellEntry = crossunder(price, top) plot(EMA, color=aqua,title="EMA") p1 = plot(top, color=silver,title="Keltner top") p2 = plot(bottom, color=silver,title="Keltner bottom") fill(p1, p2) tradeSize = input(defval=1, minval=1, title="Trade size") if ( enterOnBorderTouchFromInside and crossunder(price, bottom) ) strategy.entry("BUY", strategy.long, qty=tradeSize, comment="BUY") else if( crossover(price, bottom) ) strategy.entry("BUY", strategy.long, qty=tradeSize, comment="BUY") if( crossover(price,EMA) and closeOnEMATouch ) strategy.close("BUY") if( 0 != SL ) strategy.exit("EXIT BUY", "BUY", qty=tradeSize, loss=SL) strategy.exit("EXIT SELL", "SELL", qty=tradeSize, loss=SL) if( enterOnBorderTouchFromInside and crossover(price, bottom) ) strategy.entry("SELL", strategy.long, qty=tradeSize, comment="SELL") else if ( crossunder(price, top) ) strategy.entry("SELL", strategy.short, qty=tradeSize, comment="SELL") if( crossunder(price, EMA) and closeOnEMATouch ) strategy.close("SELL")