Dies ist eine quantitative Handelsstrategie, die gleitende Durchschnitte und MACD-Indikatoren für Durchbruchstransaktionen in beide Richtungen verwendet.
Die Strategie verwendet 3 SMMA gleitende Durchschnitte unterschiedlicher Länge und 1 EMA gleitende Durchschnitte, um die Trendrichtung zu bestimmen. Gleichzeitig kombiniert sie den MACD-Indikator, um kurzfristige Trends und Einstiegsmöglichkeiten zu beurteilen. Insbesondere ist die Buy-Trigger-Bedingung: der Preis durchbricht alle gleitenden Durchschnitte nach oben, und die kürzeren Durchschnitte sind über den längeren; während die Sell-Trigger-Bedingung das Gegenteil ist, bricht der Preis durch alle gleitenden Durchschnitte nach unten, und die kürzeren Durchschnitte sind unter den längeren.
Diese Strategie verwendet gleitende Durchschnitte, um mittelfristige und langfristige Trendrichtungen zu beurteilen, und MACD, um bessere Einstiegsmöglichkeiten zu erfassen, indem sie kurzfristige Umkehrungen beurteilt.
Der Vorteil dieser Übergangsperiode besteht darin, dass sie geeignete kurzfristige Umkehrpunkte auswählen kann, um in die Trendrichtung mit hoher Wahrscheinlichkeit einzutreten, wodurch ein besseres Risiko-Rendite-Verhältnis erzielt wird.
Die 3 SMMA-Durchschnitte plus 1 EMA-Linie mit mehrstufiger Filterung können die mittelfristige und langfristige Trendrichtung effektiv bestimmen, um einen gegen den Trend gerichteten Handel zu vermeiden.
Der MACD-Indikator, der kurzfristige Umkehrpunkte für den Einstieg beurteilt, kann bessere Einstiegspreisniveaus erzielen.
Die strenge Beziehung der gleitenden Durchschnittssequenz als Filterbedingung kann die Wahrscheinlichkeit von Fehloperationen verringern.
Die wichtigsten Risiken dieser Strategie sind:
Die gleitenden Durchschnitte selbst haben größere Verzögerungseigenschaften, die kurzfristige Trendumkehrmöglichkeiten verpassen können.
Die MACD-Indikatoren sind anfällig für falsche Signale und müssen in Verbindung mit den Preisniveaus gefiltert werden.
Mehrfache Zeitrahmenurteile erhöhen die Komplexität der Strategie und sind anfällig für Misserfolge.
Um Risiko 1 und Risiko 2 zu beheben, können wir optimieren, indem wir den gleitenden Durchschnitt und den Signalzyklus angemessen verkürzen, um schnell auf kurzfristige Trendumkehrungen zu reagieren. Für Risiko 3 müssen wir für verschiedene Sorten und Zyklen optimieren und testen, um die Strategieparameter streng an die Eigenschaften dieser Sorte anzupassen.
Zu den wichtigsten Aspekten, an denen diese Strategie optimiert werden kann, gehören:
Optimieren Sie die Parameter der gleitenden Durchschnitte und des MACD, um die Eigenschaften verschiedener Zyklen und Varianten am besten zu entsprechen.
Erhöhen Sie die Stop-Loss-Strategien mit ATR oder anderen Indikatoren, um angemessene Moving Stops festzulegen. Dies kann die Risikokontrolle der Strategie erheblich verbessern.
Suchen Sie nach besseren Indikatoren oder Filtermethoden, um MACD-Signale zu ersetzen.
Verschiedene Verhältnisse zwischen Gewinn- und Verlustquoten testen, um Parameterkombinationen mit besseren Risiko-Rendite-Verhältnissen zu erhalten.
Im Allgemeinen handelt es sich um ein einzigartiges bahnbrechendes System mit Zeitrahmendenken. Es nutzt die Vorteile sowohl der gleitenden Durchschnitte als auch des MACD, um eine gemeinsame Beurteilungsoperationsstrategie über mehrere Zeitrahmen hinweg zu erreichen. Durch die Optimierung und Anpassung von Parametern und Filterkriterien kann diese Strategie zu einer sehr praktischen quantitativen Handelslösung werden.
/*backtest start: 2023-10-22 00:00:00 end: 2023-11-21 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © SoftKill21 //@version=4 strategy("Koala Script",initial_capital=1000, commission_type=strategy.commission.cash_per_contract, commission_value=0.000065, slippage=3) fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) fromYear = input(defval = 2000, title = "From Year", minval = 1970) // To Date Inputs toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) toMonth = input(defval = 8, title = "To Month", minval = 1, maxval = 12) toYear = input(defval = 2031, title = "To Year", minval = 1970) startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00) finishDate = timestamp(toYear, toMonth, toDay, 00, 00) len = input(3, minval=1, title="Length") src = input(hl2, title="Source") smma = 0.0 sma1 = sma(src, len) smma := na(smma[1]) ? sma1 : (smma[1] * (len - 1) + src) / len len2 = input(6, minval=1, title="Length") src2 = input(hl2, title="Source") smma2 = 0.0 sma2 = sma(src2, len2) smma2 := na(smma2[1]) ? sma2 : (smma2[1] * (len2 - 1) + src2) / len2 len3 = input(9, minval=1, title="Length") src3 = input(hl2, title="Source") smma3 = 0.0 sma3 = sma(src3, len3) smma3 := na(smma3[1]) ? sma3 : (smma3[1] * (len3 - 1) + src3) / len3 len4 = input(50, minval=1, title="Length") src4 = input(close, title="Source") smma4 = 0.0 sma4 = sma(src4, len4) smma4 := na(smma4[1]) ? sma4 : (smma4[1] * (len4 - 1) + src4) / len4 len5 = input(200, minval=1, title="Length") src5 = input(close, title="Source") out5 = ema(src5, len5) timeinrange(res, sess) => time(res, sess) != 0 london=timeinrange(timeframe.period, "0300-1045") londonEntry=timeinrange(timeframe.period, "0300-0845") time_cond = time >= startDate and time <= finishDate and londonEntry fast_length = input(title="Fast Length", type=input.integer, defval=12) slow_length = input(title="Slow Length", type=input.integer, defval=26) srcc = input(title="Source", type=input.source, defval=close) signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9) sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false) sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false) // Calculating fast_ma = sma_source ? sma(srcc, fast_length) : ema(srcc, fast_length) slow_ma = sma_source ? sma(srcc, slow_length) : ema(srcc, slow_length) macd = fast_ma - slow_ma signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length) hist = macd - signal longCond = close > out5 and close > smma4 and close > smma3 and close > smma2 and close > smma and londonEntry and smma > smma2 and smma2>smma3 and smma3>smma4 and smma4>out5 shortCond = close < out5 and close < smma4 and close < smma3 and close < smma2 and close < smma and londonEntry and smma < smma2 and smma2<smma3 and smma3<smma4 and smma4<out5 //longCond2 = crossover(close,out5) and crossover(close,smma4) and crossover(close,smma3) and crossover(close,smma2) and crossover(close,smma) and time_cond //shortCond2 = crossunder(close,out5) and crossunder(close,smma4) and crossunder(close,smma3) and crossunder(close,smma2) and crossunder(close,smma) and time_cond length=input(14, title="ATR Length") mult=input(1.0, title="Percentage Multiplier (for ex., 0.7 = 70%)", step=0.1, minval=0.1, maxval=5.0) oa=input(false, title="Show actual ATR") ii=syminfo.pointvalue==0 s=ii?na:oa?atr(length):(syminfo.pointvalue * mult * atr(length)) tp=input(300,title="tp") sl=input(300,title="sl") //tp = s*10000 //sl= s*10000 //if(tp>300) // tp:=300 //if(sl>300) // sl:=300 //if(sl<150) // sl:=150 //if(tp<150) // tp:=150 strategy.initial_capital = 50000 //MONEY MANAGEMENT--------------------------------------------------------------'' balance = strategy.netprofit + strategy.initial_capital //current balance floating = strategy.openprofit //floating profit/loss risk = input(3,type=input.float,title="Risk %")/100 //risk % per trade //Calculate the size of the next trade temp01 = balance * risk //Risk in USD temp02 = temp01/sl //Risk in lots temp03 = temp02*100000 //Convert to contracts size = temp03 - temp03%1000 //Normalize to 1000s (Trade size) if(size < 10000) size := 10000 //Set min. lot size strategy.entry("long",1,when=longCond ) strategy.exit("closelong","long", profit=tp,loss=sl) //strategy.close("long",when= crossunder(close[4],smma4) and close[4] > close[3] and close[3]>close[2] and close[2] > close[1] and close[1] > close) strategy.entry("short",0,when=shortCond ) strategy.exit("closeshort","short", profit=tp,loss=sl) //strategy.close("short",when= crossover(close[4],smma4) and close[4] < close[3] and close[3]< close[2] and close[2] < close[1] and close[1] < close) strategy.close_all(when = not london) maxEntry=input(2,title="max entries") // strategy.risk.max_intraday_filled_orders(maxEntry)