
Multi-Faktor-Strategien kombinieren drei verschiedene Arten von Strategien, wie beispielsweise Schok-Strategien, Trend-Tracking-Strategien und Breakthrough-Strategien, um bessere Strategie-Effekte durch Kombination zu erzielen.
Die Multifaktor-Strategie basiert hauptsächlich auf folgenden Aspekten:
Ein Teil der Schwingungsstrategie verwendet zufällige Indikatoren, um die Zeit für den Kauf und Verkauf zu bestimmen. Insbesondere wird ein Kaufsignal erzeugt, wenn die zufällige Indikator% K-Linie die% D-Linie von der Überverkaufszone durchquert. Es wird ein Verkaufsignal erzeugt, wenn die% K-Linie die% D-Linie von der Überkaufszone durchquert.
Die Trendstrategie verwendet zum Teil die goldene Kreuzung der SMA-Mittellinie, um die Richtung des Trends zu bestimmen. Es erzeugt ein Kaufsignal, wenn die Schnelle von unten durch die langsame Linie geht. Es erzeugt ein Verkaufsignal, wenn die Schnelle von oben unter die langsame Linie geht.
Der Teil der Breakout-Strategie überwacht, ob der Preis den höchsten oder niedrigsten Preis innerhalb des angegebenen Zeitraums überschreitet. Kaufen Sie, wenn der Preis den höchsten Preis überschreitet; verkaufen Sie, wenn der Preis unter dem niedrigsten Preis liegt.
Der Trend wird nur dann gehandelt, wenn der Trend stark genug ist, in Verbindung mit dem ADX-Indikator.
Einrichtung einer Stop-Line und einer Stop-Stop-Line mit einem angemessenen Stop-Stop-Verhältnis.
Die Mehrfaktor-Strategie, die diese Komponenten zusammenfasst, folgt folgender Logik:
Wenn der ADX größer als die eingestellte Schwelle ist, wird der Trend als stark genug angesehen, um die Trendstrategie auszuführen. Wenn der ADX kleiner als die Schwelle ist, wird er als ausgeglichen angesehen, um nur die Shockstrategie auszuführen.
In einem Trend tritt man ein, wenn der SMA schneller oder langsamer ist und Gold kreuzt, und ein, wenn der SMA tiefer ist.
In einem wackligen Umfeld wird ein Handelssignal mit einem zufälligen Indikator ausgeführt.
Durchbruchstrategien sind in beiden Marktumgebungen geeignet, um Kanäle zu verfolgen.
Setzen Sie eine Stop-Loss-Stop-Line, um die Gewinnoptimierung zu optimieren.
Der größte Vorteil einer Multifaktorstrategie besteht darin, dass die Kombination verschiedener Arten von Strategien die beste Strategiewirkung in beiden Marktumgebungen erzielt. Insbesondere haben sie folgende Vorteile:
Sie sind in der Lage, Trends zu folgen und eine höhere Gewinnquote in Trends zu erzielen.
Das Unternehmen ist in der Lage, in turbulenten Zeiten zu profitieren und nicht in einer Position festzuhalten.
Die Stop-Loss-Einstellungen sind vernünftig.
Der Trend ist so stark, dass die Verluste reduziert werden können.
In Kombination mit mehreren Indikatoren kann ein stärkeres Handelssignal erzeugt werden.
Eine optimale Kombination von Parametern kann durch Parameteroptimierung erreicht werden.
Es gibt einige Risiken bei einer Multifaktor-Strategie, die hauptsächlich aus folgenden Gründen besteht:
Eine falsche Kombination von mehreren Faktoren kann zu einer Verwirrung der Handelssignale führen und erfordert wiederholte Tests, um die optimale Kombination von Faktoren zu finden.
Die Optimierung von mehreren Parametern ist schwierig und erfordert ausreichende Unterstützung durch historische Daten.
Wenn der Trend sich umkehrt, kann es zu größeren Verlusten kommen, wenn die Position nicht rechtzeitig abgeschlossen wird.
Der ADX-Indikator ist zurückgeblieben und könnte einen Trendwendepunkt verpassen.
Ein Durchbruch ist leicht zu erwarten und erfordert eine angemessene Stop-Loss-Strategie.
Für diese Risiken können Optimierungen in folgenden Punkten vorgenommen werden:
Die Stabilität der verschiedenen Faktoren in den historischen Daten wird getestet und der Stabilitätsfaktor wird ausgewählt.
Intelligente Optimierungsmethoden wie genetische Algorithmen werden eingesetzt, um optimale Parameter zu finden.
Setzen Sie eine angemessene Stop-Line, um den maximalen Rückzug zu kontrollieren.
In Kombination mit zusätzlichen Indikatoren wurde die Trendwende beurteilt.
Optimierung der Stop-Loss-Strategie für den Durchbruch, um zu große Verluste zu vermeiden.
Die Multi-Faktor-Strategie bietet noch mehr Optimierungsmöglichkeiten:
Test mehrere Arten von Faktoren, um eine bessere Kombination zu finden. Weitere Faktoren wie Schwankungen, Transaktionsvolumen und andere Faktoren können berücksichtigt werden.
Suche nach der optimalen strategischen Gewichtung unter Einsatz von maschinellen Lernmethoden.
Parameteroptimierung kann mit intelligenten Algorithmen durchgeführt werden.
Die Ertragslage für verschiedene Positionszeiten kann getestet werden.
Eine dynamische Anpassung der Stop-Line kann in Betracht gezogen werden.
Es können weitere Filterbedingungen eingeführt werden, wie z. B. eine Überlastung, um die Signalqualität zu verbessern.
Die ADX-Indikatoren können als Optimierungsparameter betrachtet werden oder durch fortgeschrittene Trend-Anzeigeindikatoren ersetzt werden.
Die Mehrfaktorstrategie berücksichtigt mehrere Handelslogiken wie Trends, Erschütterungen und Durchbrüche und kann in beiden Marktumgebungen hervorragende Ergebnisse erzielen. Im Vergleich zu einer einzelnen Strategie kann die Mehrfaktorstrategie höhere stabile Erträge erzielen und hat gute Möglichkeiten zur Upgrade.
/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-30 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// strategy("Strategy_1", shorttitle="Strategy1",overlay=true ,pyramiding = 12, initial_capital=25000, currency='EUR', commission_type = strategy.commission.cash_per_order, commission_value = 3, default_qty_type = strategy.percent_of_equity, default_qty_value = 20)
// Revision: 1
// Author: Jonas
// === INPUT ===
// > BACKTEST RANGE <
FromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
FromDay = input(defval=1, title="From Day", minval=1, maxval=31)
FromYear = input(defval=2017, title="From Year", minval=2010)
ToMonth = input(defval=1, title="To Month", minval=1, maxval=12)
ToDay = input(defval=1, title="To Day", minval=1, maxval=31)
ToYear = input(defval=9999, title="To Year", minval=2010)
// > STRATEGY SETTINGS <
bolOS = input(defval = false, type=input.bool, title="Oscillating Strategy")
bolTS = input(defval = true, type=input.bool, title="Trend Strategy")
bolBO = input(defval = false, type=input.bool, title="Breakout Strategy")
strStrategy = input(defval = "Long", type=input.string, title="Trade Strategy",options = ["Long", "Short","Long & Short"])
flStopLoss = input(defval = 2.0, title="Stop Loss %", type=input.float)/100
flTakeProfit = input(defval = 4.0, title="Take Profit %", type=input.float)/100
// > SMA <
fastMA = input(defval=8, type=input.integer, title="FastMA length", minval=1, step=1)
slowMA = input(defval=21, type=input.integer, title="SlowMA length", minval=1, step=1)
// > ADX <
adx_len = input(defval=10, type=input.integer, title="ADX length", minval=1, step=1)
adx_trend = input(defval=30, type=input.integer, title="ADX Tr", minval=1, step=1)
adx_choppy = adx_trend
adx_limit = adx_trend
// > TRENDSCORE <
ts_fromIndex = input(title="From", type=input.integer, minval=1, defval=10)
ts_toIndex = input(title="To", type=input.integer, minval=1, defval=14)
ts_src = input(title="Source", type=input.source, defval=close)
// > Oscillator <
stoch_length = 14
stoch_OverBought = 75
stoch_OverSold = 25
stoch_smoothK = 3
stoch_smoothD = 3
// === BACK TEST RANGE FUNCTION ===
window_start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window
window_finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window
window() => // create function "within window of time"
time >= window_start and time <= window_finish ? true : false
//plot(stop_level_Long, title="TEST",color=color.red, style=plot.style_linebr, linewidth=2)
//plot(take_level_Long, color=color.green, style=plot.style_linebr, linewidth=2)
// === ADX ===
adx_up = change(high)
adx_down = -change(low)
adx_trur = rma(tr, adx_len)
adx_plus = fixnan(100 * rma(adx_up > adx_down and adx_up > 0 ? adx_up : 0, adx_len) / adx_trur)
adx_minus = fixnan(100 * rma(adx_down > adx_up and adx_down > 0 ? adx_down : 0, adx_len) / adx_trur)
adx_sum = adx_plus + adx_minus
ADX = 100 * rma(abs(adx_plus - adx_minus) / (adx_sum == 0 ? 1 : adx_sum), adx_len)
//=== TRENDSCORE ===
trendscore(ts_src, ts_fromIndex, ts_toIndex) =>
ts_sum = 0.0
for i = ts_fromIndex to ts_toIndex
ts_sum := ts_sum + (ts_src >= nz(ts_src[i]) ? 1 : -1)
ts_sum
intTS = trendscore(ts_src, ts_fromIndex, ts_toIndex)
// Long if TrendDirection = 1, Short if TrendDirection = -1; Indifferent if TrendDirection = 0
intTrendDirection = (intTS > (ts_toIndex-ts_fromIndex)) ? 1 : (intTS < (ts_fromIndex-ts_toIndex)) ? -1 : 0
// > TREND CONDITION <
adx_growing = ADX > highest(ADX[1],3)
intTrend = ((ADX >= adx_limit) and (ADX[1] >= adx_limit) and adx_growing) ? intTrendDirection : 0
// === ATR ===
ATR = sma(tr,10)
ATR_100 = ATR /abs(high - low)
// === STOCHASTICS ===
stoch_k = sma(stoch(close, high, low, stoch_length), stoch_smoothK)
stoch_d = sma(stoch_k, stoch_smoothD)
// === FILTER & CONDITIONS ===
// > STOCHASTICS <
bolFilter_OS1 = close[1] > hl2[1]
bolSigOsc_long_1 = (na(stoch_k) or na(stoch_d)) ? false : (crossover(stoch_d,stoch_OverSold) and stoch_k > stoch_d) ? true:false
bolSigOsc_short_1 = (na(stoch_k) or na(stoch_d)) ? false : (crossunder(stoch_d,stoch_OverBought) and stoch_k < stoch_d) ? true:false
bolLongOpenOS = bolSigOsc_long_1 and bolFilter_OS1
bolLongCloseOS = bolSigOsc_short_1
bolShortOpenOS = bolSigOsc_short_1 and bolFilter_OS1
bolShortCloseOS = bolSigOsc_long_1
// > TREND <
bolFilter_TS1 = close[1] > hl2[1] and open[1] < hl2[1]
bolFilter_TS2 = sma(close,50)>sma(close,50)[10]
bolFilter_TS3 = close[1] < hl2[1] and open[1] > hl2[1]
bolSigTrendLO1 = sma(close, fastMA) > sma(close, slowMA)
bolSigTrendLO2 = close > sma(close,fastMA)
bolSigTrendLO3 = bolSigTrendLO1 and bolSigTrendLO2
bolSigTrendLC1 = sma(close, fastMA) < sma(close, slowMA)
bolSigTrendLC2 = close < sma(close, fastMA)
bolSigTrendLC3 = bolSigTrendLC1 and bolSigTrendLC2
bolSigTrendSO1 = bolSigTrendLC3
bolSigTrendSC1 = bolSigTrendLO1
bolLongOpenTS = bolSigTrendLO3 and bolFilter_TS1
bolLongCloseTS = bolSigTrendLC3 and bolFilter_TS3
bolShortOpenTS = bolSigTrendSO1 and bolFilter_TS3
bolShortCloseTS = bolLongOpenTS and bolFilter_TS1
plot(sma(close, fastMA), title='FastMA', color=color.green, linewidth=2, style=plot.style_line) // plot FastMA
plot(sma(close, slowMA), title='SlowMA', color=color.red, linewidth=2, style=plot.style_line) // plot SlowMA
// > BREAKOUT <
flFilter_BS1 = 0.5 * stdev(close,slowMA)[1]
bolFilter_BS2 = volume > sma(volume,slowMA)*1.25
bolSigBreakoutLO1 = close > (highestbars(high,slowMA)[1] + flFilter_BS1)
bolSigBreakoutLC1 = barssince(bolSigBreakoutLO1)==5
bolSigBreakoutSO1 = close < lowestbars(low,slowMA)[1] - flFilter_BS1
bolSigBreakoutSC1 = barssince(bolSigBreakoutSO1)==5
bolLongOpenBO = bolSigBreakoutLO1 and bolFilter_BS2
bolLongCloseBO = bolSigBreakoutLC1
bolShortOpenBO = bolSigBreakoutSO1 and bolFilter_BS2
bolShortCloseBO = bolSigBreakoutSC1
//=== STRATEGIES ENTRIES & EXITS ===
// > STOPS & LIMITS <
stop_level_Long = strategy.position_avg_price * (1 - flStopLoss)
take_level_Long = strategy.position_avg_price * (1 + flTakeProfit)
stop_level_Short = strategy.position_avg_price * (1 + flStopLoss)
take_level_Short = strategy.position_avg_price * (1 - flTakeProfit)
// > ENTRIES / CLOSES / EXITS <
if window() //only in backtest-window
if (bolOS == true)
if (intTrend == 0)
if(strStrategy == "Long" or strStrategy == "Long & Short")
strategy.entry("Lng Osc", strategy.long, when=bolLongOpenOS) // buy long when "within window of time" AND crossover
if(strStrategy == "Short" or strStrategy == "Long & Short")
strategy.entry("Short Osc", strategy.short, when=bolShortOpenOS)
strategy.close("Lng Osc", when=(bolLongCloseOS))
//strategy.exit("Exit L OS/STD", "Lng Osc", stop = strategy.position_avg_price - 2*stdev(close,10))
strategy.exit("Exit L OS/%", "Lng Osc", stop=stop_level_Long)
strategy.close("Short Osc", when=(bolShortCloseOS))
//strategy.exit("Exit S OS/STD", "Short Osc", stop = strategy.position_avg_price + 2*stdev(strategy.position_avg_price,10))
strategy.exit("Exit S OS/%", "Short Osc", stop=stop_level_Short)
if (bolTS == true)
if (not(intTrend == 0))
if((strStrategy == "Long") or (strStrategy == "Long & Short"))
strategy.entry("Lng TD", strategy.long, when=bolLongOpenTS) // buy long when "within window of time" AND crossover
if((strStrategy == "Short") or (strStrategy == "Long & Short"))
strategy.entry("Short TD", strategy.short, when=(bolShortOpenTS and bolTS)) // buy long when "within window of time" AND crossover
strategy.exit("Exit L TD", "Lng TD", stop=stop_level_Long)
strategy.close("Lng TD", when=bolLongCloseTS)
strategy.exit("Exit S TD", "Short TD", stop=stop_level_Short)
strategy.close("Short TD", when=bolShortCloseTS)
if (bolBO == true)
if((strStrategy == "Long") or (strStrategy == "Long & Short"))
strategy.entry("Lng BO", strategy.long, when=bolLongOpenBO) // buy long when "within window of time" AND crossover
strategy.close("Lng BO", when=bolLongCloseBO)
//strategy.exit("Exit L BO/STD", "Lng BO", stop = strategy.position_avg_price - 2*stdev(strategy.position_avg_price,10))
strategy.exit("Exit L BO/2.5%", "Lng BO", stop=stop_level_Long)
if((strStrategy == "Short") or (strStrategy == "Long & Short"))
strategy.entry("Short BO", strategy.short, when=bolShortOpenBO) // buy long when "within window of time" AND crossover
strategy.close("Short BO", when=bolShortCloseBO)
//strategy.exit("Exit S BO/STD", "Short BO", stop = strategy.position_avg_price - 2*stdev(strategy.position_avg_price,10))
strategy.exit("Exit S BO/%", "Short BO", stop=stop_level_Short)