
Стратегия представляет собой торговую систему, основанную на скользящих средних, взвешенных по ликвидности. Она измеряет ликвидность рынка, отслеживая взаимосвязь между колебаниями цен и объемом торговли, и на этой основе строит быстрые и медленные скользящие средние. Сигнал на покупку генерируется, когда быстрая линия пересекает медленную линию снизу вверх, а сигнал на продажу генерируется, когда она пересекает ее снизу вверх. Стратегия уделяет особое внимание аномальным событиям ликвидности и регистрирует ключевые ценовые точки с помощью массивов, тем самым предоставляя более точные торговые возможности.
Суть стратегии заключается в измерении ликвидности рынка посредством соотношения объема торгов к изменению цены. Конкретные шаги по внедрению следующие:
Это инновационная стратегия, которая сочетает анализ ликвидности с техническими индикаторами, оптимизируя традиционную систему пересечения скользящих средних путем мониторинга аномалий ликвидности рынка. Хотя он хорошо работает в определенных рыночных условиях, ему все еще требуется дальнейшая оптимизация для повышения стабильности и применимости. Трейдерам рекомендуется провести достаточное тестирование перед использованием в реальном времени и объединить его с другими индикаторами для создания более полной торговой системы.
/*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))