这是一个基于公平价值缺口(Fair Value Gaps, FVG)的量化交易策略,灵感来源于智能资金概念(Smart Money Concepts, SMC)和机构交易中的价格不平衡理论。该策略通过识别市场中的微观不平衡点,在价格重新进入这些区域时触发交易信号。策略采用固定的0.10%止损和止盈设置,专为短线交易者和算法交易者设计,旨在以严格的风险控制捕捉市场的细微波动。
该策略的核心是识别和利用公平价值缺口(FVG)。FVG是指价格在短时间内跳过的区域,这些区域代表了市场未被充分交易的价格水平,通常被认为是价格将来可能回测的区域。
策略主要基于两种类型的FVG: 1. 看涨FVG:当当前K线的低点高于两根K线前的高点,且中间K线的收盘价高于两根K线前的高点时形成。 2. 看跌FVG:当当前K线的高点低于两根K线前的低点,且中间K线的收盘价低于两根K线前的低点时形成。
交易逻辑如下: - 当价格重新进入看涨FVG区域时,触发做多信号。 - 当价格重新进入看跌FVG区域时,触发做空信号。 - 对每笔交易设置固定的0.10%止损和止盈水平。
策略还包含了一个阈值过滤器,用于筛选足够大的缺口,避免微小的市场噪音。用户可以手动设置阈值百分比,或选择自动模式,让策略根据历史波动性动态调整阈值。
微观市场结构识别:策略能够捕捉到常规技术分析可能忽略的微观市场结构和不平衡,这些结构往往代表了机构资金的活动痕迹。
精确的入场点:通过明确定义的FVG条件,策略提供了客观、精确的入场信号,减少了主观判断带来的错误。
严格的风险控制:固定的0.10%止损设置确保了每笔交易的风险严格可控,适合资金管理严谨的交易者。
可扩展性强:策略框架设计灵活,可以通过添加额外的过滤器或调整参数来适应不同市场条件。
无重绘问题:代码实现避免了重绘问题,确保历史回测结果与实盘表现一致。
多时间框架适应性:用户可以自定义时间框架参数,使策略能够适应从1分钟到更高时间周期的不同交易环境。
短线交易频率高:由于策略针对微观不平衡,可能会产生大量交易信号,增加交易成本,在高频交易环境中尤为显著。
噪音干扰:在低波动性或横盘市场中,FVG信号可能包含更多噪音,导致假信号增多。
固定止损风险:固定的0.10%止损虽然提供了严格的风险控制,但在高波动性市场中可能过于紧密,导致被频繁触发。
趋势逆转风险:在强趋势市场中,反向FVG信号可能导致与主趋势相反的交易,增加亏损概率。
参数敏感性:阈值参数的设置对策略性能有显著影响,不当的参数可能导致过度优化或错过有效信号。
降低风险的方法包括: - 结合更高时间框架的趋势方向过滤器 - 在低波动性市场中提高阈值要求 - 根据市场波动性动态调整止损和止盈水平 - 实施交易量过滤器,避免在低流动性环境中交易
自适应阈值系统:当前策略已包含自动阈值选项,但可以进一步优化为基于市场波动性指标(如ATR)的自适应系统,使FVG识别更精确地适应当前市场状态。
多时间框架确认:引入多时间框架分析,只在较高时间框架趋势方向与FVG信号一致时执行交易,提高胜率。
动态止损/止盈:将固定的0.10%止损/止盈替换为基于市场波动性的动态设置,在波动性增加时自动扩大止损范围,在波动性降低时收窄范围。
交易量确认:在FVG形成和价格重新进入过程中加入交易量分析,只在有足够交易量支持的情况下执行交易,减少假信号。
市场状态分类:实现市场状态(趋势、区间、高/低波动性)的自动识别系统,根据不同市场状态调整策略参数或暂停交易。
机器学习增强:通过机器学习算法分析历史FVG模式的成功率,建立预测模型来评估当前FVG信号的潜在成功概率。
这些优化方向不仅能提高策略的稳健性,还能增强其适应不同市场环境的能力,潜在地提高整体收益率和降低回撤。
公平价值缺口策略是一个技术精湛的量化交易系统,专注于捕捉市场微观结构中的价格不平衡。通过对FVG的准确识别和精确执行,该策略为短线交易者和算法交易者提供了一个具有明确规则和严格风险控制的交易框架。
虽然策略在基础版本中已展现出捕捉微观价格不平衡的能力,但通过实施提议的优化方向,特别是自适应参数系统和多时间框架确认,策略的性能可以得到进一步提升。对于寻求在短时间框架中执行纪律严明的量化交易策略的交易者来说,这是一个值得考虑的方法。
最终,该策略的成功取决于交易者对FVG概念的深入理解,以及根据不同市场条件调整参数的能力。结合适当的风险管理和持续优化,公平价值缺口策略可以成为量化交易组合中的有效工具。
/*backtest
start: 2024-07-09 00:00:00
end: 2025-07-04 08:00:00
period: 4d
basePeriod: 4d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("FVG Strategy [algo ] - 0.10% TP/SL", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// === INPUTS ===
thresholdPer = input.float(0, "Threshold %", minval = 0, maxval = 100, step = .1, inline = 'threshold')
auto = input(false, "Auto", inline = 'threshold')
tf = input.timeframe("", "Timeframe")
// SL/TP settings (0.10% each)
sl_pct = 0.10
tp_pct = 0.10
// === TYPE ===
type fvg
float max
float min
bool isbull
int t = time
// === DETECTION FUNCTION ===
detect() =>
var new_fvg = fvg.new(na, na, na, na)
threshold = auto ? ta.cum((high - low) / low) / bar_index : thresholdPer / 100
bull_fvg = low > high[2] and close[1] > high[2] and (low - high[2]) / high[2] > threshold
bear_fvg = high < low[2] and close[1] < low[2] and (low[2] - high) / high > threshold
if bull_fvg
new_fvg := fvg.new(low, high[2], true)
else if bear_fvg
new_fvg := fvg.new(low[2], high, false)
[bull_fvg, bear_fvg, new_fvg]
// === FVG Detection ===
[bull_fvg, bear_fvg, new_fvg] = request.security(syminfo.tickerid, tf, detect())
var fvg_records = array.new<fvg>(0)
var t = 0
if (bull_fvg or bear_fvg) and new_fvg.t != t
array.unshift(fvg_records, new_fvg)
t := new_fvg.t
// === ENTRY STRATEGY ===
if array.size(fvg_records) > 0
latest = array.get(fvg_records, 0)
// BUY Logic
if latest.isbull and close <= latest.max and close >= latest.min and strategy.position_size <= 0
sl = close * (1 - sl_pct / 100)
tp = close * (1 + tp_pct / 100)
strategy.entry("Buy FVG", strategy.long)
strategy.exit("TP/SL Long", from_entry="Buy FVG", stop=sl, limit=tp)
// SELL Logic
if not latest.isbull and close >= latest.min and close <= latest.max and strategy.position_size >= 0
sl = close * (1 + sl_pct / 100)
tp = close * (1 - tp_pct / 100)
strategy.entry("Sell FVG", strategy.short)
strategy.exit("TP/SL Short", from_entry="Sell FVG", stop=sl, limit=tp)
// === VISUALIZE FVG ZONES ===
plotshape(bull_fvg, title="Bullish FVG", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(bear_fvg, title="Bearish FVG", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)