
Chiến lược này là một hệ thống giao dịch dựa trên các đường trung bình động có trọng số thanh khoản. Nó đo lường tính thanh khoản của thị trường bằng cách theo dõi mối quan hệ giữa biến động giá và khối lượng giao dịch, và xây dựng các đường trung bình động nhanh và chậm trên cơ sở này. Tín hiệu mua được tạo ra khi đường nhanh cắt lên trên đường chậm và tín hiệu bán được tạo ra khi đường này cắt xuống dưới. Chiến lược này đặc biệt chú ý đến các sự kiện thanh khoản bất thường và ghi lại các điểm giá quan trọng thông qua các mảng, do đó cung cấp các cơ hội giao dịch chính xác hơn.
Cốt lõi của chiến lược này là đo lường tính thanh khoản của thị trường thông qua tỷ lệ khối lượng giao dịch trên mức thay đổi giá. Các bước thực hiện cụ thể như sau:
Đây là một chiến lược sáng tạo kết hợp phân tích thanh khoản với các chỉ báo kỹ thuật, tối ưu hóa hệ thống giao thoa trung bình động truyền thống bằng cách theo dõi các bất thường về thanh khoản của thị trường. Mặc dù hoạt động tốt trong các môi trường thị trường cụ thể, nhưng vẫn cần được tối ưu hóa thêm để cải thiện tính ổn định và khả năng ứng dụng. Các nhà giao dịch được khuyến nghị nên tiến hành thử nghiệm đầy đủ trước khi sử dụng theo thời gian thực và kết hợp với các chỉ báo khác để xây dựng một hệ thống giao dịch hoàn thiện hơn.
/*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))