这个策略是一个基于公平价值缺口(FVG)的创新性交易系统,通过识别市场中的价格差距和成交量异常来捕捉潜在的交易机会。该策略结合了动态计数机制和归一化处理,不仅能够准确识别买卖信号,还能通过可视化展示帮助交易者更好地理解市场结构。
策略的核心是通过监测连续K线之间的价格缺口来识别潜在的交易机会。具体来说: 1. 多头FVG(BFVG)形成条件是当前K线的最低价高于两根K线前的最高价 2. 空头FVG(SFVG)形成条件是当前K线的最高价低于两根K线前的最低价 3. 策略引入了基于成交量和缺口大小的验证机制,只有满足验证条件的FVG才会触发交易信号 4. 使用50个周期的动态计数窗口来累计多空FVG的数量 5. 通过归一化处理,将缺口宽度转化为更直观的指标值
这是一个基于价格结构的创新性交易策略,通过对公平价值缺口的智能识别和验证来捕捉市场机会。策略的设计理念清晰,实现方式专业,具有良好的可扩展性。通过建议的优化方向,策略的稳定性和盈利能力有望得到进一步提升。
/*backtest
start: 2024-03-13 09:40:00
end: 2025-02-23 15:00:00
period: 1h
basePeriod: 1m
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
*/
//@version=5
strategy("FVG Oscillator Strategy",
shorttitle="FVG Osc v5 [Strategy]",
overlay=false)
//------------------------------------------------------------------------------
// 1) Input Parameters
//------------------------------------------------------------------------------
lnt = input.int(50, "Bars Back")
area = input.bool(true, "Show Areas")
upcol = input.color(#2962ff, "Positive Color")
dncol = input.color(#e91e63, "Negative Color")
//------------------------------------------------------------------------------
// 2) FVG Detection
// bfvg = bullish FVG, sfvg = bearish FVG
//------------------------------------------------------------------------------
bfvg = low > high[2]
sfvg = high < low[2]
//------------------------------------------------------------------------------
// 3) Additional Conditions - FVG Verification (Volume, Gap Size)
//------------------------------------------------------------------------------
vol = volume > ta.sma(volume, 10)
batr = (low - high[2]) > ta.sma(low - high[2], lnt) * 1.5
satr = (high - low[2]) > ta.sma(high - low[2], lnt) * 1.5
//------------------------------------------------------------------------------
// 4) Sum of Bullish / Bearish FVG within the Last lnt Bars
//------------------------------------------------------------------------------
countup = math.sum(bfvg ? 1 : 0, lnt) // +1 for each BFVG
countdown = math.sum(sfvg ? -1 : 0, lnt) // -1 for each SFVG
//------------------------------------------------------------------------------
// 5) Verification (e.g., Require Higher Volume or Large Gap)
//------------------------------------------------------------------------------
verifyb = (bfvg and vol[1]) or (bfvg and batr)
verifys = (sfvg and vol[1]) or (sfvg and satr)
//------------------------------------------------------------------------------
// 6) Normalized Gap Values
//------------------------------------------------------------------------------
normb = ((low - high[2]) * countup * 0.75) / ta.highest(low - high[2], lnt)
norms = ((high - low[2]) * countdown * 0.75) / ta.lowest(high - low[2], lnt)
//------------------------------------------------------------------------------
// 7) Total Net FVG Count + Calculation of Maximum for fill()
//------------------------------------------------------------------------------
totcount = countup + countdown
max = math.max(
ta.highest(countup, 200),
ta.highest(math.abs(countdown), 200)
)
//------------------------------------------------------------------------------
// 8) Plotting Values (as in an indicator – can be kept for visualization)
//------------------------------------------------------------------------------
up = plot(countup, "Buy FVG", color=upcol, display=display.none)
down = plot(countdown, "Sell FVG", color=dncol, display=display.none)
zero = plot(0, "", color.new(color.gray, 100), display=display.none, editable=false)
// Net Value (sum of FVG)
plot(totcount, "Net Value", color=color.new(color.gray, 50))
// Filling areas above/below zero
plot(verifyb ? normb : na, "Long Pattern Width", color=upcol, linewidth=1, style=plot.style_histogram)
plot(verifys ? norms : na, "Short Pattern Width", color=dncol, linewidth=1, style=plot.style_histogram)
//------------------------------------------------------------------------------
// 9) Simple Trading Logic (STRATEGY)
//------------------------------------------------------------------------------
// - If "verifyb" is detected, go long.
// - If "verifys" is detected, go short.
//
// You can extend this with Stop Loss, Take Profit,
// closing old positions, etc.
//------------------------------------------------------------------------------
bool goLong = verifyb
bool goShort = verifys
// Basic example: Open Long if verifyb, Open Short if verifys.
if goLong
// First close any short position if it exists
if strategy.position_size < 0
strategy.close("Short FVG")
// Then open Long
strategy.entry("Long FVG", strategy.long)
if goShort
// First close any long position if it exists
if strategy.position_size > 0
strategy.close("Long FVG")
// Then open Short
strategy.entry("Short FVG", strategy.short)