Indexkorrekturanalyse Filterstrategie


Erstellungsdatum: 2023-12-13 15:55:07 zuletzt geändert: 2023-12-13 15:55:07
Kopie: 0 Klicks: 637
1
konzentrieren Sie sich auf
1621
Anhänger

Indexkorrekturanalyse Filterstrategie

Überblick

Die Strategie nutzt eine Kombination aus Modellrechnungen und Index-Moving-Averages, um einen stark zufälligen Trendfilter zu realisieren, der die Richtung der Position bestimmen kann. Die Strategie berechnet zunächst, ob der Preis durch den Rest einer festgelegten Zahl 0 ist. Wenn 0 ist, tritt ein Handelssignal auf.

Strategieprinzip

  1. Setzen Sie den Preis-Eingabewert a auf den Schlusskostenwert close, der geändert werden kann; Setzen Sie den Divisionswert b auf 4, der geändert werden kann.
  2. Berechnen Sie a durch b modulo, um zu ermitteln, ob a 0 ≠ 0 ist.
  3. Der Index wurde mit der Länge des Moving Averages MALen, mit der Default-Länge von 70 Zyklen, als ein Indikator für die mittlere und langfristige Entwicklung der Preise eingerichtet.
  4. Wenn die Restzahl modulo 0 ist, erzeugt es ein Handelssignal, das die Richtung der Beziehung zur EMA bestimmt. Wenn der Preis die EMA-Linie überschreitet, erzeugt es ein Kaufsignal BUY; Wenn der Preis die EMA-Linie unterschreitet, erzeugt es ein Verkaufsignal SELL.
  5. Trading-Einträge gehen in die Richtung des Signals ein, um Positionen zu übernehmen oder zu kürzen. Die Strategie kann die Anzahl der Reverse-Positionen einschränken, um die Anzahl der Geschäfte zu kontrollieren.
  6. Die Stop-Loss-Bedingungen werden in drei Arten eingestellt: Fixed Stop, ATR Stop und Range Stop. Die Stop-Loss-Bedingungen sind umgekehrt.
  7. Sie können wählen, ob Sie den mobilen Stop verwenden möchten, um mehr Gewinne zu erzielen.

Analyse der Stärken

  1. Die Zufälligkeit der Modellrechnung verhindert, dass sie von Preisschwankungen beeinflusst wird, und in Kombination mit der Trendentscheidung eines beweglichen Durchschnitts können wirkungsvolle unwirksame Signale gefiltert werden.
  2. Die Verwendung von Indikatoren für die mittlere und langfristige Trendbeurteilung in Kombination mit kurzfristigen Signalen aus Modellrechnungen ermöglicht eine mehrschichtige Verifizierung und verhindert falsche Signale.
  3. Die benutzerdefinierten Parameter-Einstellungen sind sehr flexibel und lassen sich an die verschiedenen Märkte anpassen, um die optimale Parameterkombination zu finden.
  4. Es sind mehrere Stop-Loss-Methoden integriert, um das Risiko zu kontrollieren. Die Stop-Loss-Bedingungen sind eingerichtet, um die Gewinne zu sichern.
  5. Unterstützt wird die direkte Rückwärtsöffnung der Position, wobei die Richtung der Position nahtlos umgeschaltet werden kann. Die Funktion kann auch abgeschaltet werden, um die Anzahl der Transaktionen zu reduzieren.

Risikoanalyse

  1. Unkorrekt eingestellte Parameter können zu einer Überproduktion von Handelssignalen führen, was zu einer erhöhten Handelsfrequenz und zu höheren Slip-Point-Kosten führt.
  2. Der Index-Moving-Average ist der einzige Trend-Anzeige-Indikator und kann zu Verzögerungen führen, wenn der Kurs eine Wende verpasst.
  3. Die Fixed Stop-Methode ist möglicherweise zu mechanisch und kann nicht an Marktschwankungen angepasst werden.
  4. Direkt-Rückwärts-Positionen erhöhen die Häufigkeit von Positionsanpassungen und erhöhen die Kosten und Risiken des Handels.

