MACD-Trend nach Intraday-Strategie

Schriftsteller:ChaoZhang, Datum: 2023-12-19 11:16:44
Tags:

img

Übersicht

Die MACD Trend Following Intraday Strategy ist eine Intraday-Handelsstrategie, die gleitende Durchschnitte, den MACD-Indikator und den Williams-Indikator kombiniert.

Strategie Logik

Die wichtigste Handelslogik dieser Strategie beruht auf mehreren Aspekten:

  1. Der Preis wird in der Regel von einem Marktteilnehmer übertragen.

  2. Der Markt wird von der MACD-Schnelllinie über der langsamen Linie getragen, wenn die MACD-Schnelllinie über der langsamen Linie liegt.

  3. Wenn die schnelle MA-Linie des William-Indikators über der langsamen MA-Linie liegt und umgekehrt;

  4. Verwenden Sie die Kombinationen dieser drei Szenarien als Einstiegsbedingungen;

  5. Ausfahrt bei Rückwärtssignal.

Durch die Kombination von EMA für die allgemeine Trendrichtung und MACD für die kurzfristige Dynamik kann diese Strategie Preistrendbewegungen an anständigen Einstiegspunkten für Gewinne erfassen.

Vorteile

Diese Multi-Indikator-Kombi-Struktur bildet einen typischen kurzfristigen Trend nach der Strategie, mit Hauptvorteilen wie:

  1. Dreifache Kreuzüberprüfung zur Verringerung falscher Signale;

  2. EMA für den Haupttrend, MACD für die kurzfristige Dynamik;

  3. Williams-Indikator vermeidet das Verfolgen von Spitzen oder Bodenfischereien bei flüchtigen Bewegungen;

  4. Die Umkehrkombination sorgt dafür, dass die Risikokontrolle mit den Ausgängen übereinstimmt.

Risiken

Für diese Strategie gibt es auch erhebliche Risiken:

  1. Die komplexe Struktur macht das Parameter-Tuning schwierig.

  2. Häufige kurzfristige Geschäfte können zu höheren Transaktionskosten führen;

  3. Wenn die tatsächlichen Trendumkehrpunkte nicht erkannt werden, kann dies zu Verlusten führen.

Die wichtigsten Minderungsmaßnahmen sind Parameteroptimierung und Stop-Loss, um Gewinnkombinationen zu maximieren und den maximalen Einzelhandelsverlust zu kontrollieren.

Möglichkeiten zur Verbesserung

Hauptaspekte zur Verbesserung der Strategie:

  1. Mehr Parameterkombinationen für eine optimale Menge testen;

  2. Hinzufügen von mehr Datenfeeds wie Volumen für die Eingabevalidierung;

  3. Einbeziehung dynamischer oder nachträglicher Stop-Loss-Verfahren zur Stärkung der Risikokontrolle;

  4. Einbeziehen von maschinellem Lernen, um echte Umkehrungen zu erkennen.

Schlussfolgerung

Dieser MACD-Trend, der der Intraday-Strategie folgt, kombiniert effektiv Indikatoren zur Identifizierung von kurzfristigen Trends und zum Management von Risiken. Weitere Verbesserungen der Tuning-Parameter, die Festlegung von Stop-Loss-Levels und die Einbeziehung mehrerer Datenfeeds können die Gewinnrate und die Rentabilität der Strategie erhöhen. Die Konzepte sind für die Strategieentwicklung zu erforschen.


