
Die Strategie ist ein innovatives quantitatives Handelssystem, das auf der Theorie der statistischen Verteilung basiert und die herkömmlichen Multifunktionalen-Kräfteindikatoren (Bull Bear Power) mit der Adaptive Verteilungsanpassungstechnik kombiniert. Die Kerninnovation der Strategie besteht darin, die traditionelle technische Analyse von der festen Annahme einer normalen Verteilung zu entfernen, indem die hochrangigen statistischen Merkmale der Marktdaten in Echtzeit berechnet werden (Verzerrungen und Spitzen), die Handelsmarke dynamisch angepasst wird, so dass die Signalgenerierung mit den tatsächlichen Verteilungsmerkmalen des Marktes übereinstimmt.
Die Kernmechanismen der Strategie umfassen folgende Schlüsselbereiche:
Berechnung des BIP-WertsDurch Berechnung der Summe der Differenz zwischen dem höchsten Preis und der EMA (Mehrkopfkraft) und dem niedrigsten Preis und der Differenz zwischen der EMA (Leerkopfkraft) wird ein Basisindikator erstellt, der den Kontrast zwischen den Marktkräften widerspiegelt. Positive Werte bedeuten mehrkopfige Dominanz, negative Werte bedeuten Leerkopfdominanz.
VerteilungsmerkmalanalyseDie BPP-Sequenz wird statistisch analysiert mit Hilfe der Methode der Hochgrad-Matrix-Berechnung. Die Ausgabe enthält Mittelwerte, Standardabweichungen, Abweichungen (Drital-Zentrum-Matrix) und Überspitzen (Quadratal-Zentrum-Matrix-Abnahme). Die vier wichtigsten Statistiken, die die Verteilungsform der Marktdaten vollständig abbilden. Die Abweichungen spiegeln die Asymmetrie der Verteilung wider, die Spitzen spiegeln die Dicke der Wurzeln und die Häufigkeit der Extreme wider.
Anpassung an die Thresholdgenerierung:
Bewertung der Marktlage:
Dynamische Bremssysteme:
Signalgenerierung und -durchführung:
Die theoretische Basis der Statistik ist solide: Abkehr von der festen Annahme einer normalen Verteilung der herkömmlichen Strategie, Anpassung der Entscheidungsstandards an die dynamischen Merkmale der realen Verteilung des Marktes, Rekonstruktion der Signalgenerationslogik auf statistischer Ebene mit strenger theoretischer Unterstützung.
Anpassungsfähigkeit hervorragendDurch die Echtzeit-Überwachung von Abweichungen und Spitzen ist die Strategie in der Lage, Änderungen der Marktverteilung zu erkennen. Die Erhöhung der Aufwärtsmarge in positiven Abweichungsmärkten vermeidet die Aufwärtsverfolgung, die Erweiterung der Abwärtsmarge in den Fettköpfen verhindert eine übermäßige Reaktion auf normale Schwankungen und ermöglicht eine echte “Marktanpassung der Strategie”.
Mehrdimensionale GesamtbewertungDie drei Dimensionen der Preisdynamik, der Transaktionsaktivität und der relativen Position der Preise zusammen, um ein umfassendes System zur Beurteilung der Marktlage zu schaffen, um die Einseitigkeit eines einseitigen Urteils zu vermeiden.
Dynamische RisikomanagementDas 3-Level-Stoppsystem ist mit einem dynamischen Anpassungsmechanismus ausgestattet, der die Stoppdistanz entsprechend der Markthitze optimieren kann. Die Gewinnspanne wird in trendigen Situationen ausreichend erfasst und die Gewinne werden in schwachen Situationen schnell eingelöst.
Gute SignalqualitätDurch die Prüfung der statistischen Signifikanz wird der Handel nur an den außergewöhnlichen Punkten der tatsächlichen Verteilung ausgelöst, was die Falschsignalrate reduziert und die statistische Effektivität des Handels erhöht.
Visualisierung der IntuitionDurch dynamische Schwellenwerte, Standard-Deviation-Referenzlinien und Signalmarkierungen wird der Anpassungs- und Anpassungsprozess der Strategie klar dargestellt und leicht verstanden und überwacht.
Hohe Komplexität der ParameteroptimierungDie Strategie umfasst mehrere Parameter ((Signifikationsniveau, Abweichungsthemen, Peak-Themen, Stop-Loss-Multiplikatoren usw.), die optimale Parameterkombination unterscheidet sich stark zwischen verschiedenen Marktumgebungen und erfordert systematische Parameteroptimierung und Rückprüfungen.
Fehlen eindeutiger SchadensersatzmechanismenDie Strategie beruht auf einem Rückgang des Durchschnittswertes und fehlt an einem Preis- oder ATR-basierten Hard-Stop. In einem extremen einseitigen Fall kann es zu erheblichen Verlusten und Kapitalbesetzungen kommen, wenn der BBP weiterhin vom Durchschnittswert abweicht und nicht zurückkehrt.
Schwache Anpassungsfähigkeit der HorizontalmärkteIn einer langfristigen, schmalen Schwingungsphase ist der BBP-Wert in der Nähe des Durchschnitts und kann nicht an die Anpassungsschwelle gelangen, was zu einer Rarität der Handelsmöglichkeiten und einer eingeschränkten Strategie führt.
Daten sind abhängigDie Analyse der Verteilungsmerkmale erfordert ausreichende historische Daten, um stabile und zuverlässige statistische Ergebnisse zu erhalten. Neue börsennotierte Währungen oder Indizes mit unzureichenden Daten können in der Anfangsphase der Verwendung unbeständig sein und die Strategie beeinträchtigen.
Höhere RechenkomplexitätDie Berechnung von Hochgradentemperaturen in Echtzeit, der Prozentsatz-Rangliste und der dynamischen Tiefstwerte erfordert die Durchlaufenung historischer Daten und kann in einem ressourcenbeschränkten Handelsumfeld zu Leistungsschwierigkeiten führen.
Die Gefahr von ExtremreisenIn extremen schnellen Einseiten, wie z. B. bei Blitzschlägen oder Stürmen, kann die BBP die Schwelle augenblicklich überschreiten und schnell zurückkehren, was zu einer unerwünschten Einstiegsposition oder einem verpassten optimalen Zeitpunkt führt.
Einführung eines dynamischen Stop-Loss-Mechanismus:
Erhöhung der Marktumfelderkennung:
Optimierung der Anpassung der Parameter:
Signalqualität verbessert:
Optimierung des Positionsmanagements:
Integration mehrerer Zeiträume:
Die BBP Adaptive Distribution Strategy stellt einen innovativen Versuch dar, die technische Analyse mit der modernen Statistik zu kombinieren. Durch die Adaptive Distribution Fitting Technik wird die Abhängigkeit der herkömmlichen Strategie von der normalen Verteilungsannahme grundlegend gelöst. Der Kernwert der Strategie liegt in ihrer theoretischen Innovationskraft und der Achtung vor den tatsächlichen Verteilungsmerkmalen des Marktes, die eine angemessene Signalqualität in Märkten mit unterschiedlichen Verteilungsformen gewährleisten.
Allerdings gibt es auch deutlich Raum für Verbesserungen in der Strategie. Das Fehlen eines eindeutigen Stop-Loss-Mechanismus ist die größte Schwachstelle, die in der praktischen Anwendung vorrangig ergänzt werden muss. Die Komplexität der Parameteroptimierung und die Anpassungsfähigkeit der Querplattenmärkte müssen auch durch die Einführung von Markteinklimaerkennungs- und Parameteranpassungsmechanismen gelöst werden.
Diese Strategie bietet einen hervorragenden Rahmen für das Lernen und Verbessern von Quantitative Traders, die eine theoretische Tiefe anstreben und sich in die Tiefe der Forschung stürzen möchten.
Insgesamt handelt es sich um eine innovative Strategie mit einer soliden theoretischen Grundlage, einer strengen Designlogik und einem hohen Forschungs- und Anwendungswert, die es wert ist, von Quantitative Traders eingehend erforscht und kontinuierlich optimiert zu werden.
//@version=5
strategy("BBP Adaptive Distribution Strategy [presentTrading]")
//========================================
// BBP策略参数设置
//========================================
lengthInput = input.int(20, "EMA Length");//EMA周期长度
zLength = input.int(150, "Distribution Analysis Period");//分布分析周期
//自适应分布参数组
dist_group = "Distribution Fitting";
//统计显著性水平,0.05表示95%置信度
significance_level = input.float(0.05, "Significance Level", minval=0.01, maxval=0.1, step=0.01,
group=dist_group, tooltip="统计显著性水平,0.05=95%置信度");
//是否启用自适应分布拟合,禁用则使用传统Z-score
auto_fit = input.bool(true, "Auto Fit Distribution", group=dist_group,
tooltip="启用自适应分布拟合,禁用则使用传统Z-score");
//偏度阈值,超过此值考虑使用偏态分布
skew_threshold = input.float(0.5, "Skewness Threshold", minval=0.1, maxval=2.0, group=dist_group,
tooltip="超过此值考虑偏态分布");
//峰度阈值,超过此值考虑使用厚尾分布
kurt_threshold = input.float(1.0, "Kurtosis Threshold", minval=0.3, maxval=3.0, group=dist_group,
tooltip="超过此值考虑厚尾分布");
//========================================
// 止盈参数设置
//========================================
tp_group = "Take Profit Settings";//止盈参数组
useTP = input.bool(true, "Use Take Profit", group=tp_group);//是否启用止盈
baseAtrLength = input.int(20, "ATR Period", minval=1, group=tp_group);//ATR计算周期
atrMult1 = input.float(1.618, "TP1 ATR Multiplier", minval=0.1, step=0.1, group=tp_group);//第一止盈位ATR倍数
atrMult2 = input.float(2.382, "TP2 ATR Multiplier", minval=0.1, step=0.1, group=tp_group);//第二止盈位ATR倍数
atrMult3 = input.float(3.618, "TP3 ATR Multiplier", minval=0.1, step=0.1, group=tp_group);//第三止盈位ATR倍数
tp1_size = input.float(13, "TP1 Position %", minval=1, maxval=100, group=tp_group);//第一止盈位仓位百分比
tp2_size = input.float(13, "TP2 Position %", minval=1, maxval=100, group=tp_group);//第二止盈位仓位百分比
tp3_size = input.float(13, "TP3 Position %", minval=1, maxval=100, group=tp_group);//第三止盈位仓位百分比
//========================================
// 成交量分析参数设置
//========================================
vol_group = "Volume Analysis Settings";//成交量分析参数组
vol_period = input.int(100, "Volume MA Period", minval=1, group=vol_group);//成交量均线周期
vol_high = input.float(2.0, "High Volume Multiplier", minval=1.0, step=0.1, group=vol_group);//高成交量倍数
vol_med = input.float(1.5, "Medium Volume Multiplier", minval=1.0, step=0.1, group=vol_group);//中成交量倍数
vol_low = input.float(1.0, "Low Volume Multiplier", minval=0.5, step=0.1, group=vol_group);//低成交量倍数
vol_high_mult = input.float(1.5, "High Volume Factor", minval=0.1, step=0.1, group=vol_group);//高成交量系数
vol_med_mult = input.float(1.3, "Medium Volume Factor", minval=0.1, step=0.1, group=vol_group);//中成交量系数
vol_low_mult = input.float(1.0, "Low Volume Factor", minval=0.1, step=0.1, group=vol_group);//低成交量系数
//========================================
// 百分位分析参数设置
//========================================
perc_group = "Percentile Analysis Settings";//百分位分析参数组
perc_period = input.int(100, "Percentile Period", minval=20, group=perc_group);//百分位计算周期
perc_high = input.float(90, "High Percentile", minval=50, maxval=100, group=perc_group);//高百分位阈值
perc_med = input.float(80, "Medium Percentile", minval=50, maxval=100, group=perc_group);//中百分位阈值
perc_low = input.float(70, "Low Percentile", minval=0, maxval=100, group=perc_group);//低百分位阈值
perc_high_mult = input.float(1.5, "High Percentile Factor", minval=0.1, step=0.1, group=perc_group);//高百分位系数
perc_med_mult = input.float(1.3, "Medium Percentile Factor", minval=0.1, step=0.1, group=perc_group);//中百分位系数
perc_low_mult = input.float(1.0, "Low Percentile Factor", minval=0.1, step=0.1, group=perc_group);//低百分位系数
//========================================
// 核心多空力量计算
//========================================
//计算价格的指数移动平均
emaClose = ta.ema(close, lengthInput);
//多头力量:最高价与EMA的差值
bullPower = high - emaClose;
//空头力量:最低价与EMA的差值
bearPower = low - emaClose;
//多空力量平衡:多头力量加上空头力量
bbp = bullPower + bearPower;
//计算分布的高阶矩:均值、标准差、偏度、峰度
calcDistributionMoments(src, length) =>
mean = ta.sma(src, length);//计算均值
variance = ta.variance(src, length);//计算方差
stddev = math.sqrt(variance);//计算标准差
//初始化偏度和峰度累加变量
skew_sum = 0.0;
kurt_sum = 0.0;
//当标准差大于0时,计算偏度和峰度
if stddev > 0
for i = 0 to math.min(length - 1, 100)
z = (src[i] - mean) / stddev;//计算标准化值
z2 = z * z;//计算Z的平方
skew_sum += z * z2;//累加偏度项
kurt_sum += z2 * z2;//累加峰度项
n = math.min(length, 100);//取样本数
skewness = skew_sum / n;//计算偏度
excess_kurtosis = kurt_sum / n - 3.0;//计算超额峰度
[mean, stddev, skewness, excess_kurtosis];//返回四个统计量
//自适应阈值计算:根据分布特征动态调整阈值
calcAdaptiveThreshold(mu, sigma, skew, kurt, alpha, use_adaptive) =>
//计算标准正态分位数(基础Z值)
z_base = math.sqrt(-2.0 * math.log(alpha / 2.0));
z_adjusted = z_base;//初始化调整后的Z值
//如果启用自适应拟合,则进行分布修正
if use_adaptive
//厚尾修正:使用t分布近似,当峰度超过阈值时调整
if math.abs(kurt) > kurt_threshold
df = math.max(6.0 / math.abs(kurt) + 4.0, 5.0);//计算自由度
z_adjusted := z_adjusted * math.sqrt(df / (df - 2.0));//调整Z值
//偏度修正:使用Cornish-Fisher展开式,当偏度超过阈值时调整
if math.abs(skew) > skew_threshold
z_adjusted := z_adjusted + skew * (z_adjusted * z_adjusted - 1.0) / 6.0;//应用偏度修正
//计算上下阈值
upper_threshold = mu + sigma * z_adjusted;
lower_threshold = mu - sigma * z_adjusted;
[upper_threshold, lower_threshold];//返回上下阈值
//执行分布分析:计算BBP的均值、标准差、偏度和峰度
[mu, sigma, skewness, kurtosis] = calcDistributionMoments(bbp, zLength);
//计算自适应阈值:基于统计特征动态确定交易阈值
[upper_threshold, lower_threshold] = calcAdaptiveThreshold(mu, sigma, skewness, kurtosis,
significance_level, auto_fit);
//========================================
// 成交量与百分位分析
//========================================
vol_sma = ta.sma(volume, vol_period);//计算成交量简单移动平均
vol_mult = volume / vol_sma;//计算当前成交量相对于均值的倍数
//计算百分位排名:返回当前值在历史数据中的百分位位置
calcPercentile(src) =>
var values = array.new_float(0);//初始化数组
array.unshift(values, src);//将新值插入数组头部
if array.size(values) > perc_period
array.pop(values);//超过周期长度时删除尾部元素
//计算百分位排名
array.size(values) > 0 ? array.percentrank(values, array.size(values)-1) * 100 : 50;
price_perc = calcPercentile(close);//计算价格百分位
vol_perc = calcPercentile(volume);//计算成交量百分位
//计算止盈系数:综合成交量和价格百分位评分
getTpFactor() =>
//根据成交量倍数评分
vol_score = vol_mult > vol_high ? vol_high_mult : vol_mult > vol_med ? vol_med_mult : vol_mult > vol_low ? vol_low_mult : 0.8;
//根据价格百分位评分
price_score = price_perc > perc_high ? perc_high_mult : price_perc > perc_med ? perc_med_mult : price_perc > perc_low ? perc_low_mult : 0.8;
math.avg(vol_score, price_score);//返回两个评分的平均值
//========================================
// 入场出场逻辑
//========================================
//多头入场条件:BBP向上突破上阈值
longCondition = ta.crossover(bbp, upper_threshold);
//空头入场条件:BBP向下跌破下阈值
shortCondition = ta.crossunder(bbp, lower_threshold);
//多头出场条件:BBP向下跌破均值
exitLongCondition = ta.crossunder(bbp, mu);
//空头出场条件:BBP向上突破均值
exitShortCondition = ta.crossover(bbp, mu);
//========================================
// 交易执行逻辑
//========================================
//在K线确认后执行交易
if (barstate.isconfirmed)
if longCondition
strategy.entry("Long", strategy.long);//开多头仓位
if shortCondition
strategy.entry("Short", strategy.short);//开空头仓位
if exitLongCondition
strategy.close("Long");//平多头仓位
if exitShortCondition
strategy.close("Short");//平空头仓位
//========================================
// 止盈执行逻辑
//========================================
//当启用止盈且持有仓位时执行止盈逻辑
if useTP and strategy.position_size != 0
base_move = ta.atr(baseAtrLength);//计算基础ATR值
tp_factor = getTpFactor();//获取止盈系数
is_long = strategy.position_size > 0;//判断是否为多头仓位
entry_price = strategy.position_avg_price;//获取入场均价
//多头止盈设置
if is_long
tp1_price = entry_price + (base_move * atrMult1 * tp_factor);//计算第一止盈价
tp2_price = entry_price + (base_move * atrMult2 * tp_factor);//计算第二止盈价
tp3_price = entry_price + (base_move * atrMult3 * tp_factor);//计算第三止盈价
strategy.exit("TP1", "Long", qty_percent=tp1_size, limit=tp1_price);//设置第一止盈
strategy.exit("TP2", "Long", qty_percent=tp2_size, limit=tp2_price);//设置第二止盈
strategy.exit("TP3", "Long", qty_percent=tp3_size, limit=tp3_price);//设置第三止盈
else
//空头止盈设置
tp1_price = entry_price - (base_move * atrMult1 * tp_factor);//计算第一止盈价
tp2_price = entry_price - (base_move * atrMult2 * tp_factor);//计算第二止盈价
tp3_price = entry_price - (base_move * atrMult3 * tp_factor);//计算第三止盈价
strategy.exit("TP1", "Short", qty_percent=tp1_size, limit=tp1_price);//设置第一止盈
strategy.exit("TP2", "Short", qty_percent=tp2_size, limit=tp2_price);//设置第二止盈
strategy.exit("TP3", "Short", qty_percent=tp3_size, limit=tp3_price);//设置第三止盈
//========================================
// 图表绘制
//========================================
//绘制BBP柱状图:多头力量为绿色,空头力量为红色
plot(bbp, color=bbp >= mu ? color.new(color.green, 0) : color.new(color.red, 0),
title="BBPower", style=plot.style_columns);
//绘制均值线
plot(mu, "Mean", color=color.gray, linewidth=1, style=plot.style_line);
//绘制上阈值线
plot(upper_threshold, "Upper Threshold", color=color.orange, linewidth=2);
//绘制下阈值线
plot(lower_threshold, "Lower Threshold", color=color.orange, linewidth=2);
//绘制参考线:正负1倍标准差
plot(mu + sigma, "+1σ", color=color.new(color.blue, 70), linewidth=1, style=plot.style_circles);
plot(mu - sigma, "-1σ", color=color.new(color.blue, 70), linewidth=1, style=plot.style_circles);
//绘制参考线:正负2倍标准差
plot(mu + 2*sigma, "+2σ", color=color.new(color.purple, 70), linewidth=1, style=plot.style_cross);
plot(mu - 2*sigma, "-2σ", color=color.new(color.purple, 70), linewidth=1, style=plot.style_cross);
//========================================
// 信号标记
//========================================
//绘制多头信号标记
plotshape(longCondition, title="Long Signal", location=location.bottom,
color=color.new(color.green, 0), style=shape.labelup, text="LONG",
textcolor=color.white, size=size.small);
//绘制空头信号标记
plotshape(shortCondition, title="Short Signal", location=location.top,
color=color.new(color.red, 0), style=shape.labeldown, text="SHORT",
textcolor=color.white, size=size.small);