Optimierungsrichtung

  1. Verschiedene EMA-Anzeigen können als Ersatz für EMAs getestet werden, oder EMAs können mit anderen EMAs kombiniert werden, um zu sehen, ob die Gewinnquote verbessert werden kann.
  2. Es kann versucht werden, Modellrechnungs-Filter mit anderen Strategien wie Brin-Band, K-Line-Form zu kombinieren, um einen stabileren Filter zu bilden.
  3. Es ist möglich, die Stop-Loss-Methode zu erforschen, um die Stop-Loss-Distanz an die Marktschwankungen anzupassen.
  4. Die Anzahl der Transaktionen oder der Gewinn- und Verlustschwelle kann eingestellt werden, um die Anzahl der direkten Rückwärts-Positionen zu begrenzen.

Zusammenfassen

Die Strategie ermöglicht eine effektive Kombination von Zufallsfilterung und Beurteilung von Moving Average-Trends durch Simulationsoperationen, die Parameter sind flexibel und können an verschiedene Marktbedingungen angepasst und optimiert werden, um zuverlässigere Handelssignale zu erhalten. Gleichzeitig sind mehrere Stop-Loss-Mechanismen integriert, um Risiken zu kontrollieren, sowie Stop-Loss und Moving Stop-Loss, um Gewinne zu sperren. Die Strategie ist klar konzipiert, leicht zu verstehen und zu ändern, lohnt sich für weitere Tests und Optimierungen und hat großes Potenzial für den Einsatz in der Praxis.

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

// To understand this strategy first we need to look into the Modulo (%) operator. The modulo returns the remainder numerator 
// of a division's quotient (the result). If we do 5 / 3, we get 1 and 2/3 as a result, where the remainder is 2 (two thirds, in this case). This can be
// used for many things, for example to determine when a number divides evenly into another number. If we divide 3/3, our result is 1,
// with no remainder numerator, hence our modulo result is 0. In this strategy, we compare a given number (divisor, user defined) with the
// the closing price of every candle (dividend, modifiable from the inputs panel) to determine if the result between their division is an even number. 
// If the answer is true, we have an entry signal. If this signal occurs below the EMA (length is defined by the user) we go short and
// viceversa for longs. This logic can be reversed. In this case, the modulo works as a random-like filter for a moving average strategy
// that usually struggles when the market is ranging.

//@version=4

//@version=4
strategy("Modulo Logic + EMA Strat", 
     overlay=true, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, 
     initial_capital=10000, 
     commission_value=0.04, 
     calc_on_every_tick=false, 
     slippage=0)

direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

/////////////////////// STRATEGY INPUTS ////////////////////////////////////////
title1=input(true, "-----------------Strategy Inputs-------------------")  

a=input(close, title="Dividend")
b=input(4, title="Divisor")
usemod=input(true, title="Use Modulo Logic")
MALen=input(70, title="EMA Length")

/////////////////////// BACKTESTER /////////////////////////////////////////////
title2=input(true, "-----------------General Inputs-------------------")  

// Backtester General Inputs
i_SL=input(true, title="Use Stop Loss and Take Profit")
i_SLType=input(defval="ATR Stop", title="Type Of Stop", options=["Strategy Stop", "Swing Lo/Hi", "ATR Stop"])
i_SPL=input(defval=10, title="Swing Point Lookback")
i_PercIncrement=input(defval=3, step=.1, title="Swing Point SL Perc Increment")*0.01
i_ATR = input(14, title="ATR Length")
i_ATRMult = input(4, step=.1, title="ATR Multiple")
i_TPRRR = input(1, step=.1, title="Take Profit Risk Reward Ratio")
TS=input(false, title="Trailing Stop")

// Bought and Sold Boolean Signal
bought = strategy.position_size > strategy.position_size[1] 
 or strategy.position_size < strategy.position_size[1]

