이 전략은 특정 기간 동안 가격과 부피의 분포를 분석하여 볼륨 히트맵과 실시간 가격을 결합하여 구매 및 판매 신호를 생성합니다. 전략은 먼저 현재 가격과 설정된 가격 범위 비율을 기반으로 여러 가격 수준을 계산합니다. 그 다음 지난 기간 동안 각 가격 수준에서 구매 및 판매 부피를 계산하고 누적 구매 및 판매 부피를 계산합니다. 레이블의 색상은 누적 구매 및 판매 부피에 따라 결정됩니다. 또한 전략은 실시간 가격 곡선을 그래프합니다. 또한 전략은 EMA 및 VWAP와 같은 지표를 통합하여 가격과 부피와의 관계에 따라 구매 및 판매 신호를 생성합니다. 구매 조건이 충족되면 구매 신호가 생성되며 이전 신호가 발생하지 않았습니다. 판매 신호는 판매 조건이 충족되거나 두 개의 연속 빨간 촛불이 발생하거나 이전 신호가 발생하지 않은 경우 생성됩니다.
이 전략은 볼륨 히트맵, 실시간 가격 및 여러 기술적 지표를 결합하여 특정 참조 값을 제공하여 구매 및 판매 신호를 생성합니다. 전략의 장점은 가격 및 볼륨 분포를 직관적으로 표시하고 신호를 생성하기 위해 여러 요인을 포괄적으로 고려하는 능력에 있습니다. 그러나 전략에는 매개 변수 설정의 영향, 지표의 후진성 및 트렌딩 시장에 의존하는 것과 같은 일부 제한과 위험이 있습니다. 따라서 실용적인 응용에서는 더 많은 지표를 도입하고 신호 조건을 최적화하고 위험 통제를 강화하는 등 전략의 안정성과 수익성을 향상시키기 위해 전략의 추가 최적화 및 개선이 필요합니다.
/*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)