Doppelindikatoren-Combo Crazy Intraday Scalping-Strategie

Schriftsteller:ChaoZhang, Datum: 2023-12-01 14:47:57
Tags:

img

Übersicht

Diese Strategie kombiniert die Kauf- und Verkaufssignale von LuxAlgo's TMO- und AMA-Indikatoren, um den Beginn eines Trends während der bereichsgebundenen Konsolidierung zu erfassen.

Strategie Logik

Der TMO-Indikator spiegelt die Kursdynamik wider. Er gehört zum Oszillator-Indikatortyp und kann Handelssignale erzeugen, wenn eine Divergenz auftritt. Der AMA-Indikator ist ein glätteter gleitender Durchschnitt. Er zeigt eine Reihe von Kursschwankungen und zeigt überkaufte / überverkaufte Bedingungen an, wenn sich der Preis dem oberen / unteren Band nähert.

Die Hauptlogik hinter dieser Strategie ist: TMO kann Trenddivergenzen erkennen, um Handelssignale zu generieren. AMA kann Preisumkehrzonen identifizieren. Zusammen mit der Bestätigung durch die Erhöhung der Kerzenkörpergröße können sie die Genauigkeit der Erfassung des Trendstarts verbessern.

  1. TMO gibt Kaufsignal, d.h. bullische Divergenz UND AMA zeigt seine maximale Extremität
  2. TMO gibt Verkaufssignal, d.h. bearish Divergenz UND AMA zeigt sein Min-Extrem
  3. Auch erfordert die neueste 3 Kerzes Körper zu erweitern in der Größe

Dies löst das Problem des falschen Signals einzelner Indikatoren. Der Stop-Loss auf Basis der jüngsten Bars höchster Höchst-/niedrigster Tief kann das Risiko effektiv kontrollieren.

Vorteile

Zu den Vorteilen dieser Strategie gehören:

  1. Indikatorkombination verbessert die Signalgenauigkeit. TMO und AMA validieren einander, um falsche Signale zu reduzieren und die Genauigkeit zu verbessern.

  2. Die Kombination von TMO-Signal, AMA-Extremitäten und steigender Kerzengröße ermöglicht es der Strategie, die Trendinitiation effektiv zu identifizieren, die Scalping-Strategien verfolgen.

  3. Durch die Verwendung der jüngsten Bars höchster/niedrigster Preis als Stop-Loss wird das Risiko jedes Handels gesteuert, während das Verzögerungsrisiko durch die Indikatorrückrechnung vermieden wird.

  4. Koncise und effektive Logik. Mit nur zwei Indikatoren hat die Strategie ein komplettes Scalping-System mit klarer und einfacher Logik implementiert.

Risiken

Die wichtigsten Risiken der Strategie:

  1. Da es sich bei einer Scalping-Strategie um eine kurze Haltedauer handelt, können hohe Handelskosten die Rentabilität beeinträchtigen.

  2. Aggressives Stop-Loss-Risiko: Durch die Verwendung der jüngsten extremen Preise für den Stop-Loss kann es anfällig für Marktlärm sein und die Wahrscheinlichkeit erhöhen, dass der Stop-Loss ausgelöst wird.

  3. Schwierige Parameteroptimierungsrisiken. Die Strategie beinhaltet mehrere Parameter. Die optimale Parameterkombination zu finden kann eine Herausforderung sein.

Optimierung

Die Strategie kann in folgenden Bereichen weiter optimiert werden:

  1. Fügen Sie mehr Filterindikatoren wie Lautstärke hinzu, um falsche Signale zu entfernen und die Signalqualität weiter zu verbessern.

  2. Teständerungen an den Stop-Loss-Regeln, um sie weniger aggressiv zu gestalten, z. B. Hinzufügen von Bestätigungsbalken vor Auslösen des Stop-Loss.

  3. Parameteroptimierung durchführen, um die beste Parameterkombination für die Indikatoren zu finden, die dazu beitragen kann, mehr Lärm zu filtern und die Gewinnrate zu erhöhen.

  4. Backtest und Live-Handel über verschiedene Produkte und Zeitrahmen hinweg, um die am besten geeigneten Marktbedingungen für diese Strategie-Logik herauszufinden.

Schlussfolgerung

