Umkehrhandelsstrategie basierend auf breiter Unterstützung/Widerstand


Erstellungsdatum: 2023-10-30 11:23:25 zuletzt geändert: 2023-10-30 11:23:25
Kopie: 1 Klicks: 668
1
konzentrieren Sie sich auf
1617
Anhänger

Umkehrhandelsstrategie basierend auf breiter Unterstützung/Widerstand

Überblick

Die Strategie basiert auf dem Indikator-Polyvalenz-Faktor, um einen Rückschlag zu erzielen. Der Polyvalenz-Faktor ist der Kern der auf dem Handelsvolumen basierenden Expansionsform, die für Indizes mit hohem Handelsvolumen und Volatilität geeignet ist. Der Vorteil der Strategie besteht darin, dass große mittelfristige Trendwende-Gelegenheiten erfasst werden können, um schnell zu profitieren.

Strategieprinzip

  1. Identifizierung von Phobiefaktoren in der Umschreibung von Support/Resistance-Phasen basierend auf der Handelsmenge

    • K-Linien-Formen zur Identifizierung klassischer Support/Resistance, um falsche Durchbrüche mit größeren Transaktionen zu filtern

    • Support/Resistance in der Allgemeinheit hat eine bessere Inklusivität als die klassische Form

    • Durchbruch in der Breitengröße unterstützt durch mehrfache Signal, Durchbruch in der Breitengröße widersteht durch nullfache Signal

  2. Umkehrgeschäfte

    • Reverse-Betrieb nach dem Auslösen des Faktorsignals

    • Positionen, die bereits gehalten wurden, werden rückwärts abgewertet oder rückwärts eröffnet.

  3. Setzen Sie sich ein Gewinnziel

    • Stop-Loss-Einstellung nach ATR

    • Mehrfache Ziele wie 1R/2R/3R haben Vorteile

    • Nach Erreichen unterschiedlicher Gewinnziele in Chargen abgeschafft

Analyse der Stärken

  • Erhebliche Umkehrungen in der mittleren und kurzen Zeit

Ein Durchbruch der Resistenzunterstützung stellt ein starkes Trendwende-Signal dar, das eine gewisse Zuverlässigkeit aufweist und einen erheblichen kurzfristigen Trendwechsel einfängt.

  • Schnelle Gewinne, kleine Rücknahmen

Durch die Festlegung von Stop-Loss- und Mehrfachgewinnzielen können schnelle Gewinne erzielt und die Rücknahme von einzelnen Aktien begrenzt werden.

  • Für Anleihen mit hohem institutionellem Kapital und hoher Volatilität

Die Strategie basiert auf Volumenindikatoren und erfordert einen ausreichenden Zufluss von institutionellen Mitteln, um die Tendenz zu unterstützen; gleichzeitig ist ein gewisser Spielraum für Schwankungen erforderlich, um profitabel zu sein.

Risikoanalyse

  • Die Gefahr, in Schwankungen gefangen zu sein

In einem unsicheren Umfeld kann es zu häufigen Verlusten kommen, wenn die Stop-Out-Operation und die Reverse-Entry-Operation durchgeführt werden.

  • Gefahr von Unterbrechung des Widerstands

Die allgemeine Widerstandsstärke ist nicht absolut zuverlässig, und es besteht die Wahrscheinlichkeit, dass der Test fehlschlägt.

  • Einseitige Positionsrisiken

Die Strategie ist eine reine Umkehrung, ohne Trendverfolgung zu berücksichtigen, und es besteht die Gefahr, dass größere Chancen für die Richtung verpasst werden.

  • Windkontrolle

    • Umkehrungsfaktoren können angemessen gelockert werden und müssen nicht bei jedem Durchbruch umgekehrt werden

    • Filter mit anderen Kennzahlen, wie Abweichungen von der Menge

    • Optimierte Stop-Loss-Strategien zur Verringerung der Wahrscheinlichkeit, dass Sie in die Falle geraten

Optimierungsrichtung

  • Optimierung der Kaliberparameter

Optimierung der generischen Widerstandsparameter zur Identifizierung von zuverlässigeren Faktoren

  • Optimierung der Gewinnstrategie

Sie können mehrere Stufen des Gewinnziels hinzufügen, oder Sie können auch ein nicht-festes Gewinnziel verwenden.

  • Optimierung der Stop-Loss-Strategie

