Die Strategie verwendet mehrere technische Indikatoren, um die Preisentwicklung zu beurteilen und Kauf- und Verkaufssignale zu senden.
Die Strategie beurteilt die Preisentwicklung anhand folgender technischer Indikatoren:
Supertrend-Indikator ((SuperTrend): nach ATR berechnet Auf- und Abwärtstrend, der Preis brechen Aufwärtstrend zu viel, brechen Unterwärtstrend zu wenig;
Einfacher Moving Average (SMA): Der Preis ist höher als der SMA und niedriger als der SMA.
Momentum: Preisbewegung ist positiv und negativ.
MACD: DIFF ist nach oben über die DEA-Linie und nach unten über die DEA-Linie.
Bull and Bear: Mehrköpfige Kraft ist größer als leere Kraft, um mehr zu tun, umsonst zu tun.
RSI: Der RSI ist über der 30er Linie und unter der 70er Linie leer.
Sonnen- und Sonneneinstrahlung: N Sonnen- und Sonneneinstrahlung in Folge, und N Sonnen- und Sonneneinstrahlung in Folge.
CCI: CCI ist größer als 100 und kleiner als 100
DMI: DMI-Mehrköpfe sind größer als die Leerköpfe, was wiederum Leerköpfe bedeutet.
Die Beurteilung, dass die Preise im Auf- und Abwärtstrend überschüssig sind und im Abwärtstrend leer sind.
Zufällige Zeiger: 20 Zeilen auf dem Zufälligen Zeiger sind zu viel, 80 Zeilen unten sind leer.
Das Ergebnis dieser Indicator-Berechnungen gibt eine Punktzahl von 1 oder -1, je nachdem, ob die Richtung nach oben oder nach unten ist. Die Punkte aller Indicators werden addiert, um die Gesamtpunktzahl zu erhalten. Wenn die Gesamtpunktzahl über die 0-Linie geht, wird ein Kaufsignal erzeugt.
Der größte Vorteil dieser Multi-Indikator-Kombinationsstrategie liegt in der hohen Zuverlässigkeit. Durch die integrierte Verwendung mehrerer Indikatoren kann die Richtung der Tendenz bestimmt werden.
Ein weiterer Vorteil ist die Flexibilität und Anpassbarkeit der Strategie. Die Arten und Parameter der Indikatoren können an verschiedene Märkte angepasst werden, um die Strategie besser an verschiedene Umstände anzupassen. Die Gewichte der Indikatoren können auch an die Rückmeldung angepasst werden.
Es gibt einige Risiken bei dieser Art von Kombinationsstrategien, die beachtet werden müssen:
Wenn die Korrelation zwischen den ausgewählten Indikatoren zu hoch ist, besteht die Gefahr, dass sich die Signale wiederholen. Dies erfordert eine Kombination von Indikatoren mit geringer Korrelation in Abhängigkeit von verschiedenen Marktbedingungen.
Wenn zu viele Indicatoren und zu lange Rechenzeiten benötigt werden, kann dies die Pünktlichkeit des Signals beeinträchtigen. Es ist notwendig, die Beziehung zwischen der Anzahl der Indicatoren und der Pünktlichkeit abzuwägen.
Die falsche Einstellung der Indicator-Parameter beeinträchtigt auch die Effektivität der Strategie.
Die Wirksamkeit von Indicators kann sich in verschiedenen Marktphasen unterscheiden. Die Wirksamkeit muss ständig durch Rollback überprüft werden.
Diese Strategie kann in folgenden Bereichen optimiert werden:
Optimierung der Indicator-Arten und -Mengen und Auswahl der optimalen Kombinationen;
Optimierung der Parameter-Einstellungen für jeden Indikator;
Anpassung des Gewichtsverhältnisses der Indikatoren zur Erhöhung des Gewichts der wichtigen Indikatoren;
Erhöhung der Bedingungen für Filter, z. B. für die Erhöhung des Handelsvolumens, um falsche Durchbrüche zu vermeiden;
Die Methode der Modellkombination wird verwendet, um die optimale Strategiekombination automatisch durch eine maschinelle Lernalgorithmus zu finden.
Zusammenfassend lässt sich sagen, dass diese Multi-Indicator-Kombinationsstrategie die Vorteile verschiedener Indicatoren nutzt, um die Richtung des Trends zu bestimmen, um falsche Signale zu reduzieren und die Reliabilität des Signals zu verbessern. Die Stabilität der Strategie kann durch Optimierung der Indicator-Auswahl, der Parameter-Einstellung, der Gewichtsverteilung usw. kontinuierlich verbessert werden. Diese Kombinationsstrategie eignet sich für Strategiehändler, die hohe Anforderungen an die Stabilität des Indikatorsignals stellen.
/*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)