Стратегия спирального прорыва вверх скользящей средней


Дата создания: 2024-01-15 11:45:23 Последнее изменение: 2024-01-15 11:45:23
Копировать: 0 Количество просмотров: 546
1
Подписаться
1625
Подписчики

Стратегия спирального прорыва вверх скользящей средней

Обзор

Эта стратегия использует обобщенный индикатор спирального канала и индикатор разрыва, который создает сигнал покупки, когда цена прорывает верхнюю орбитальную линию и среднюю линию. Аналогичным образом, когда цена прорывает нижнюю орбитальную линию и среднюю линию, он создает сигнал продажи. Эта стратегия использует спиральный канал для определения направления тенденции цены и использует индикатор разрыва, чтобы обнаружить динамику цены, чтобы создать торговый сигнал на основе одновременного подтверждения обоих показателей, что позволяет получить лучшую выигрышную ставку.

Стратегический принцип

Стратегия основана на двух показателях:

  1. Спиральные каналы: рассчитывают нисходящую линию для определения направления тренда цены. Когда цена прорывается вверх, она поднимается, а когда она прорывается вниз, она падает.

  2. Показатель разрыва в цене (ROC): измеряет, ускоряется ли цена, используется для определения ценовой динамики. ROC больше, чем некоторое положительное значение, означает ускорение цены вверх, меньше, чем некоторое отрицательное значение, означает ускорение цены вниз.

При одновременном появлении многоугольных сигналов в спиральном канале и в диапазоне отклонений, создается сигнал к покупке. То есть цена должна одновременно прорваться вверх и показать признаки ускорения.

Такая комбинация позволяет повысить надежность сигналов и избежать слепой торговли без четкой тенденции.

Стратегические преимущества

  1. В совокупности с ценовым трендом и динамикой, сигнал более надежен, и выигрыш более высокий.

  2. С помощью оптимизации параметров можно скорректировать частоту торгов стратегии. Например, скорректировать параметры индикатора разрыва, чтобы контролировать чувствительность открытия позиций.

  3. Применение стоп-убытков для контроля одиночных убытков. Параметры можно настроить по своему желанию.

  4. Реабилитационный механизм позволяет отслеживать тенденции и в дальнейшем повышать рентабельность.

Стратегический риск

  1. Например, если вы не будете иметь возможности купить товар, то потеряете часть возможностей торговли, и ваша прибыльность будет ограничена.

  2. Прорывные стратегии легко ловятся в ловушку. Когда цены переворачиваются, это может привести к большим потерям.

  3. Неправильная настройка параметров может привести к тому, что торговые сигналы будут слишком частыми или редкими.

  4. Фиксированная стопроцентная стоп-страхование не может полностью предотвратить крупные индивидуальные потери.

Направление оптимизации стратегии

  1. Тестирование параметров показателя дифференцированной скорости для поиска оптимальной комбинации параметров.

  2. Проверка различных уровней стоп-лосса, балансировки коэффициентов убытков и побед.

  3. Добавление фильтров для других показателей, таких как индикатор мощности, индикатор колебаний и т. д., улучшает качество сигнала.

  4. Испытание различных рынков, чтобы найти сорта, наиболее подходящие для этой стратегии.

  5. Оптимизация стратегии управления позициями, использование различных позиций в различных рыночных условиях.

Подвести итог

Стратегия объединяет использование спиральных каналов и показателей разрыва в определении тенденций и динамики цен, а также способность поддерживать прибыль путем повторного входа и оптимизации параметров, обеспечивая при этом качество торговых сигналов. Контроль риска, основанный на фиксированном процентном стоп-лоске, может быть дополнительно оптимизирован. В целом, стратегия является полноценной и подходит в качестве базовой структуры для количественной торговли.

Исходный код стратегии
/*backtest
start: 2024-01-07 00:00:00
end: 2024-01-14 00:00:00
period: 45m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("SSL Chaikin BF 🚀", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
_0 = input(false,  "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

/////////////// Chaikin MF /////////////// 
_1 = input(false,  "═══════ Chaikin MF ═══════")
length = input(20, minval=1, title = "Chaikin SMA Length")
upperThreshold = input(0.04, step=0.01, title="Upper Threshold")
lowerThreshold = input(0.02, step=0.01, title="Lower Threshold")
ad = close==high and close==low or high==low ? 0 : ((2*close-low-high)/(high-low))*volume
mf = sum(ad, length) / sum(volume, length)

/////////////// SSL Channels /////////////// 
_2 = input(false,  "═════════ SSL ══════════")
len1=input(title="SMA Length 1", defval=12)
len2=input(title="SMA Length 2", defval=13)

smaHigh = sma(high, len1)
smaLow = sma(low, len2)

Hlv = 0
Hlv := close > smaHigh ? 1 : close < smaLow ? -1 : Hlv[1]
sslDown = Hlv < 0 ? smaHigh : smaLow
sslUp = Hlv < 0 ? smaLow : smaHigh

///////////// Rate Of Change ///////////// 
_3 = input(false,  "══════ Rate of Change ══════")
source = close
roclength = input(13, "ROC Length",  minval=1)
pcntChange = input(4, "ROC % Change", minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

///////////////  Strategy  /////////////// 
long = sslUp > sslDown and isMoving() or crossover(mf, upperThreshold)
short = sslUp < sslDown and isMoving() or crossunder(mf, lowerThreshold)

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

//////////////// Stop loss /////////////// 
_4 = input(false,  "════════ Stop Loss ═══════")
sl_inp = input(2.0, title='Stop Loss %') / 100

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution /////////////// 
if testPeriod()
    strategy.entry("L", strategy.long, when=long)
    strategy.entry("S", strategy.short, when=short)
    strategy.exit("L SL", "L", stop=long_sl, when=since_longEntry > 0)
    strategy.exit("S SL", "S", stop=short_sl, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
p1 = plot(sslDown, linewidth = 1, color=color.red)
p2 = plot(sslUp, linewidth = 1, color=color.lime)
fill(p1, p2,  color = sslDown < sslUp ? color.lime : color.red, transp=80)
bgcolor(isMoving() ? long ? color.green : short ? color.red : na : color.white, transp=80)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)
bgcolor(crossover(mf, upperThreshold) ? color.blue : crossunder(mf, lowerThreshold) ? color.orange : na, transp=30)