// Price Action Stop and Take Profit
LL=(lowest(i_SPL))*(1-i_PercIncrement)
HH=(highest(i_SPL))*(1+i_PercIncrement)
LL_price = valuewhen(bought, LL, 0)
HH_price = valuewhen(bought, HH, 0)
entry_LL_price = strategy.position_size > 0 ? LL_price : na 
entry_HH_price = strategy.position_size < 0 ? HH_price : na 
tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR
stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR

// ATR Stop
ATR=atr(i_ATR)*i_ATRMult
ATRLong = ohlc4 - ATR
ATRShort = ohlc4 + ATR
ATRLongStop = valuewhen(bought, ATRLong, 0)
ATRShortStop = valuewhen(bought, ATRShort, 0)
LongSL_ATR_price = strategy.position_size > 0 ? ATRLongStop : na 
ShortSL_ATR_price = strategy.position_size < 0 ? ATRShortStop : na 
ATRtp=strategy.position_avg_price + (strategy.position_avg_price - LongSL_ATR_price)*i_TPRRR
ATRstp=strategy.position_avg_price - (ShortSL_ATR_price - strategy.position_avg_price)*i_TPRRR


// Strategy Stop

float LongStop = na
float ShortStop = na
float StratTP = na
float StratSTP = na

/////////////////////// STRATEGY LOGIC /////////////////////////////////////////

modulo=a%b
evennumber=modulo==0
MA=ema(close, MALen)
plot(MA)

BUY=usemod ? evennumber and close > MA : close > MA
SELL=usemod ? evennumber and close < MA : close < MA

//Trading Inputs
DPR=input(true, "Allow Direct Position Reverse")
reverse=input(false, "Reverse Trades")

// Entries
if reverse
    if not DPR
        strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0)
    else     
        strategy.entry("long", strategy.long, when=SELL)
        strategy.entry("short", strategy.short, when=BUY)
else
    if not DPR 
        strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0)
    else
        strategy.entry("long", strategy.long, when=BUY)
        strategy.entry("short", strategy.short, when=SELL)


SL= i_SLType == "Swing Lo/Hi" ? entry_LL_price : i_SLType == "ATR Stop" ? LongSL_ATR_price : LongStop
SSL= i_SLType == "Swing Lo/Hi" ? entry_HH_price : i_SLType == "ATR Stop" ? ShortSL_ATR_price : ShortStop
TP= i_SLType == "Swing Lo/Hi" ? tp : i_SLType == "ATR Stop" ? ATRtp : StratTP
STP= i_SLType == "Swing Lo/Hi" ? stp : i_SLType == "ATR Stop" ? ATRstp : StratSTP

//TrailingStop
dif=(valuewhen(strategy.position_size>0 and strategy.position_size[1]<=0, high,0))
 -strategy.position_avg_price
trailOffset     = strategy.position_avg_price - SL
var tstop = float(na)
if strategy.position_size > 0
    tstop := high- trailOffset - dif
    if tstop<tstop[1]
        tstop:=tstop[1]
else
    tstop := na
StrailOffset     = SSL - strategy.position_avg_price
var Ststop = float(na)
Sdif=strategy.position_avg_price-(valuewhen(strategy.position_size<0 
 and strategy.position_size[1]>=0, low,0))
if strategy.position_size < 0
    Ststop := low+ StrailOffset + Sdif
    if Ststop>Ststop[1]
        Ststop:=Ststop[1]
else
    Ststop := na

strategy.exit("TP & SL", "long", limit=TP, stop=TS? tstop : SL, when=i_SL)
strategy.exit("TP & SL", "short", limit=STP, stop=TS? Ststop : SSL, when=i_SL)

/////////////////////// PLOTS //////////////////////////////////////////////////

plot(i_SL and strategy.position_size > 0 and not TS ? SL : i_SL and strategy.position_size > 0 and TS ? tstop : na , title='SL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size < 0 and not TS ? SSL : i_SL and strategy.position_size < 0 and TS ? Ststop : na , title='SSL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green)
plot(i_SL and strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green)
// Draw price action setup arrows
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, 
 color=color.green, title="Bullish Setup", size=size.auto)
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, 
 color=color.red, title="Bearish Setup", size=size.auto)