
Es ist eine quantitative Handelsstrategie, die beidseitige Durchbruchoperationen mit Moving Averages und MACD-Indikatoren durchführt. Es hat die Eigenschaft, über Zeitlinien zu operieren, d.h. die Richtung der Trends in längeren Zeiträumen zu bestimmen und die Vorteile der Eintrittschancen in kürzeren Zeiträumen zu suchen.
Die Strategie verwendet drei SMMA-Mittellinien mit unterschiedlichen Laufzeiten und eine EMA-Mittellinien, um die Richtung der Tendenz zu bestimmen. Gleichzeitig wird der MACD-Indikator mit kurzfristigen Trends und Einstiegsmomenten kombiniert.
Wie man sehen kann, nutzt die Strategie gleichzeitig den Moving Average, um die Richtung des mittleren und langen Trends zu bestimmen, und den MACD, um die kurzfristige Umkehr zu bestimmen, um die bevorzugten Einstiegsmomente zu erfassen. Diese Multi-Zeitachsen-Kombination ist ein wichtiges Merkmal der Strategie.
Die Vorteile dieser Art von Zeit-Lauf-Operationen bestehen darin, dass die richtigen kurzfristigen Wendepunkte in der Richtung eines hohen Trends gewählt werden können, um eine bessere Risiko-Rendite zu erzielen. Insbesondere gibt es folgende drei Vorteile:
Drei SMMA-Mittellinien und eine EMA-Mittellinien-Mehrstufenschwingung können die Richtung des mittleren und langen Trends effektiv bestimmen und eine Gegenbewegung vermeiden.
Der MACD-Indikator beurteilt kurzfristige Wendepunkte und bietet einen günstigen Einstiegspreis.
Strenge Moving-Average-Sequential-Relationen als Filterbedingungen können die Wahrscheinlichkeit von Fehlbearbeitungen reduzieren.
Die Hauptrisiken dieser Strategie sind:
Der Moving Average selbst ist stark rückständig und könnte eine kurzfristige Trendwende verpassen.
Die MACD-Indikatoren sind anfällig für Falschsignale, die mit einem Preisfilter verbunden sind.
Mehrfache Zeitachsen-Bestimmungen erhöhen die Komplexität der Strategie und können zu Fehlschlägen führen.
Für Risiko 1 und Risiko 2 kann durch eine angemessene Verkürzung der Durchschnitts- und Signalzyklen optimiert werden, um schnell auf eine kurzfristige Trendwende zu reagieren. Für Risiko 3 müssen Optimierungstests für verschiedene Sorten und Zyklen durchgeführt werden, so dass die Strategieparameter streng an die Eigenschaften der Sorte angepasst werden.
Die Strategie kann vor allem in folgenden Bereichen optimiert werden:
Optimierung der Parameter für Moving Averages und MACDs, um sie am besten mit verschiedenen Perioden- und Varietätseigenschaften zu kombinieren. Zum Beispiel Verkürzung der Durchschnittslänge, Erhöhung der Signalparameter usw.
Erhöhung der Stop-Loss-Strategie, die Verwendung von ATR oder anderen Indikatoren, um eine angemessene mobile Stop-Loss. Dies kann erheblich verbessern die Risikokontrolle der Strategie.
Suche nach besseren Indikatoren oder Filtermethoden, die MACD-Signale ersetzen können. Zum Beispiel Einführung von Schwankungsraten, Filterung von Signalen usw.
Verschiedene Stop-Loss-Relationen werden getestet, um eine Parameterkombination zu erhalten, die die Risiken im Vergleich zu den Vorteilen übertrifft.
Insgesamt handelt es sich um ein bahnbrechendes System mit einer einzigartigen, zeitlich übergreifenden Denkweise. Es nutzt gleichzeitig die Vorteile von Moving Averages und MACDs, um eine Strategie für den Betrieb von gemeinsamen Urteilen über mehrere Zeiträume zu realisieren. Durch die optimierte Anpassung der Parameter und Filterbedingungen kann die Strategie zu einem sehr praktischen quantitativen Handelsprogramm 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)