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.
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.
Dies löst das Problem des falschen Signals einzelner Indikatoren. Der Stop-Loss auf Basis der jüngsten Bars
Zu den Vorteilen dieser Strategie gehören:
Indikatorkombination verbessert die Signalgenauigkeit. TMO und AMA validieren einander, um falsche Signale zu reduzieren und die Genauigkeit zu verbessern.
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.
Durch die Verwendung der jüngsten Bars
Koncise und effektive Logik. Mit nur zwei Indikatoren hat die Strategie ein komplettes Scalping-System mit klarer und einfacher Logik implementiert.
Die wichtigsten Risiken der Strategie:
Da es sich bei einer Scalping-Strategie um eine kurze Haltedauer handelt, können hohe Handelskosten die Rentabilität beeinträchtigen.
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.
Schwierige Parameteroptimierungsrisiken. Die Strategie beinhaltet mehrere Parameter. Die optimale Parameterkombination zu finden kann eine Herausforderung sein.
Die Strategie kann in folgenden Bereichen weiter optimiert werden:
Fügen Sie mehr Filterindikatoren wie Lautstärke hinzu, um falsche Signale zu entfernen und die Signalqualität weiter zu verbessern.
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.
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.
Backtest und Live-Handel über verschiedene Produkte und Zeitrahmen hinweg, um die am besten geeigneten Marktbedingungen für diese Strategie-Logik herauszufinden.
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)