Anpassung der ATR-Parameter oder Einsatz von Stop-Loss-Systemen zur Verringerung der Transaktionskosten, die durch unnötig starke Stop-Loss-Systeme verursacht werden

  • Trends und andere Faktoren

Trendbeurteilungen wie die Durchschnittslinie können eingeführt werden, um schwerwiegende Konfrontationen mit Trends zu vermeiden; auch andere Hilfsfaktoren können eingeführt werden

Zusammenfassen

Der Kern dieser Strategie besteht darin, mit Rückschlaggeschäften größere kurzfristige Schwankungen zu erfassen. Die Strategie ist einfach und direkt, mit Parameteranpassung kann eine gute Eintrittswirkung erzielt werden. Die Rückschlagstrategie ist jedoch eher radikal, es besteht ein gewisses Rückzug- und Deckungsrisiko, und die Stop-Loss- und Profit-Strategie muss weiter optimiert werden.

Strategiequellcode
/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 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/
// © DojiEmoji

//@version=5
strategy("Fractal Strat [KL] ", overlay=true, pyramiding=1, initial_capital=1000000000)
var string ENUM_LONG = "Long"
var string GROUP_ENTRY = "Entry"
var string GROUP_TSL = "Stop loss"
var string GROUP_TREND = "Trend prediction"
var string GROUP_ORDER = "Order size and Profit taking"

// backtest_timeframe_start = input.time(defval=timestamp("01 Apr 2000 13:30 +0000"), title="Backtest Start Time")
within_timeframe = true

// TSL: calculate the stop loss price. {
_multiple       = input(2.0, title="ATR Multiplier for trailing stop loss", group=GROUP_TSL)
ATR_TSL         = ta.atr(input(14, title="Length of ATR for trailing stop loss", group=GROUP_TSL, tooltip="Initial risk amount = atr(this length) x multiplier")) * _multiple
TSL_source      = low
TSL_line_color  = color.green
TSL_transp      = 100
var stop_loss_price = float(0)

var float initial_entry_p    = float(0)
var float risk_amt           = float(0)
var float initial_order_size = float(0)

if strategy.position_size == 0 or not within_timeframe
    TSL_line_color := color.black
    stop_loss_price := TSL_source - ATR_TSL
else if strategy.position_size > 0
    stop_loss_price := math.max(stop_loss_price, TSL_source - ATR_TSL)
    TSL_transp := 0

plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp))
// } end of "TSL" block


// Order size and profit taking {
pcnt_alloc = input.int(5, title="Allocation (%) of portfolio into this security", tooltip="Size of positions is based on this % of undrawn capital. This is fixed throughout the backtest period.", minval=0, maxval=100, group=GROUP_ORDER) / 100

// Taking profits at user defined target levels relative to risked amount (i.e 1R, 2R, 3R)
var bool  tp_mode = input(true, title="Take profit and different levels", group=GROUP_ORDER)
var float FIRST_LVL_PROFIT = input.float(1, title="First level profit", tooltip="Relative to risk. Example: entry at $10 and inital stop loss at $9. Taking first level profit at 1R means taking profits at $11", group=GROUP_ORDER)
var float SECOND_LVL_PROFIT = input.float(2, title="Second level profit", tooltip="Relative to risk. Example: entry at $10 and inital stop loss at $9. Taking second level profit at 2R means taking profits at $12", group=GROUP_ORDER)
var float THIRD_LVL_PROFIT = input.float(3, title="Third level profit", tooltip="Relative to risk. Example: entry at $10 and inital stop loss at $9. Taking third level profit at 3R means taking profits at $13", group=GROUP_ORDER)

// }

// Fractals {
// Modified from synapticEx's implementation: https://www.tradingview.com/script/cDCNneRP-Fractal-Support-Resistance-Fixed-Volume-2/

rel_vol_len = 6 // Relative volume is used; the middle candle has to have volume above the average (say sma over prior 6 bars)
rel_vol = ta.sma(volume, rel_vol_len)
_up = high[3]>high[4] and high[4]>high[5] and high[2]<high[3] and high[1]<high[2] and volume[3]>rel_vol[3]
_down = low[3]<low[4] and low[4]<low[5] and low[2]>low[3] and low[1]>low[2] and volume[3]>rel_vol[3]

fractal_resistance = high[3], fractal_support = low[3]   // initialize

fractal_resistance :=  _up ? high[3] : fractal_resistance[1]
fractal_support := _down ? low[3] : fractal_support[1]

