Комплексная стратегия технического индикатора


Дата создания: 2023-10-07 15:34:33 Последнее изменение: 2023-10-07 15:34:33
Копировать: 0 Количество просмотров: 779
1
Подписаться
1617
Подписчики

Обзор

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

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

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

  1. Супертенденциальный индикатор ((SuperTrend): в зависимости от ATR рассчитывается верхняя и нижняя полосы, цена пробивает верхнюю полосу, пробивает нижнюю полосу;

  2. Простая скользящая средняя ((SMA): цена выше по SMA, ниже по SMA;

  3. Показатель динамики (Momentum): ценовая динамика положительная, положительная, отрицательная, отрицательная;

  4. MACD: DIFF с лихвой вверх и лихвой вниз от линии DEA;

  5. “Булл и Беар” (Bull and Bear): “Булл и Беар” (Bull and Bear): “Булл и Беар” (Bull and Bear): “Булл и Беар” (Bull and Bear): “Булл и Беар” (Bull and Bear): “Булл и Беар” (Bull and Bear): “Булл и Беар” (Bull and Bear): “Булл и Беар”

  6. RSI: RSI выше 30 и ниже 70.

  7. Ячеиная линия: N последовательных ячеиных линий, N последовательных ячеиных линий;

  8. CCI: CCI больше 100 плюс, меньше 100 минус;

  9. DMI: DMI-поливоны больше, чем пустые, и пустые, наоборот;

  10. Рыночные волны: оценка того, что цены на рынке слишком высоки, а низкие волны пусты;

  11. Случайный индикатор: на случайном индикаторе проделывайте 20 линий больше, а на нижнем проделывайте 80 линий.

Результаты вычислений этих индикаторов дают 1 или -1 балл в зависимости от направления вверх или вниз. Если суммировать все баллы индикаторов, то получается суммарное количество баллов.

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

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

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

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

Однако есть некоторые риски, о которых следует помнить:

  1. Если выбранная индикаторная корреляция слишком высока, возникает риск дублирования сигналов. Это требует комбинации индикаторов с низкой корреляцией в зависимости от различных рыночных условий.

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

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

  4. В зависимости от рыночной фазы, эффективность индикаторов может варьироваться. Необходимо постоянно проверять их эффективность с помощью прокрутки.

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

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

  1. Оптимизируйте количество и разновидности индикаторов, чтобы выбрать оптимальную комбинацию.

  2. Оптимизация параметров каждого индикатора;

  3. Изменение весового соотношения индикаторов, повышение веса ключевых индикаторов;

  4. Добавление фильтров условий, таких как всплеск объемов торгов, для предотвращения ложных прорывов;

  5. Применение метода портфеля моделей для автоматического поиска оптимального портфеля стратегий с помощью алгоритмов машинного обучения.

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

В целом, эта многоиндикаторная комбинационная стратегия использует преимущества различных индикаторов, объединяет направление тренда, может уменьшить ложные сигналы и повысить надежность сигнала. Благодаря оптимизации выбора индикаторов, параметров, распределения веса и т. Д., можно постоянно повышать стабильность стратегии.

Исходный код стратегии
/*backtest
start: 2023-01-01 00:00:00
end: 2023-10-06 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Super indicator ", 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


hilow = ((high - low)*100)
openclose = ((close - open)*100)
vol1 = (volume / hilow)
spreadvol = (openclose * vol1)
VPT = spreadvol + cum(spreadvol)
window_len = 28

v_len = 14
price_spread = stdev(high-low, window_len)

vp =  spreadvol + cum(spreadvol)
smooth = sma(vp, v_len)
v_spread = stdev(vp - smooth, window_len)
shadow = (vp - smooth) / v_spread * price_spread

out1 = shadow > 0 ? high + shadow : low + shadow

//plot(out, style=line,linewidth=3, color=color)
len=5
vpt=ema(out1,len)


// INPUTS //
st_mult   =3
st_period = 7

// CALCULATIONS //
up_lev = vpt - (st_mult * atr(st_period))
dn_lev = vpt + (st_mult * atr(st_period))

up_trend   = 0.0
up_trend   := close[1] > up_trend[1]   ? max(up_lev, up_trend[1])   : up_lev

down_trend = 0.0
down_trend := close[1] < down_trend[1] ? min(dn_lev, down_trend[1]) : dn_lev

// Calculate trend var
trend10 = 0
trend10 := close > down_trend[1] ? 1: close < up_trend[1] ? -1 : nz(trend10[1], 1)

// Calculate SuperTrend Line
st_line = trend10 ==1 ? up_trend : down_trend

//
src = input(close, title="Source")
//sma
sma20 = sma(src, 20)
smapoint = 0
smapoint := src > sma20 ? smapoint + 1 : smapoint - 1


//AO
ao = sma(hl2,5) - sma(hl2,34)
aopoint = ao > 0 ? 1 : ao < 0 ? -1 : 0
//momentum
mom = src - src[14]
mompoint = mom > 0 ? 1 : mom < 0 ? -1 : 0
//MACD
fast_ma = ema(src, 12)
slow_ma = ema(src, 26)
macd = fast_ma - slow_ma
signal = ema(macd, 9)
hist = macd - signal
histpoint = hist > hist[1] ? 3 : -3

//Bull bear
Length = 30
r1=iff(close[1]<open,max(open-close[1],high-low),high-low)
r2=iff(close[1]>open,max(close[1]-open,high-low),high-low)
bull=iff(close==open,iff(high-close==close-low,iff(close[1]>open,max(high-open,close-low),r1),iff(high-close>close-low,iff(close[1]<open, max(high-close[1],close-low), high-open),r1)),iff(close<open,iff(close[1]<open,max(high-close[1],close-low), max(high-open,close-low)),r1))
bear=iff(close==open,iff(high-close==close-low,iff(close[1]<open,max(open-low,high-close),r2),iff(high-close>close-low,r2,iff(close[1]>open,max(close[1]-low,high-close), open-low))),iff(close<open,r2,iff(close[1]>open,max(close[1]-low,high-close),max(open-low,high-close))))
colors=iff(sma(bull-bear,Length)>0, color.green, color.red)
// barcolor(colors)
bbpoint = sma(bull-bear,Length)>0 ? 1 : -1
//UO
length7 = 7,
length14 = 14,
length28 = 28
average(bp, tr_, length) => sum(bp, length) / sum(tr_, length)
high_ = max(high, src[1])
low_ = min(low, src[1])
bp = src - low_
tr_ = high_ - low_
avg7 = average(bp, tr_, length7)
avg14 = average(bp, tr_, length14)
avg28 = average(bp, tr_, length28)
uoout = 100 * (4*avg7 + 2*avg14 + avg28)/7
uopoint = uoout > 70 ? 1 : uoout < 30 ? -1 : 0
//IC
conversionPeriods = 9
basePeriods = 26
laggingSpan2Periods = 52
displacement = 26
donchian(len) => avg(lowest(len), highest(len))
baseLine = donchian(basePeriods)
icpoint = src > baseLine ? 1 : -1

//HMA
hullma = wma(2*wma(src, 9/2)-wma(src, 21), round(sqrt(21)))
hmapoint = src > hullma ? 2 : -2
//
//
trendDetectionLength =4
float trend = na
float wave = na
float vol = na
mov = close>close[1] ? 1 : close<close[1] ? -1 : 0
trend := (mov != 0) and (mov != mov[1]) ? mov : nz(trend[1])
isTrending = rising(close, trendDetectionLength) or falling(close, trendDetectionLength)
wave := (trend != nz(wave[1])) and isTrending ? trend : nz(wave[1])
vol := wave == wave[1] ? (nz(vol[1])+volume) : volume
up1 = wave == 1 ? vol : 0
dn1 = wave == 1 ? 0 : vol
Weis= up1 > dn1 ? 2 : -2


//

roclen =20
ccilen =21
dilen = 5
dirmov(len) =>
	up = change(high)
	down = -change(low)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, len) / truerange)
	minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, len) / truerange)
	[plus, minus]

f_draw_infopanel(_x, _y, _line, _text, _color)=>
    _rep_text = ""
    for _l = 0 to _line
        _rep_text := _rep_text + "\n"
    _rep_text := _rep_text + _text
    var label _la = na
    label.delete(_la)
    _la := label.new(
         x=_x, y=_y, 
         text=_rep_text, xloc=xloc.bar_time, yloc=yloc.price, 
         color=color.black, style=label.style_labelup, textcolor=_color, size=size.normal)

TD = 0
TS = 0
TD := close > close[4] ? nz(TD[1]) + 1 : 0
TS := close < close[4] ? nz(TS[1]) + 1 : 0
TDUp = TD - valuewhen(TD < TD[1], TD , 1 )
TDDn = TS - valuewhen(TS < TS[1], TS , 1 )
td = TDUp > 0 ? 2 : TDDn > 0 ? -2 : 0
roc = roc(close, roclen)
Roc=roc > 0 ? 1 : -1
cci = cci(close, ccilen)
CCI=cci > 0? 2 : -2
[plus, minus] = dirmov(dilen)
dmi = plus - minus
DMI= dmi >= 0? 2 : -2
//
STT=trend10 == 1 ? 1 : -1
//
periods = 2
smooth1 =  14
price = close
fn(src, length) => 
    MA_s= 0.0
    MA_s:=(src + nz(MA_s[1] * (length-1)))/length
    MA_s
r11 = ema( price, periods ) 
r22 = iff( price > r11, price - r11, 0 ) 
r3 = iff( price < r11, r11 - price, 0 ) 
r4 = fn( r22, smooth1 ) 
r5 = fn( r3, smooth1 ) 
rr = iff( r5 == 0, 100, 100 - ( 100 / ( 1 + ( r4 / r5 ) ) ) ) 

length = 20,fast = 7,slow = 13
//
src10 = rr
er = abs(change(src,length))/sum(abs(change(src10)),length)
dev = er*stdev(src10*2,fast) + (1-er)*stdev(src10*2,slow)
a = 0.
a := bar_index < 9 ? src10 : src10 > a[1] + dev ? src10 : src10 < a[1] - dev ? src10 : a[1]
//

rsi=fixnan(a > a[1] ? 3 : a < a[1] ?-3 : na)
//
totalpoints =rsi+td+STT+Roc+DMI+ CCI+Weis+smapoint  + aopoint + mompoint + histpoint  + bbpoint  + icpoint  + hmapoint
//
piz=input(1)
tt=sma(totalpoints,piz)

//

zero=0
down = crossunder(tt, 0) 
up = crossover(tt, -0) 

//Alerts
/////// Alerts /////
alertcondition(down,title="sell")
alertcondition(up,title="buy")
//
/////////////// Strategy /////////////// 
long = up
short = down

strategy.entry("Long", strategy.long, when = long) 
strategy.entry("Short", strategy.short, when = short)