Diese Strategie kombiniert mehrere starke Indikatoren mit verschiedenen Perioden wie Aroon, MA, BB, Williams, %R, ADX, um ein multidimensionales, leistungsstarkes Indikatorsystem für offene Positionen zu bilden, das Positionen effizient öffnen kann, wenn der Trend offensichtlich ist.
Die Strategie verwendet hauptsächlich die Kombination der folgenden Indikatoren, um starke Eröffnungssignale zu erzeugen:
Aroon-Indikator: Berechnet die höchsten und niedrigsten Preise über einen bestimmten Zeitraum, um einen oszillierenden Indikator zu bilden.
MA: Berechnen Sie die Kreuzung von kurzfristigen und langfristigen MA, um die Wendepunkte des Trends zu bestimmen.
BB-Band: Wenn der Preis durch die obere Schiene des BB-Bands bricht, ist dies ein Verkaufssignal.
Williams %R Indikator: Bildung von Divergenzen in Überkauf- und Überverkaufsbereichen als Eröffnungssignale.
ADX: Beurteilt die Stärke des Trends. ADX über einer bestimmten Position erzeugt Öffnungssignale.
Die vorstehenden Indikatoren mit unterschiedlichen Parametern für die Zykluslänge bilden ein mehrdimensionales Urteilssystem, das bei offensichtlicher Entwicklung starke Eröffnungssignale erzeugen kann.
Insbesondere sind die Kaufbedingungen:
Wenn 3 der 5 Kaufbedingungen erfüllt sind, wird ein starkes Kaufsignal erzeugt.
Die Verkaufsbedingungen sind ähnlich, mit 5 Verkaufsbedingungen. Wenn 3 davon erfüllt sind, wird ein Verkaufssignal generiert.
Diese Strategie kann also durch die Kombination verschiedener Indikatoren starke Eröffnungssignale mit hoher Sicherheit erzeugen, wenn der Trend offensichtlich ist.
Der größte Vorteil dieser Strategie ist die mehrdimensionale Kombination von Indikatorsignalen, die die Wahrscheinlichkeit von fehlerhaften Signalen, die durch einen einzelnen Indikator verursacht werden, erheblich reduziert und so qualitativ hochwertige Eröffnungssignale erzeugen kann, wenn der Trend offensichtlich ist.
Weitere Vorteile sind:
Die Parameter können an unterschiedliche Marktmerkmale angepasst werden
Die Parametereinstellungen der Indikatoren sind wissenschaftlich vernünftig und sehr robust
Die Kombination von mehreren Zeitzyklen wird realisiert, um die Genauigkeit des Urteils zu verbessern
Die Code-Struktur ist klar und leicht verständlich und die sekundäre Entwicklung
Diese Strategie birgt auch einige Risiken:
Obwohl die Kombination mehrerer Indikatoren die Qualität der Beurteilung verbessern kann, erhöht sie auch die Komplexität der Strategie und erhöht das Risiko einer Überoptimierung.
Die Parameter-Einstellungen sind nicht zu 100% perfekt und können unter bestimmten Marktbedingungen fehlschlagen.
Die Kombination der Indikatormethoden kann noch optimiert werden, und die Kombinationslogik kann weiter verfeinert werden.
Kurzfristige Anpassungsmöglichkeiten können verpasst werden.
Entsprechende Lösungen
Erhöhung der Probenrückprüfung zur Prüfung der Robustheit der Parameter
Anpassung einiger Parameter an mehr Märkte
Optimierung der Integrationsmethode der Indikatoren zur Verbesserung der Urteilsqualität
Einige Indikatorparameter angemessen verkürzen, um die Erfassung von kurzfristigen Anpassungen zu erhöhen
Die wichtigste Optimierungsrichtung dieser Strategie ist die Optimierung der Indikatorenintegrationsmethode, zu der hauptsächlich gehören:
Hinzufügen von mehr verschiedenen Indikatortypen, um einen Indikatorwald zu bilden, um die Richtigkeit des Urteils weiter zu verbessern
Optimierung der Indikatorparameter, um sich automatisch an Marktveränderungen anzupassen
Verwendung von maschinellem Lernen und anderen Methoden zur automatischen Suche nach optimalen Indikatorenintegrationslösungen
Steigerung der Stop-Loss-Strategien zur Risikokontrolle
Kombination von Stimmungsindikatoren, Beurteilung der Markthitze und dynamische Anpassung der Parameter
Die Qualität und Robustheit dieser Strategie kann durch die Integration mehrer Indikatoren, die automatische Optimierung von Parametern und Integrationssystemen noch viel verbessert werden.
Der größte Höhepunkt dieser Strategie ist die wissenschaftliche Integration mehrerer Indikatoren, um ein leistungsstarkes Eröffnungssignal zu bilden, das signifikant funktioniert, wenn der Trend offensichtlich ist.
/*backtest start: 2023-12-19 00:00:00 end: 2024-01-18 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy(title="Aroon+Williams+MA2+ADX+Aroon Str.", shorttitle="Aroon+Williams+MA2+ADX+Aroon Str.", overlay=true) //https://cafe.naver.com/watchbot/1945 //<<빙썸 매각 기념>> 바이낸스 이오스 복합지표 //Aroon_1 length_1 = input(264, minval=1, title="Length Aroon_1") upper_1 = 100 * (highestbars(high, length_1+1) + length_1)/length_1 lower_1 = 100 * (lowestbars(low, length_1+1) + length_1)/length_1 midp_1 = 0 oscillator_1 = upper_1 - lower_1 //osc_1 = plot(oscillator_1, color=red) //Aroon_2 length_2 = input(72, minval=1, title="Length Aroon_2") upper_2 = 100 * (highestbars(high, length_2+1) + length_2)/length_2 lower_2 = 100 * (lowestbars(low, length_2+1) + length_2)/length_2 midp_2 = 0 oscillator_2 = upper_2 - lower_2 //osc_2 = plot(oscillator_2, color=red) //Aroon_3 length_3 = input(137, minval=1, title="Length Aroon_3") upper_3 = 100 * (highestbars(high, length_3+1) + length_3)/length_3 lower_3 = 100 * (lowestbars(low, length_3+1) + length_3)/length_3 midp_3 = 0 oscillator_3 = upper_3 - lower_3 //osc_3 = plot(oscillator_3, color=red) //Aroon_4 length_4 = input(62, minval=1, title="Length Aroon_4") upper_4 = 100 * (highestbars(high, length_4+1) + length_4)/length_4 lower_4 = 100 * (lowestbars(low, length_4+1) + length_4)/length_4 midp_4 = 0 oscillator_4 = upper_4 - lower_4 //osc_4 = plot(oscillator_4, color=red) //Ma double short_ma_1 = sma(close, 9) long_ma_1 = sma(close, 21) // plot(short_ma_1, color = red) // plot(long_ma_1, color = green) // plot(cross(short_ma_1, long_ma_1) ? short_ma_1 : na, style = cross, linewidth = 4) short_ma_2 = sma(close, 9) long_ma_2 = sma(close, 21) // plot(short_ma_2, color = red) // plot(long_ma_2, color = green) plot(cross(short_ma_2, long_ma_2) ? short_ma_2 : na, transp= 100, title = "ma cross_2", style = cross, linewidth = 4) //BB length_bb = input(270, minval=1, title="BB length") src_bb = input(close, title="Source") mult_bb = input(2.0, minval=0.001, maxval=50, title="BB mult") basis_bb = sma(src_bb, length_bb) dev_bb = mult_bb * stdev(src_bb, length_bb) upper_bb = basis_bb + dev_bb lower_bb = basis_bb - dev_bb // plot(basis_bb, color=red) // p1 = plot(upper_bb, color=blue) // p2 = plot(lower_bb, color=blue) // fill(p1, p2) //Williams length_wil = input(130, minval=1, title="Length Williams %R") upper_wil = highest(length_wil) lower_wil = lowest(length_wil) out_wil = 100 * (close - upper_wil) / (upper_wil - lower_wil) // plot(out_wil) // band1 = hline(-20) // band0 = hline(-80) // fill(band1, band0) //ADX adxlen = input(14, title="ADX Smoothing") dilen = input(145, title="DI Length") dirmov(len) => up_adx = change(high) down_adx = -change(low) plusDM = na(up_adx) ? na : (up_adx > down_adx and up_adx > 0 ? up_adx : 0) minusDM = na(down_adx) ? na : (down_adx > up_adx and down_adx > 0 ? down_adx : 0) truerange = rma(tr, len) plus_adx = fixnan(100 * rma(plusDM, len) / truerange) minus_adx = fixnan(100 * rma(minusDM, len) / truerange) [plus_adx, minus_adx] adx(dilen, adxlen) => [plus_adx, minus_adx] = dirmov(dilen) sum_adx = plus_adx + minus_adx adx = 100 * rma(abs(plus_adx - minus_adx) / (sum_adx == 0 ? 1 : sum_adx), adxlen) sig_adx = adx(dilen, adxlen) // plot(sig_adx, color=red, title="ADX") //ADX 2 adxlen_2 = input(14, title="ADX Smoothing") dilen_2 = input(150, title="DI Length") dirmov_2(len) => up_adx_2 = change(high) down_adx_2 = -change(low) plusDM_2 = na(up_adx_2) ? na : (up_adx_2 > down_adx_2 and up_adx_2 > 0 ? up_adx_2 : 0) minusDM_2 = na(down_adx_2) ? na : (down_adx_2 > up_adx_2 and down_adx_2 > 0 ? down_adx_2 : 0) truerange_2 = rma(tr, len) plus_adx_2 = fixnan(100 * rma(plusDM_2, len) / truerange_2) minus_adx_2 = fixnan(100 * rma(minusDM_2, len) / truerange_2) [plus_adx_2, minus_adx_2] adx_2(dilen_2, adxlen_2) => [plus_adx_2, minus_adx_2] = dirmov_2(dilen_2) sum_adx_2 = plus_adx_2 + minus_adx_2 adx_2 = 100 * rma(abs(plus_adx_2 - minus_adx_2) / (sum_adx_2 == 0 ? 1 : sum_adx_2), adxlen_2) sig_adx_2 = adx(dilen_2, adxlen_2) // plot(sig_adx_2, color=red, title="ADX_2") //Input Position //buy position pos_aroon1 = input(-85, title="Aroon_1 Position Index_Down") pos_madouble1_short = input(117, title="ma double_1 wma_Short") pos_madouble1_long = input(86, title="ma double_1 sma_Long") pos_wil = input(-99, title="Williams Position Index_Down") pos_adx= input(14, title="ADX Position Index_Up") pos_aroon2 = input(-39, title="Aroon_2 Position Index_Up") //sell position pos_bb = input(120, title="BB Position Index_Up") pos_aroon_3 = input(99, title="Aroon_3 Position Index_Up") pos_madouble2_short= input(88, title="ma double_2 ema_Short") pos_madouble2_long= input(96, title="ma double_2 sma_Long") pos_adx_2= input(9, title="ADX_2 Position Index_Up") pos_aroon_4 = input(35, title="Aroon_4 Position Index_Down") //Condition longCondition_aroon_1 = (oscillator_1 <= pos_aroon1) longCondition_ma2 = (pos_madouble1_short > pos_madouble1_long) longCondition_wil = (out_wil <= pos_wil) longCondition_adx = (sig_adx >= pos_adx) longCondition_aroon_2 = (oscillator_2 >= pos_aroon2) shortCondition_bb = (close > basis_bb) shortCondition_aroon_3 = (oscillator_3 >= pos_aroon_3) shortCondition_ma2 = (pos_madouble2_short < pos_madouble2_long) shortCondition_adx = (sig_adx_2 >= pos_adx_2) shortCondition_aroon_4 = (oscillator_4 <= pos_aroon_4) vl_aroon_1 = 0 vl_ma2 = 0 vl_wil = 0 vl_adx = 0 vl_aroon_2 = 0 if longCondition_aroon_1 vl_aroon_1 := 1 if longCondition_ma2 vl_ma2 := 3 if longCondition_wil vl_wil := 1 if longCondition_adx vl_adx := -1 if longCondition_aroon_2 vl_aroon_2 := -1 vs_bb = 0 vs_aroon_3 = 0 vs_ma2 = 0 vs_adx = 0 vs_aroon_4 = 0 if shortCondition_bb vs_bb := 1 if shortCondition_aroon_3 vs_aroon_3 := 1 if shortCondition_ma2 vs_ma2 := 3 if shortCondition_adx vs_adx := -2 if shortCondition_aroon_4 vs_aroon_4 := -1 // plotshape(vl_aroon_1, title= "vl_aroon_1", location=location.belowbar, color=green, text="vl_aroon_1") // plotshape(vl_ma2, title= "vl_ma2", location=location.belowbar, color=green, text="\nvl_ma2") // plotshape(vl_wil, title= "vl_wil", location=location.belowbar, color=green, text="\n\nvl_wil") // plotshape(vl_adx, title= "vl_adx", location=location.belowbar, color=green, text="\n\n\nvl_adx") // plotshape(vl_aroon_2, title= "vl_aroon_2", location=location.belowbar, color=green, text="\n\n\n\nvl_aroon_2") // plotshape(vs_bb, title= "vs_bb", location=location.abovebar, color=orange, text="vs_bb") // plotshape(vs_aroon_3, title= "vs_aroon_3", location=location.abovebar, color=orange, text="vs_aroon_3\n") // plotshape(vs_ma2, title= "vs_ma2", location=location.abovebar, color=orange, text="vs_ma2\n\n") // plotshape(vs_adx, title= "vs_adx", location=location.abovebar, color=orange, text="vs_adx\n\n\n") // plotshape(vs_aroon_4, title= "vs_aroon_4", location=location.abovebar, color=orange, text="vs_aroon_4\n\n\n\n") longCondition = (vl_aroon_1 + vl_ma2 + vl_wil + vl_adx + vl_aroon_2) >= 3 ? true : na shortCondition = (vs_bb + vs_aroon_3 + vs_ma2 + vs_adx + vs_aroon_4) >= 3 ? true : na buy = longCondition == 1 ? longCondition : na sell = shortCondition == 1? shortCondition : na // plotshape(buy, title= "buy", location=location.bottom, color=green, text="buy") // plotshape(sell, title= "sell", location=location.top, color=orange, text="sell") // === BACKTEST RANGE === FromMonth = input(defval = 8, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2018, title = "From Year", minval = 2014) ToMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 2018, title = "To Year", minval = 2014) strategy.entry("L", strategy.long, when=(buy)) strategy.close("L", when=(sell)) // strategy.entry("S", strategy.short, when=(sell and (time >= timestamp(FromYear, FromMonth, FromDay, 00, 00)) and (time <= timestamp(ToYear, ToMonth, ToDay, 23, 59)))) // strategy.close("S", when=(buy and (time <= timestamp(ToYear, ToMonth, ToDay, 23, 59))))