/*backtest
start: 2023-11-18 00:00:00
end: 2023-12-18 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/
// © platsn

//@version=5
strategy("MACD Willy Strategy", overlay=true, pyramiding=1, initial_capital=10000) 

// ******************** Trade Period **************************************
startY = input(title='Start Year', defval=2011, group = "Trading window")
startM = input.int(title='Start Month', defval=1, minval=1, maxval=12, group = "Trading window")
startD = input.int(title='Start Day', defval=1, minval=1, maxval=31, group = "Trading window")
finishY = input(title='Finish Year', defval=2050, group = "Trading window")
finishM = input.int(title='Finish Month', defval=12, minval=1, maxval=12, group = "Trading window")
finishD = input.int(title='Finish Day', defval=31, minval=1, maxval=31, group = "Trading window")
timestart = timestamp(startY, startM, startD, 00, 00)
timefinish = timestamp(finishY, finishM, finishD, 23, 59)
// t1 = time(timeframe.period, "0945-1545:23456") 
// window = time >= timestart and time <= timefinish and t1 ? true : false 
// t2 = time(timeframe.period, "0930-1555:23456")
// window2 = time >= timestart and time <= timefinish and t2 ? true : false 

leverage = input.float(1, title="Leverage (if applicable)", step=0.1, group = "Trading Options")
reinvest = input.bool(defval=false,title="Reinvest profit", group = "Trading Options")
reinvest_percent = input.float(defval=20, title = "Reinvest percentage", group="Trading Options")
// entry_lookback = input.int(defval=10, title="Lookback period for entry condition", group = "Trading Options")

// -------------------------------------------- Data Source --------------------------------------------

src = input(title="Source", defval=close)

// ***************************************************************************************************** Daily ATR *****************************************************
atrlen = input.int(14, minval=1, title="ATR period", group = "Daily ATR")
iPercent = input.float(5, minval=1, maxval=100, step=0.1, title="% ATR to use for SL / PT", group = "Daily ATR")
 
percentage = iPercent * 0.01
datr = request.security(syminfo.tickerid, "1D", ta.rma(ta.tr, atrlen))
datrp = datr * percentage

// plot(datr,"Daily ATR")
// plot(datrp, "Daily % ATR")

//*********************************************************** VIX volatility index ****************************************

VIX = request.security("BTC_USDT:swap", timeframe.period, close)
vix_thres = input.float(20.0, "VIX Threshold for entry", step=0.5, group="VIX Volatility Index")

// ************************************************ Volume ******************************************************

vol_len = input(50, 'Volume MA Period')
avg_vol = ta.sma(volume, vol_len)

//-------------------------------------------------------- Moving Average ------------------------------------

emalen1 = input.int(200, minval=1, title='EMA', group= "Moving Averages")
ema1 = ta.ema(src, emalen1)

// ------------------------------------------ MACD ------------------------------------------
// Getting inputs
fast_length = input(title="Fast Length", defval=12)
slow_length = input(title="Slow Length", defval=26)
signal_length = input.int(title="Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"])
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])
// Plot colors
col_macd = input(#2962FF, "MACD Line  ", group="Color Settings", inline="MACD")
col_signal = input(#FF6D00, "Signal Line  ", group="Color Settings", inline="Signal")
col_grow_above = input(#26A69A, "Above   Grow", group="Histogram", inline="Above")
col_fall_above = input(#B2DFDB, "Fall", group="Histogram", inline="Above")
col_grow_below = input(#FFCDD2, "Below Grow", group="Histogram", inline="Below")
col_fall_below = input(#FF5252, "Fall", group="Histogram", inline="Below")
// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal

// ---------------------------------------- William %R --------------------------------------
w_length = input.int(defval=34, minval=1)
w_upper = ta.highest(w_length)
w_lower = ta.lowest(w_length)

w_output = 100 * (close - w_upper) / (w_upper - w_lower)

fast_period = input(defval=5, title='Smoothed %R Length')
slow_period = input(defval=13, title='Slow EMA Length')

w_fast_ma = ta.wma(w_output,fast_period)
w_slow_ma = ta.ema(w_output,slow_period)



// ------------------------------------------------ Entry Conditions ----------------------------------------

L_entry1 = close > ema1 and hist > 0 and w_fast_ma > w_slow_ma 
S_entry1 = close < ema1 and hist < 0 and w_fast_ma < w_slow_ma 

// -------------------------------------------------- Entry -----------------------------------------------
strategy.initial_capital = 50000
profit = strategy.netprofit
trade_amount = math.floor(strategy.initial_capital*leverage / close) 

if strategy.netprofit > 0 and reinvest
    trade_amount := math.floor((strategy.initial_capital+(profit*reinvest_percent*0.01))*leverage / close) 
else
    trade_amount := math.floor(strategy.initial_capital*leverage/ close) 


if L_entry1 //and window
    strategy.entry("Long", strategy.long, trade_amount)

if S_entry1 //and window
    strategy.entry("Short", strategy.short, trade_amount)

// --------------------------------------------------- Exit Conditions -------------------------------------

L_exit1 = hist < 0 and w_fast_ma < w_slow_ma and w_fast_ma < -20
S_exit1 = hist > 0 and w_fast_ma > w_slow_ma and w_fast_ma > -80

// ----------------------------------------------------- Exit ---------------------------------------------

if L_exit1 //and window2
    strategy.close("Long")
    
if S_exit1 //and window2
    strategy.close("Short")

// if time(timeframe.period, "1530-1600:23456")
//     strategy.close_all()

Mehr