
Эта стратегия основана на индексе товарного канала (CCI) и предназначена для того, чтобы делать больше при перепродаже и делать меньше при перекупе. Она также опционально использует индексный перемещающийся средний (EMA) фильтр, чтобы контролировать торговлю только в направлении тенденции.
Использование показателя CCI для определения рыночных тенденций
CCI измеряет динамику, сравнивая текущие цены со средними за определенный период
CCI above 150 - это перекуп, below -100 - это перепродажа
Необходимо использовать EMA filter
Продолжайте торговать только в том случае, если цена выше EMA, и прекращайте торговать, если цена ниже EMA.
Используйте EMA для определения направления тренда и избегайте торговли против тренда
Существует два способа остановить потерю.
Стоп-стоп на основе фиксированного процента: используйте фиксированный процент от цены входа, чтобы установить стоп-стоп
Стоп-стоп на основе ATR: используйте множители ATR для установки стоп-стопа, а затем вычислите стоп-стоп на основе коэффициента возврата риска
Условия приема
CCI проходит через линию 100.
CCI пропускает 150 линий
Если EMA включена, то только тогда, когда цена выше EMA, и только тогда, когда цена ниже EMA.
Условия игры
Стоимость достигла остановки на убыточном уровне
CCI вновь входит в зону сверхпокупок и сверхпродаж
Картины
Использование CCI для определения перепродажи - классический метод, используемый для определения перекупа
Опциональная EMA гарантирует, что торговля будет вестись только в направлении тренда, а не наоборот.
Предоставление двух стоп-стоп способов, параметры которых могут быть скорректированы в зависимости от рынка
Показатель CCI позволяет снова войти в зону перекупа и перепродажи, чтобы погасить позиции и закрепить обратный тренд на прибыли
Карта с выделенным сигналом CCI, легко читаемая
Логика стратегии ясна, проста, легко понятна и оптимизируется
Задержка показателей CCI, возможно, пропущенный поворот или создание ложного сигнала
Неправильная настройка параметров EMA может пропустить тренд или отменить стратегию
Процентная остановка убытков затрудняет адаптацию к изменениям рынка, предполагая более широкие параметры
ATR-остановка чувствительна к интервальным циклам и должна быть настроена на оптимальные параметры
Риск вывода выше, следует адаптировать управление позициями
Эффективность: параметры показателя должны оцениваться в зависимости от изменения рыночной ситуации
Оценка параметров CCI для разных циклов, чтобы найти оптимальную комбинацию параметров
Испытание различных циклов EMA для определения наиболее подходящего цикла оценки тренда
Настройка стоп-стоп параметров для достижения оптимального риска-прибыли соотношения
Добавление дополнительных фильтров, таких как объем транзакций, для дальнейшей фильтрации ложных сигналов.
Формографические суждения в сочетании с трендовыми линиями или графиками для повышения эффективности
Добавление стратегий управления позициями, таких как фиксированные позиции, для контроля риска вывода
Общий анализ данных различных рыночных условий, динамические параметры корректировки
Стратегия применяет классический принцип перекупа и перепродажи показателя CCI для входа. Включение фильтра EMA позволяет контролировать направление тренда.
/*backtest
start: 2023-09-24 00:00:00
end: 2023-10-24 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © alifer123
//@version=5
// strategy("CCI+EMA Strategy with Percentage or ATR TP/SL [Alifer]", shorttitle = "CCI_EMA_%/ATR_TP/SL", overlay=false,
// initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10, commission_type=strategy.commission.percent, commission_value=0.045)
length = input(14, "CCI Length")
overbought = input.int(150, step = 10, title = "Overbought")
oversold = input.int(-140, step = 10, title = "Oversold")
src = hlc3
ma = ta.sma(src, length)
cci = (src - ma) / (0.015 * ta.dev(src, length))
// EMA
useEMA = input(true, "Use EMA", tooltip = "Only enters long when price is above the EMA, only enters short when price is below the EMA")
emaLength = input(55, "EMA Length")
var float ema = na
if useEMA
ema := ta.ema(src, emaLength)
// Take Profit and Stop Loss Method
tpSlMethod_percentage = input(true, "Percentage TP/SL", group="TP/SL Method")
tpSlMethod_atr = input(false, "ATR TP/SL", group="TP/SL Method")
// Percentage-based Take Profit and Stop Loss
tp_percentage = input.float(10.0, title="Take Profit (%)", step=0.1, group="TP/SL Method")
sl_percentage = input.float(10.0, title="Stop Loss (%)", step=0.1, group="TP/SL Method")
// ATR-based Take Profit and Stop Loss
atrLength = input(20, title="ATR Length", group="TP/SL Method")
atrMultiplier = input(4, title="ATR SL Multiplier", group="TP/SL Method")
riskRewardRatio = input(2, title="Risk Reward Ratio", group="TP/SL Method")
// Calculate TP/SL levels based on the selected method, or leave them undefined if neither method is selected
longTP = tpSlMethod_percentage ? strategy.position_avg_price * (1 + tp_percentage / 100) : na
longSL = tpSlMethod_percentage ? strategy.position_avg_price * (1 - sl_percentage / 100) : na
shortTP = tpSlMethod_percentage ? strategy.position_avg_price * (1 - tp_percentage / 100) : na
shortSL = tpSlMethod_percentage ? strategy.position_avg_price * (1 + sl_percentage / 100) : na
if tpSlMethod_atr
longSL := strategy.position_avg_price - ta.atr(atrLength) * atrMultiplier
longTP := ((strategy.position_avg_price - longSL) * riskRewardRatio) + strategy.position_avg_price
shortSL := strategy.position_avg_price + ta.atr(atrLength) * atrMultiplier
shortTP := ((strategy.position_avg_price - shortSL) * riskRewardRatio) - strategy.position_avg_price
// Enter long position when CCI crosses below oversold level and price is above EMA
longCondition = ta.crossover(cci, oversold) and (not useEMA or close > ema)
if longCondition
strategy.entry("Buy", strategy.long)
// Enter short position when CCI crosses above overbought level and price is below EMA
shortCondition = ta.crossunder(cci, overbought) and (not useEMA or close < ema)
if shortCondition
strategy.entry("Sell", strategy.short)
// Close long positions with Take Profit or Stop Loss
if strategy.position_size > 0
strategy.exit("Long Exit", "Buy", limit=longTP, stop=longSL)
// Close short positions with Take Profit or Stop Loss
if strategy.position_size < 0
strategy.exit("Short Exit", "Sell", limit=shortTP, stop=shortSL)
// Close positions when CCI crosses back above oversold level in long positions or below overbought level in short positions
if ta.crossover(cci, overbought)
strategy.close("Buy")
if ta.crossunder(cci, oversold)
strategy.close("Sell")
// Plotting
color_c = cci > overbought ? color.red : (cci < oversold ? color.green : color.white)
plot(cci, "CCI", color=color_c)
hline(0, "Middle Band", color=color.new(#787B86, 50))
obband = hline(overbought, "OB Band", color=color.new(#78867a, 50))
osband = hline(oversold, "OS Band", color=color.new(#867878, 50))
fill(obband, osband, color=color.new(#787B86, 90))