Chiến lược này kết hợp bản đồ nhiệt khối lượng và giá thời gian thực để tạo ra tín hiệu mua và bán bằng cách phân tích sự phân bố giá và khối lượng trong một khoảng thời gian nhất định. Chiến lược đầu tiên tính toán một số mức giá dựa trên giá hiện tại và tỷ lệ phần trăm phạm vi giá đã thiết lập. Sau đó nó đếm khối lượng mua và bán tại mỗi mức giá trong một khoảng thời gian trước và tính toán khối lượng mua và bán tích lũy. Màu sắc của các nhãn được xác định dựa trên khối lượng mua và bán tích lũy. Ngoài ra, chiến lược vẽ đường cong giá thời gian thực. Hơn nữa, chiến lược kết hợp các chỉ số như EMA và VWAP để tạo ra tín hiệu mua và bán dựa trên mối quan hệ của chúng với giá và khối lượng. Một tín hiệu mua được tạo ra khi các điều kiện mua được đáp ứng, và không có tín hiệu trước đó xảy ra. Một tín hiệu bán được tạo ra khi các điều kiện bán được đáp ứng, hoặc có hai nến đỏ liên tiếp, và không có tín hiệu trước đó xảy ra.
Chiến lược này tạo ra tín hiệu mua và bán bằng cách kết hợp bản đồ nhiệt khối lượng, giá thời gian thực và nhiều chỉ số kỹ thuật, cung cấp một giá trị tham chiếu nhất định. Ưu điểm của chiến lược nằm trong khả năng hiển thị trực quan sự phân bố giá và khối lượng và xem xét toàn diện nhiều yếu tố để tạo ra tín hiệu. Tuy nhiên, chiến lược cũng có một số hạn chế và rủi ro, chẳng hạn như tác động của cài đặt tham số, bản chất chậm trễ của các chỉ số và sự phụ thuộc vào thị trường xu hướng. Do đó, trong các ứng dụng thực tế, cần tối ưu hóa và cải thiện thêm chiến lược, chẳng hạn như giới thiệu nhiều chỉ số hơn, tối ưu hóa điều kiện tín hiệu, tăng cường kiểm soát rủi ro, v.v., để cải thiện độ bền và lợi nhuận của chiến lược.
/*backtest start: 2024-04-01 00:00:00 end: 2024-04-30 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Buy and Sell Volume Heatmap with Real-Time Price Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=10) // Settings for Volume Heatmap lookbackPeriod = input.int(100, title="Lookback Period") baseGreenColor = input.color(color.green, title="Buy Volume Color") baseRedColor = input.color(color.red, title="Sell Volume Color") priceLevels = input.int(10, title="Number of Price Levels") priceRangePct = input.float(0.01, title="Price Range Percentage") labelSize = input.string("small", title="Label Size", options=["tiny", "small", "normal", "large"]) showLabels = input.bool(true, title="Show Volume Labels") // Initialize arrays to store price levels, buy volumes, and sell volumes var float[] priceLevelsArr = array.new_float(priceLevels) var float[] buyVolumes = array.new_float(priceLevels) var float[] sellVolumes = array.new_float(priceLevels) // Calculate price levels around the current price for i = 0 to priceLevels - 1 priceLevel = close * (1 + (i - priceLevels / 2) * priceRangePct) // Adjust multiplier for desired spacing array.set(priceLevelsArr, i, priceLevel) // Calculate buy and sell volumes for each price level for i = 0 to priceLevels - 1 level = array.get(priceLevelsArr, i) buyVol = 0.0 sellVol = 0.0 for j = 1 to lookbackPeriod if close[j] > open[j] if close[j] >= level and low[j] <= level buyVol := buyVol + volume[j] else if close[j] <= level and high[j] >= level sellVol := sellVol + volume[j] array.set(buyVolumes, i, buyVol) array.set(sellVolumes, i, sellVol) // Determine the maximum volumes for normalization maxBuyVolume = array.max(buyVolumes) maxSellVolume = array.max(sellVolumes) // Initialize cumulative buy and sell volumes for the current bar cumulativeBuyVol = 0.0 cumulativeSellVol = 0.0 // Calculate colors based on the volumes and accumulate volumes for the current bar for i = 0 to priceLevels - 1 buyVol = array.get(buyVolumes, i) sellVol = array.get(sellVolumes, i) cumulativeBuyVol := cumulativeBuyVol + buyVol cumulativeSellVol := cumulativeSellVol + sellVol // Determine the label color based on which volume is higher labelColor = cumulativeBuyVol > cumulativeSellVol ? baseGreenColor : baseRedColor // Initialize variables for plotshape var float shapePosition = na var color shapeColor = na if cumulativeBuyVol > 0 or cumulativeSellVol > 0 if showLabels labelText = "Buy: " + str.tostring(cumulativeBuyVol) + "\nSell: " + str.tostring(cumulativeSellVol) label.new(x=bar_index, y=high + (high - low) * 0.02, text=labelText, color=color.new(labelColor, 0), textcolor=color.white, style=label.style_label_down, size=labelSize) else shapePosition := high + (high - low) * 0.02 shapeColor := labelColor // Plot the shape outside the local scope plotshape(series=showLabels ? na : shapePosition, location=location.absolute, style=shape.circle, size=size.tiny, color=shapeColor) // Plot the real-time price on the chart plot(close, title="Real-Time Price", color=color.blue, linewidth=2, style=plot.style_line) // Mpullback Indicator Settings a = ta.ema(close, 9) b = ta.ema(close, 20) e = ta.vwap(close) volume_ma = ta.sma(volume, 20) // Calculate conditions for buy and sell signals buy_condition = close > a and close > e and volume > volume_ma and close > open and low > a and low > e // Ensure close, low are higher than open, EMA, and VWAP sell_condition = close < a and close < b and close < e and volume > volume_ma // Store the previous buy and sell conditions var bool prev_buy_condition = na var bool prev_sell_condition = na // Track if a buy or sell signal has occurred var bool signal_occurred = false // Generate buy and sell signals based on conditions buy_signal = buy_condition and not prev_buy_condition and not signal_occurred sell_signal = sell_condition and not prev_sell_condition and not signal_occurred // Determine bearish condition (close lower than the bottom 30% of the candle's range) bearish = close < low + (high - low) * 0.3 // Add sell signal when there are two consecutive red candles and no signal has occurred two_consecutive_red_candles = close[1] < open[1] and close < open sell_signal := sell_signal or (two_consecutive_red_candles and not signal_occurred) // Remember the current conditions for the next bar prev_buy_condition := buy_condition prev_sell_condition := sell_condition // Update signal occurred status signal_occurred := buy_signal or sell_signal // Plot buy and sell signals plotshape(buy_signal, title="Buy", style=shape.labelup, location=location.belowbar, color=color.green, text="Buy", textcolor=color.white) plotshape(sell_signal, title="Sell", style=shape.labeldown, location=location.abovebar, color=color.red, text="Sell", textcolor=color.white) // Strategy entry and exit if buy_signal strategy.entry("Buy", strategy.long) if sell_signal strategy.entry("Sell", strategy.short)