Durchbruchssystem für die Querschnittsperiode

Schriftsteller:ChaoZhang, Datum: 2023-11-22 15:22:49
Tags:

img

Übersicht

Dies ist eine quantitative Handelsstrategie, die gleitende Durchschnitte und MACD-Indikatoren für Durchbruchstransaktionen in beide Richtungen verwendet.

Strategieprinzip

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.

Analyse der Vorteile

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.

  1. 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.

  2. Der MACD-Indikator, der kurzfristige Umkehrpunkte für den Einstieg beurteilt, kann bessere Einstiegspreisniveaus erzielen.

  3. Die strenge Beziehung der gleitenden Durchschnittssequenz als Filterbedingung kann die Wahrscheinlichkeit von Fehloperationen verringern.

Risikoanalyse

Die wichtigsten Risiken dieser Strategie sind:

  1. Die gleitenden Durchschnitte selbst haben größere Verzögerungseigenschaften, die kurzfristige Trendumkehrmöglichkeiten verpassen können.

  2. Die MACD-Indikatoren sind anfällig für falsche Signale und müssen in Verbindung mit den Preisniveaus gefiltert werden.

  3. 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.

Optimierungsrichtlinien

Zu den wichtigsten Aspekten, an denen diese Strategie optimiert werden kann, gehören:

  1. Optimieren Sie die Parameter der gleitenden Durchschnitte und des MACD, um die Eigenschaften verschiedener Zyklen und Varianten am besten zu entsprechen.

  2. 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.

  3. Suchen Sie nach besseren Indikatoren oder Filtermethoden, um MACD-Signale zu ersetzen.

  4. Verschiedene Verhältnisse zwischen Gewinn- und Verlustquoten testen, um Parameterkombinationen mit besseren Risiko-Rendite-Verhältnissen zu erhalten.

Zusammenfassung

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)

Mehr