Персонализированная стратегия торговли импульсом

Автор:Чао Чжан, Дата: 2023-11-23 15:18:27
Тэги:

img

Обзор

Это персонализированная торговая стратегия, которая сочетает в себе индикаторы импульса и фильтрацию объектов свечей. Она широко использует три технических индикатора - Stochastic Momentum Index, быстрый RSI и фильтрацию объектов свечей для реализации стратегии, основанной на прорыве импульса, а также учитывает условия перекупки и перепродажи.

Логика торговли

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

  1. Индекс стохастического импульса (SMI): он сочетает в себе расстояние между объектами свечей и относительную позицию цены закрытия, чтобы судить о силе или слабости импульса цены. Он генерирует сигнал покупки, когда SMI пересекает границу, и сигнал продажи, когда пересекает границу.

  2. Быстрый RSI (7-дневная линия): он оценивает условия перекупления и перепродажи цен. RSI ниже 20 генерирует сигнал покупки как перепроданный, а выше 80 генерирует сигнал продажи как перекупленный.

  3. Фильтр объектов свечей: рассчитывает средний размер объектов свечей за последние 10 дней. Включает сигнал только тогда, когда сегодняшний объект свечей превышает треть этого среднего, чтобы избежать недействительных сигналов.

Стратегия сначала оценивает сигналы от SMI и RSI. Если выполнено любое требование к сигналу индикатора, затем комбинируют фильтр свечей, чтобы определить, является ли этот сигнал действительным, и генерируют торговый сигнал, если он действителен.

Анализ преимуществ

Стратегия имеет следующие преимущества:

  1. Суждение более точное и надежное при сочетании нескольких показателей.

  2. Добавление фильтра свечей исключает недействительные сигналы.

  3. Сочетание условий перекупки и перепродажи позволяет легче улавливать сигналы в точке переворота тренда.

  4. Увеличение возможностей получения при двойной длинной/короткой торговле.

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

Анализ рисков

Стратегия также сопряжена с некоторыми рисками:

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

  2. Частичная торговля позициями не может полностью использовать возможности тренда в каждом направлении.

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

  4. Частая торговля с двусторонней стратегией увеличивает затраты на транзакции.

Руководство по оптимизации

Стратегия может быть дополнительно оптимизирована в следующих аспектах:

  1. Оптимизировать параметры для SMI и RSI для поиска наилучших комбинаций параметров.

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

  3. Добавить стратегии стоп-лосса для снижения риска одноразовых потерь.

  4. Объедините больше показателей для оценки надежности сигнала и уменьшения ложных сигналов.

  5. Принять эффективные контракты для снижения затрат на транзакции.

Заключение

Стратегия широко использует SMI, быстрые показатели RSI и индикаторы фильтрации свечей для реализации персонализированной торговой стратегии, основанной на импульсе, с осознанием перекупленности / перепродажи. Она имеет такие преимущества, как точное суждение, идентификация действительных сигналов, сочетание условий перекупленности / перепродажи и двунаправленной торговли, но также такие риски, как чувствительность параметров, неспособность полностью капитализировать тенденции и частые операции.


/*backtest
start: 2023-10-23 00:00:00
end: 2023-11-22 00:00:00
period: 6h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Stochastic Strategy v1.2", shorttitle = "Stochastic str 1.2", overlay = false, 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")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
usesmi = input(true, defval = true, title = "Use SMI Strategy")
usersi = input(true, defval = true, title = "Use RSI Strategy")
usebod = input(true, defval = true, title = "Use Body-Filter")
a = input(5, "SMI Percent K Length")
b = input(3, "SMI Percent D Length")
limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
fromyear = input(2017, defval = 2017, 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")

//Fast RSI
fastup = rma(max(change(close), 0), 7)
fastdown = rma(-min(change(close), 0), 7)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Stochastic Momentum Index
ll = lowest (low, a)
hh = highest (high, a)
diff = hh - ll
rdiff = close - (hh+ll)/2
avgrel = ema(ema(rdiff,b),b)
avgdiff = ema(ema(diff,b),b)
SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0
SMIsignal = ema(SMI,b)

//Lines
plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index")
plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line")
plot(limit, color = black, title = "Over Bought")
plot(-1 * limit, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 3 or usebod == false

//Signals
up1 = SMI < -1 * limit and close < open and body and usesmi
dn1 = SMI > limit and close > open and body and usesmi
up2 = fastrsi < 20 and close < open and body and usersi
dn2 = fastrsi > 80 and close > open and body and usersi
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up1 or up2
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn1 or dn2
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Больше