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 cân nhắc thanh khoản, đo thanh khoản thị trường thông qua mối quan hệ giữa chuyển động giá và khối lượng giao dịch. Nó xây dựng các đường trung bình động nhanh và chậm để tạo ra tín hiệu mua khi đường nhanh vượt qua đường chậm và bán tín hiệu khi nó vượt qua đường chậm. Chiến lược đặc biệt tập trung vào các sự kiện thanh khoản bất thường, ghi lại mức giá chính trong một mảng cho các cơ hội giao dịch chính xác hơn.
Cơ chế cốt lõi dựa trên việc đo lường thanh khoản thị trường thông qua tỷ lệ khối lượng so với biến động giá. 1. Tính toán chỉ số thanh khoản: khối lượng chia cho sự khác biệt tuyệt đối giữa giá đóng và giá mở 2. Đặt ranh giới thanh khoản: Xác định thanh khoản bất thường bằng EMA và độ lệch chuẩn 3. Duy trì mảng giá: Ghi lại giá khi vi phạm ranh giới thanh khoản 4. Xây dựng trung bình động: Tính toán EMA nhanh và chậm dựa trên các sự kiện thanh khoản 5. Tạo tín hiệu giao dịch: Xác định các điểm nhập và ra bằng cách chéo trung bình động
Chiến lược sáng tạo này kết hợp phân tích thanh khoản với các chỉ số kỹ thuật, tối ưu hóa các hệ thống chéo trung bình động truyền thống bằng cách theo dõi sự bất thường về thanh khoản trên thị trường. Mặc dù nó cho thấy kết quả hứa hẹn trong điều kiện thị trường cụ thể, cần tối ưu hóa thêm để cải thiện tính ổn định và khả năng áp dụng. Các nhà giao dịch nên kiểm tra kỹ lưỡng trước khi thực hiện trực tiếp và xem xét kết hợp với các chỉ số khác cho một hệ thống giao dịch mạnh mẽ 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))