
Bei dieser Strategie handelt es sich um ein Handelssystem, das auf liquiditätsgewichteten gleitenden Durchschnitten basiert. Es misst die Marktliquidität, indem es die Beziehung zwischen Preisschwankungen und Handelsvolumen überwacht und auf dieser Grundlage schnelle und langsame gleitende Durchschnitte erstellt. Ein Kaufsignal wird generiert, wenn die schnelle Linie die langsame Linie kreuzt, und ein Verkaufssignal wird generiert, wenn sie die langsame Linie kreuzt. Die Strategie schenkt abnormalen Liquiditätsereignissen besondere Aufmerksamkeit und zeichnet wichtige Preispunkte durch Arrays auf, wodurch präzisere Handelsmöglichkeiten geboten werden.
Der Kern der Strategie besteht darin, die Marktliquidität anhand des Verhältnisses von Handelsvolumen zu Preisänderung zu messen. Die konkreten Implementierungsschritte sind wie folgt:
Dies ist eine innovative Strategie, die Liquiditätsanalyse mit technischen Indikatoren kombiniert und das traditionelle gleitende Durchschnitts-Crossover-System durch die Überwachung von Marktliquiditätsanomalien optimiert. Obwohl es in bestimmten Marktumgebungen gute Ergebnisse liefert, bedarf es noch weiterer Optimierung, um Stabilität und Anwendbarkeit zu verbessern. Es wird Händlern empfohlen, vor der Echtzeitverwendung ausreichende Tests durchzuführen und diese mit anderen Indikatoren zu kombinieren, um ein umfassenderes Handelssystem aufzubauen.
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-16 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/
//Liquidity ignoring price location
//@version=6
strategy("Liquidity Weighted Moving Averages [AlgoAlpha]", overlay=true, commission_type=strategy.commission.percent, commission_value=0.1, slippage=3)
// Inputs
outlierThreshold = input.int(10, "Outlier Threshold Length")
fastMovingAverageLength = input.int(50, "Fast MA Length")
slowMovingAverageLength = input.int(100, "Slow MA Length")
start_date = input(timestamp("2018-01-01 00:00"), title="Start Date")
end_date = input(timestamp("2069-12-31 23:59"), title="End Date")
// Define liquidity based on volume and price movement
priceMovementLiquidity = volume / math.abs(close - open)
// Calculate the boundary for liquidity to identify outliers
liquidityBoundary = ta.ema(priceMovementLiquidity, outlierThreshold) + ta.stdev(priceMovementLiquidity, outlierThreshold)
// Initialize an array to store liquidity values when they cross the boundary
var liquidityValues = array.new_float(5)
// Check if the liquidity crosses above the boundary and update the array
if ta.crossover(priceMovementLiquidity, liquidityBoundary)
array.insert(liquidityValues, 0, close)
if array.size(liquidityValues) > 5
array.pop(liquidityValues)
// Calculate the Exponential Moving Averages for the close price at the last liquidity crossover
fastEMA = ta.ema(array.size(liquidityValues) > 0 ? array.get(liquidityValues, 0) : na, fastMovingAverageLength)
slowEMA = ta.ema(array.size(liquidityValues) > 0 ? array.get(liquidityValues, 0) : na, slowMovingAverageLength)
// Trading Logic
in_date_range = true
buy_signal = ta.crossover(fastEMA, slowEMA) and in_date_range
sell_signal = ta.crossunder(fastEMA, slowEMA) and in_date_range
// Strategy Entry and Exit
if (buy_signal)
strategy.entry("Buy", strategy.long)
if (sell_signal)
strategy.close("Buy")
// Plotting
fastPlot = plot(fastEMA, color=fastEMA > slowEMA ? color.new(#00ffbb, 50) : color.new(#ff1100, 50), title="Fast EMA")
slowPlot = plot(slowEMA, color=fastEMA > slowEMA ? color.new(#00ffbb, 50) : color.new(#ff1100, 50), title="Slow EMA")
// Create a fill between the fast and slow EMA plots with appropriate color based on crossover
fill(fastPlot, slowPlot, fastEMA > slowEMA ? color.new(#00ffbb, 50) : color.new(#ff1100, 50))