Diese Strategie kombiniert die Handelssignale von TMO und AMA mit dem Scalp in Bereichsgebundenen Märkten, indem frühzeitige Trendbewegungen erfasst werden. Sie hat die Vorteile hoher Signalgenauigkeit, frühzeitiger Trendfassung und effektiver Risikokontrolle. Weitere Optimierungen der Parameter und Strategievorschriften können sie zu einer sehr praktischen Intraday-Scalping-Strategie machen.


/*backtest
start: 2023-11-23 00:00:00
end: 2023-11-30 00:00:00
period: 10m
basePeriod: 1m
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/
// © Kaspricci

//@version=5
strategy("TradeIQ - Crazy Scalping Trading Strategy [Kaspricci]", overlay=true, initial_capital = 1000, currency = currency.USD)

headlineTMO = "TMO Settings"

tmoLength   = input.int(7, "TMO Length", minval = 1, group = headlineTMO)
tmoSource   = input.source(close, "TMO Source", group = headlineTMO)

// calculate values
osc         = ta.mom(ta.sma(ta.sma(tmoSource, tmoLength), tmoLength), tmoLength)

// determine color of historgram
oscColor    = osc > osc[1] and osc > 0 ? #00c42b : osc < osc[1] and osc > 0 ? #4ee567 : osc < osc[1] and osc < 0 ? #ff441f : osc > osc[1] and osc < 0 ? #c03920 : na

// plot histogram
//plot(osc, "OSC", oscColor, linewidth = 3, style = plot.style_histogram)

// conditon to find highs and lows
up          = ta.highest(tmoSource, tmoLength)
dn          = ta.lowest(tmoSource, tmoLength)

// define conditions to be used for finding divergence
phosc = ta.crossunder(ta.change(osc), 0)
plosc = ta.crossover (ta.change(osc), 0)

// test for divergence
bear = osc > 0 and phosc and ta.valuewhen(phosc,osc,0) < ta.valuewhen(phosc,osc,1) and ta.valuewhen(phosc,up,0) > ta.valuewhen(phosc,up,1) ? 1 : 0
bull = osc < 0 and plosc and ta.valuewhen(plosc,osc,0) > ta.valuewhen(plosc,osc,1) and ta.valuewhen(plosc,dn,0) < ta.valuewhen(plosc,dn,1) ? 1 : 0

// -------------------------------------------------------------------------------------------------------------

headlineAMA = "AMA Settings"

amaSource   = input.source(defval = close, title = "AMA Source", group = headlineAMA)
amaLength   = input.int(defval = 50, title = "AMA Length", minval = 2, group = headlineAMA)


amaMulti    = input.float(defval = 2.0, title = "Factor", minval = 1)

amaShowCd   = input(defval = true , title = "As Smoothed Candles")
amaShowEx   = input(defval = true,   title = "Show Alternating Extremities")

amaAlpha    = input.float(1.0, "Lag",       minval=0, step=.1, tooltip='Control the lag of the moving average (higher = more lag)', group= 'AMA Kernel Parameters')
amaBeta     = input.float(0.5, "Overshoot", minval=0, step=.1, tooltip='Control the overshoot amplitude of the moving average (higher = overshoots with an higher amplitude)', group='AMA Kernel Parameters')

// -------------------------------------------------------------------------------------------------------------

headlineSL = "Stop Loss Settings"

slLength    = input.int(defval = 10, title = "SL Period", minval = 1, group = headlineSL, tooltip = "Number of bars for swing high / low")

// -------------------------------------------------------------------------------------------------------------

var b       = array.new_float(0)
var float x = na

if barstate.isfirst
    for i = 0 to amaLength - 1
        x := i / (amaLength - 1)
        w = math.sin(2 * 3.14159 * math.pow(x, amaAlpha)) * (1 - math.pow(x, amaBeta))
        array.push(b, w)

// local function to filter the source
filter(series float x) =>
    sum = 0.

    for i = 0 to amaLength - 1
        sum := sum + x[i] * array.get(b,i)
    
    sum / array.sum(b)

// apply filter function on source series

srcFiltered = filter(amaSource)

deviation   = ta.sma(math.abs(amaSource - srcFiltered), amaLength) * amaMulti

upper       = srcFiltered + deviation
lower       = srcFiltered - deviation

//----
crossHigh   = ta.cross(high, upper)
crossLow    = ta.cross(low, lower)

var os      = 0
os          := crossHigh ? 1 : crossLow ? 0 : os[1]

ext         = os * upper + (1 - os) * lower

//----
os_css = ta.rsi(srcFiltered, amaLength) / 100

extColor    = os == 1 ? #30FF85 : #ff1100

plot(srcFiltered, "MA", amaShowCd ? na : color.black, 2, editable = false)
plot(amaShowEx ? ext : na, "Extremities", ta.change(os) ? na : extColor, 2, editable=false)

// handle smoothed candles
var float h = na
var float l = na
var float c = na
var float body = na

if amaShowCd
    h := filter(high)
    l := filter(low)
    c := filter(amaSource)
    body := math.abs(math.avg(c[1], c[2]) - c)

ohlc_os = ta.rsi(c, amaLength) / 100

plotcandle(math.avg(c[1], c[2]), h, l, c, "Smooth Candles", #434651, bordercolor = na, editable = false, display = amaShowCd ? display.all : display.none)

// -------------------------------------------------------------------------------------------------------------

plotshape(bull ? ext : na, "Bullish Circle", shape.circle,    location.absolute, color = #00c42b, size=size.tiny)
plotshape(bear ? ext : na, "Bearish Circle", shape.circle,    location.absolute, color = #ff441f, size=size.tiny)
plotshape(bull ? ext : na, "Bullish Label",  shape.labeldown, location.absolute, color = #00c42b, text="Buy", textcolor=color.white, size=size.tiny)
plotshape(bear ? ext : na, "Bearish Label",  shape.labelup,   location.absolute, color = #ff441f, text="Sell", textcolor=color.white, size=size.tiny)

// -------------------------------------------------------------------------------------------------------------

candleSizeIncreasing = body[2] < body[1] and body[1] < body[0]

longEntryCond   = os == 1 and bull
shortEntryCond  = os == 0 and bear

longEntry       = strategy.opentrades == 0 and candleSizeIncreasing and not candleSizeIncreasing[1] and ta.barssince(longEntryCond)  < ta.barssince(os == 0) and ta.barssince(longEntryCond) < ta.barssince(bear)
shortEntry      = strategy.opentrades == 0 and candleSizeIncreasing and not candleSizeIncreasing[1] and ta.barssince(shortEntryCond) < ta.barssince(os == 1) and ta.barssince(shortEntryCond) < ta.barssince(bull)

longExit        = strategy.opentrades > 0 and strategy.position_size > 0 and (bear or os == 0)
shortExit       = strategy.opentrades > 0 and strategy.position_size < 0 and (bull or os == 1)

recentSwingHigh = ta.highest(high, slLength) // highest high of last candles
recentSwingLow  = ta.lowest(low,   slLength) // lowest low of recent candles

bgcolor(longEntry  ? color.rgb(76, 175, 79, 90) : na)
bgcolor(shortEntry ? color.rgb(255, 82, 82, 90) : na)

slLong          = (close - recentSwingLow) / syminfo.mintick  // stop loss in ticks
slShort         = (recentSwingHigh - close) / syminfo.mintick // stop loss in ticks

newOrderID         = str.tostring(strategy.closedtrades + strategy.opentrades + 1)
curOrderID         = str.tostring(strategy.closedtrades + strategy.opentrades)

alertMessageForEntry = "Trade {0} - New {1} Entry at price: {2} with stop loss at: {3}"

if (longEntry)
    alertMessage = str.format(alertMessageForEntry, newOrderID, "Long", close, recentSwingLow)
    
    strategy.entry(newOrderID, strategy.long, alert_message = alertMessage)
    strategy.exit("Stop Loss Long", newOrderID, loss = slLong, alert_message = "Stop Loss for Trade " + newOrderID)

if(longExit)
    strategy.close(curOrderID, alert_message = "Close Trade " + curOrderID)

if (shortEntry)
    alertMessage = str.format(alertMessageForEntry, newOrderID, "Short", close, recentSwingLow)

    strategy.entry(newOrderID, strategy.short, alert_message = alertMessage)
    strategy.exit("Stop Loss Short", newOrderID, loss = slShort, alert_message = "Stop Loss for Trade " + newOrderID)

if(shortExit)
    strategy.close(curOrderID, alert_message = "Close Trade " + curOrderID)

Mehr