
Die Strategie kombiniert die Methode des Bewegenden Durchschnitts, um die Richtung der Tendenz zu bestimmen, und die Methode der K-Linienform, um die Wendepunkte zu bestimmen, und ermöglicht den Trend-Tracking-Handel. Die Strategie verwendet zuerst den Bewegenden Durchschnitt, um die Richtung der Gesamttrend zu bestimmen, und sucht dann in der Richtung der Tendenz nach potenziellen Wendeformen der K-Linienform als Einstiegssignale, um die Trendführung zu verfolgen.
Die Strategie verwendet einen einfachen Moving Average mit einer Länge von 10 Tagen, um die Richtung der Preisentwicklung zu bestimmen. Wenn der Preis über dem Moving Average liegt, wird er als aufsteigend angesehen; wenn der Preis unter dem Moving Average liegt, wird er als absteigend angesehen.
Nach der Bestimmung der Richtung des Trends beurteilt die Strategie potenzielle Trendwendepunkte anhand einer Reihe von Sonnenstrahl K-Line-Formen und Sonnenstrahl K-Line-Formen. Die häufigsten Sonnenstrahl-Formen umfassen den Aufgang des Sterns, den Morgenstern, die drei Weißen Soldaten usw. Die häufigsten Sonnenstrahl-Formen umfassen den Abendstern, die drei Krähen usw. Wenn ein Sonnenstrahl-Signal im Aufwärtstrend identifiziert wird, wird eine Kaufoperation durchgeführt.
Außerdem wird die Strategie in Verbindung mit den wichtigsten Unterstützungs- und Widerstandspunkten verwendet, um den spezifischen Preis für den Einstieg zu bestimmen. Wenn Sie im Aufwärtstrend einkaufen, werden Sie beim Durchbruch der ersten Unterstützung gekauft.
Der größte Vorteil dieser Strategie besteht darin, dass sie eine Kombination aus Trendbeurteilung und Umkehrsignal bietet, die es ermöglicht, Trendwendepunkte rechtzeitig zu erfassen und Trendverfolgung zu ermöglichen. Im Vergleich zu einer einfachen Moving-Average-Strategie kann diese Strategie die Gewinnwahrscheinlichkeit erheblich erhöhen.
Außerdem verbessert die Strategie die Fähigkeit, K-Line-Form-Urteile einzubeziehen, um Überraschungen zu behandeln. K-Line-Formen können als Filter wirken, um falsche Geschäfte zu vermeiden, wenn ein Ereignis mit geringer Wahrscheinlichkeit zu einem Falschbruch führt.
Das Hauptrisiko dieser Strategie liegt in der Genauigkeit der Einstellung der Moving Average-Parameter und der K-Line-Form-Beschlüsse. Eine falsche Einstellung der Moving Average-Periode kann zu Trendfehlern führen, und ein Fehler bei der K-Line-Form-Beschlüsse kann zu Fehlentscheidungen führen.
Darüber hinaus ist eine Umkehrung der K-Linie nicht hundertprozentig sicher, dass die Tendenz umgekehrt wird, so dass die Strategie mit einem gewissen Risiko verbunden ist. Die Strategie kann einen größeren Verlust erleiden, wenn der Markt eine größere Umkehrung aufweist.
Die Strategie bietet viel Optimierungsmöglichkeiten. Zum Beispiel können Parameter für die dynamische Anpassung des Moving Averages berücksichtigt werden, wobei verschiedene Moving Average-Perioden in verschiedenen Marktphasen verwendet werden. Es können auch Methoden des maschinellen Lernens hinzugefügt werden, um das K-Linien-Form-Urteilsmodell mit historischen Daten zu trainieren, um die Urteilsgenauigkeit zu verbessern.
Darüber hinaus kann man auch erwägen, weitere Faktoren zu berücksichtigen, die Trends und Hotspot-Bereiche bestimmen, z. B. Veränderungen des Handelsvolumens, Volatilitätsindikatoren usw., um die Strategie umfassender und robuster zu machen.
Die Strategie ist insgesamt sehr gut geeignet, um die mittelfristigen Trends der Aktienmärkte zu verfolgen, und kann hohe, stabile Erträge erzielen. Wenn sie weiter optimiert wird, ist es wahrscheinlich, dass sie eine gut funktionierende quantitative Strategie wird. Wenn die Anleger die Anwendung der Strategie beherrschen, können sie auch ihre langfristigen Portfolios aufbauen, um die Risiken für einzelne Aktien zu kontrollieren und gleichzeitig gute Überschüsse zu erzielen.
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Trend Following Strategy with Candlestick Patterns", overlay=true)
// Moving Average
ma_period = input(10, title="Moving Average Period")
moving_average = ta.sma(close, ma_period)
// Candlestick Patterns
// Custom Function
abs(x) => x >= 0 ? x : -x
// Candlestick Patterns
isDoji() =>
(close - open) <= (high - low) * 0.1
isMarubozuWhite() =>
close == high and open == low and close > open
isHammer() =>
(high - low) >= 3 * abs(open - close) and (close - low) / (0.001 + high - low) > 0.6 and (open - low) / (0.001 + high - low) > 0.6
isInvertedHammer() =>
(high - low) >= 3 * abs(open - close) and (high - close) / (0.001 + high - low) > 0.6 and (high - open) / (0.001 + high - low) > 0.6
isLongLowerShadow() =>
(low - close) > 2 * abs(open - close) and (low - open) / (0.001 + high - low) > 0.6
isUpsideTasukiGap() =>
close[1] < open[1] and open > close and open > close[1] and close < open[1]
isRisingWindow() =>
high[1] < low and close > open
isPiercing() =>
close[1] < open[1] and close > open and close > ((open + low) / 2) and close < open[1] and open < close[1]
isBullishEngulfing() =>
close[1] < open[1] and close > open and high > high[1] and low < low[1]
isTweezerBottom() =>
low == ta.valuewhen(low == ta.lowest(low, 10), low, 0) and low == ta.valuewhen(low == ta.lowest(low, 20), low, 0)
isBullishAbandonedBaby() =>
close[2] < open[2] and close[1] > open[1] and low[1] > ta.valuewhen(high == ta.highest(high, 2), high, 0) and open > close and close > ta.valuewhen(high == ta.highest(high, 2), high, 0)
isMorningStar() =>
close[2] < open[2] and close[1] < open[1] and close > open[1] and open < close[2] and open > close[1]
isMorningDojiStar() =>
close[2] < open[2] and close[1] < open[1] and isDoji() and close > open[1] and open < close[2] and open > close[1]
isDragonflyDoji() =>
isDoji() and (high - close) / (0.001 + high - low) < 0.1 and (open - low) / (0.001 + high - low) > 0.6
isThreeWhiteSoldiers() =>
close[2] < open[2] and close[1] < open[1] and close > open and open < close[2] and open < close[1] and close > open[1]
isRisingThreeMethods() =>
close[4] < open[4] and close[1] < open[1] and close > open and open < close[4] and open < close[1] and close > open[1]
isMarubozuBlack() =>
close == low and open == high and open > close
isGravestoneDoji() =>
isDoji() and (close - low) / (0.001 + high - low) < 0.1 and (high - open) / (0.001 + high - low) > 0.6
isHangingMan() =>
(high - low) >= 4 * abs(open - close) and (open - close) / (0.001 + high - low) > 0.6 and (high - open) / (0.001 + high - low) > 0.6
isLongUpperShadow() =>
(high - open) > 2 * abs(open - close) and (high - close) / (0.001 + high - low) > 0.6
isDownsideTasukiGap() =>
close[1] > open[1] and open < close and open < close[1] and close > open[1]
isFallingWindow() =>
low[1] > high and close < open
isDarkCloudCover() =>
close[1] > open[1] and close < open and close < ((open + high) / 2) and close > open[1] and open > close[1]
isBearishEngulfing() =>
close[1] > open[1] and close < open and high > high[1] and low < low[1]
isTweezerTop() =>
high == ta.valuewhen(high == ta.highest(high, 10), high, 0) and high == ta.valuewhen(high == ta.highest(high, 20), high, 0)
isAbandonedBaby() =>
close[2] > open[2] and close[1] < open[1] and high[1] < ta.valuewhen(low == ta.lowest(low, 2), low, 0) and open < close and close < ta.valuewhen(low == ta.lowest(low, 2), low, 0)
isEveningDojiStar() =>
close[2] > open[2] and close[1] > open[1] and isDoji() and close < open[1] and open > close[2] and open < close[1]
isEveningStar() =>
close[2] > open[2] and close[1] > open[1] and close < open[1] and open > close[2] and open < close[1]
isThreeBlackCrows() =>
close[2] > open[2] and close[1] > open[1] and close < open and open > close[2] and open > close[1] and close < open[1]
isFallingThreeMethods() =>
close[4] > open[4] and close[1] > open
isShootingStar() =>
(high - low) >= 3 * abs(open - close) and (high - close) / (0.001 + high - low) > 0.6 and (high - open) / (0.001 + high - low) > 0.6
doji = isDoji()
marubozuWhite = isMarubozuWhite()
hammer = isHammer()
invertedHammer = isInvertedHammer()
longLowerShadow = isLongLowerShadow()
upsideTasukiGap = isUpsideTasukiGap()
risingWindow = isRisingWindow()
piercing = isPiercing()
bullishEngulfing = isBullishEngulfing()
tweezerBottom = isTweezerBottom()
bullishAbandonedBaby = isBullishAbandonedBaby()
morningStar = isMorningStar()
morningDojiStar = isMorningDojiStar()
dragonflyDoji = isDragonflyDoji()
threeWhiteSoldiers = isThreeWhiteSoldiers()
risingThreeMethods = isRisingThreeMethods()
marubozuBlack = isMarubozuBlack()
gravestoneDoji = isGravestoneDoji()
hangingMan = isHangingMan()
longUpperShadow = isLongUpperShadow()
downsideTasukiGap = isDownsideTasukiGap()
fallingWindow = isFallingWindow()
darkCloudCover = isDarkCloudCover()
bearishEngulfing = isBearishEngulfing()
tweezerTop = isTweezerTop()
abandonedBaby = isAbandonedBaby()
eveningDojiStar = isEveningDojiStar()
eveningStar = isEveningStar()
threeBlackCrows = isThreeBlackCrows()
fallingThreeMethods = isFallingThreeMethods()
shootingStar = isShootingStar()
isBullishPattern() =>
(isMarubozuWhite() or isHammer() or isInvertedHammer() or isDoji() or isMorningStar() or isBullishEngulfing() or isThreeWhiteSoldiers() or isMarubozuBlack() or isHangingMan() or isDownsideTasukiGap() or isDarkCloudCover())
isBearishPattern() =>
(isMarubozuBlack() or isInvertedHammer() or isLongUpperShadow() or isTweezerTop() or isGravestoneDoji() or isEveningStar() or isBearishEngulfing() or isThreeBlackCrows() or isShootingStar())
isBullishCandle = isBullishPattern()
isBearishCandle = isBearishPattern()
// Calculate Pivot Points
pivotPoint(high, low, close) =>
(high + low + close) / 3
r1 = pivotPoint(high[1], low[1], close[1]) * 2 - low[1]
s1 = pivotPoint(high[1], low[1], close[1]) * 2 - high[1]
r2 = pivotPoint(high[1], low[1], close[1]) + (high[1] - low[1])
s2 = pivotPoint(high[1], low[1], close[1]) - (high[1] - low[1])
r3 = high[1] + 2 * (pivotPoint(high[1], low[1], close[1]) - low[1])
s3 = low[1] - 2 * (high[1] - pivotPoint(high[1], low[1], close[1]))
// Trend Identification
is_uptrend = close > moving_average
is_downtrend = close < moving_average
// Entry and Exit Conditions with Trend Identification
enterLong = is_uptrend and isBullishCandle and close > r1
exitLong = is_uptrend and (bearishEngulfing or doji or close < s1)
enterShort = is_downtrend and isBearishCandle and close < s1
exitShort = is_downtrend and (bullishEngulfing or doji or close > r1)
// Strategy Execution
if enterLong and strategy.position_size == 0 and strategy.position_size[1] == 0 and close > r1
strategy.entry("Buy", strategy.long, qty=1)
if exitLong and strategy.position_size > 0
strategy.close("Buy")
if enterShort and strategy.position_size == 0 and close < s1
strategy.entry("Sell", strategy.short, qty=1)
if exitShort and strategy.position_size < 0
strategy.close("Sell")
// Stop-Loss and Trailing Stop-Loss
stop_loss_pct = input(2.0, title="Stop Loss Percentage")
trailing_stop_loss_pct = input(1.0, title="Trailing Stop Loss Percentage")
trailing_stop_loss_active = input(true, title="Trailing Stop Loss Active")
// Stop-Loss
stop_loss_level = strategy.position_avg_price * (1 - stop_loss_pct / 100)
strategy.exit("Stop Loss", "Buy", loss=stop_loss_level)
// Trailing Stop-Loss
// Plotting Moving Average
plot(moving_average, color=color.blue, title="Moving Average", linewidth=2)
// Plotting Candlestick Patterns
plotshape(isBullishCandle, title="Bullish Candle", location=location.belowbar, color=color.green, style=shape.labelup)
plotshape(isBearishCandle, title="Bearish Candle", location=location.abovebar, color=color.red, style=shape.labeldown)
// Plotting Support and Resistance Levels
//hline(r1, "Resistance Level 1", color=color.red, linestyle=hline.style_dotted)
//hline(s1, "Support Level 1", color=color.green, linestyle=hline.style_dotted)