plot(fractal_resistance, "fractal_resistance", color=color.new(color.red,50), linewidth=2, style=plot.style_cross, offset =-3, join=false)
plot(fractal_support, "fractal_support", color=color.new(color.lime,50), linewidth=2, style=plot.style_cross, offset=-3, join=false)
// }

// ATR diversion test {
// Hypothesis testing (2-tailed):
//
// Null hypothesis (H0) and Alternative hypothesis (Ha):
//     H0 : atr_fast equals atr_slow
//     Ha : atr_fast not equals to atr_slow; implies atr_fast is either too low or too high
len_fast    = input(5,title="Length of ATR (fast) for diversion test", group=GROUP_ENTRY)
atr_fast    = ta.atr(len_fast)
atr_slow    = ta.atr(input(50,title="Length of ATR (slow) for diversion test", group=GROUP_ENTRY, tooltip="This needs to be larger than Fast"))

// Calculate test statistic (test_stat)
std_error   = ta.stdev(ta.tr, len_fast) / math.pow(len_fast, 0.5)
test_stat = (atr_fast - atr_slow) / std_error

// Compare test_stat against critical value defined by user in settings
//critical_value = input.float(1.645,title="Critical value", tooltip="Strategy uses 2-tailed test to compare atr_fast vs atr_slow. Null hypothesis (H0) is that both should equal. Based on the computed test statistic value, if absolute value of it is +/- this critical value, then H0 will be rejected.", group=GROUP_ENTRY)
conf_interval = input.string(title="Confidence Interval", defval="95%", options=["90%","95%","99%"], tooltip="Critical values of 1.645, 1.96, 2.58, for CI=90%/95%/99%, respectively; Under 2-tailed test to compare atr_fast vs atr_slow. Null hypothesis (H0) is that both should equal. Based on the computed test statistic value, if absolute value of it is +/- critical value, then H0 will be rejected.")
critical_value = conf_interval == "90%" ? 1.645 : conf_interval == "95%" ? 1.96 : 2.58
reject_H0_lefttail = test_stat < -critical_value
reject_H0_righttail = test_stat > critical_value

// } end of "ATR diversion test" block

// Entry Signals
entry_signal_long = close >= fractal_support and reject_H0_lefttail

// MAIN {
// Update the stop limit if strategy holds a position.
if strategy.position_size > 0
    strategy.exit(ENUM_LONG, comment="SL", stop=stop_loss_price)

// Entry
if within_timeframe and entry_signal_long and strategy.position_size == 0
    initial_entry_p := close
    risk_amt := ATR_TSL
    initial_order_size := math.floor(pcnt_alloc * strategy.equity / close)
    strategy.entry(ENUM_LONG, strategy.long, qty=initial_order_size)

var int TP_taken_count = 0
if tp_mode and close > strategy.position_avg_price
    if close >= initial_entry_p + THIRD_LVL_PROFIT * risk_amt and TP_taken_count == 2
        strategy.close(ENUM_LONG, comment="TP Lvl3", qty=math.floor(initial_order_size / 3))
        TP_taken_count := TP_taken_count + 1
    else if close >= initial_entry_p + SECOND_LVL_PROFIT * risk_amt and TP_taken_count == 1
        strategy.close(ENUM_LONG, comment="TP Lvl2", qty=math.floor(initial_order_size / 3))
        TP_taken_count := TP_taken_count + 1
    else if close >= initial_entry_p + FIRST_LVL_PROFIT * risk_amt and TP_taken_count == 0
        strategy.close(ENUM_LONG, comment="TP Lvl1", qty=math.floor(initial_order_size / 3))
        TP_taken_count := TP_taken_count + 1
    
// Alerts
_atr = ta.atr(14)
alert_helper(msg) =>
    prefix = "[" + syminfo.root + "] "
    suffix = "(P=" + str.tostring(close, "#.##") + "; atr=" + str.tostring(_atr, "#.##") + ")"
    alert(str.tostring(prefix) + str.tostring(msg) + str.tostring(suffix), alert.freq_once_per_bar)

if strategy.position_size > 0 and ta.change(strategy.position_size)
    if strategy.position_size > strategy.position_size[1]
        alert_helper("BUY")
    else if strategy.position_size < strategy.position_size[1]
        alert_helper("SELL")

// Clean up - set the variables back to default values once no longer in use
if ta.change(strategy.position_size) and strategy.position_size == 0
    TP_taken_count := 0
    initial_entry_p := float(0)
    risk_amt := float(0)
    initial_order_size := float(0)
    stop_loss_price := float(0)
// } end of MAIN block