feat: 调整默认参数

This commit is contained in:
zhangyangbin
2026-05-16 21:09:36 +08:00
parent 8a4b9488e4
commit 45de4103cd
2 changed files with 198 additions and 39 deletions
+148 -28
View File
@@ -17,6 +17,7 @@ input int InpMAPeriod = 14; // MA周期
input bool InpUsePercentMode = true; // 使用百分比模式
input int InpWaveThreshold = 1000; // 波段阈值(点数/固定模式)
input double InpWavePercent = 0.25; // 波段阈值(百分比/百分比模式)
input double InpPullbackTolerance = 0.0; // 反向突破容忍度(%) 0=不容忍
input group "=== 风险管理参数 ==="
input int InpStopLoss = 200; // 止损点数
@@ -108,6 +109,10 @@ int OnInit()
Print("波段阈值模式: 百分比 - ", InpWavePercent, "%");
else
Print("波段阈值模式: 固定点数 - ", InpWaveThreshold, "点");
if(InpPullbackTolerance > 0)
Print("反向突破容忍度: ", DoubleToString(InpPullbackTolerance, 1), "% (启用)");
else
Print("反向突破容忍度: 0% (禁用 - 保持原有逻辑)");
Print("止损:", InpStopLoss, "点 | 止盈:", InpTakeProfit, "点");
Print("最大持仓时间:", InpMaxHoldingMinutes, "分钟");
Print("最大开仓手数:", InpMaxPositions);
@@ -193,44 +198,159 @@ void UpdateLatestValidWave()
int filtered_types[];
FilterBreakouts(breakout_bars, breakout_types, rates, filtered_bars, filtered_types);
// 计算极值点
// 计算极值点(支持反向突破容忍度)
ExtremePoint extremes[];
ArrayResize(extremes, 0);
for(int i = 0; i < ArraySize(filtered_bars) - 1; i++) {
int current_bar = filtered_bars[i];
int current_type = filtered_types[i];
int next_bar = filtered_bars[i + 1];
// 如果容忍度为0,使用原有逻辑(相邻突破K线之间的极值)
if(InpPullbackTolerance <= 0.0)
{
for(int i = 0; i < ArraySize(filtered_bars) - 1; i++) {
int current_bar = filtered_bars[i];
int current_type = filtered_types[i];
int next_bar = filtered_bars[i + 1];
double extreme_price = 0;
datetime extreme_time = 0;
double extreme_price = 0;
datetime extreme_time = 0;
if(current_type == 1) {
extreme_price = rates[current_bar].high;
extreme_time = rates[current_bar].time;
for(int j = current_bar; j >= next_bar; j--) {
if(rates[j].high > extreme_price) {
extreme_price = rates[j].high;
extreme_time = rates[j].time;
if(current_type == 1) {
extreme_price = rates[current_bar].high;
extreme_time = rates[current_bar].time;
for(int j = current_bar; j >= next_bar; j--) {
if(rates[j].high > extreme_price) {
extreme_price = rates[j].high;
extreme_time = rates[j].time;
}
}
} else {
extreme_price = rates[current_bar].low;
extreme_time = rates[current_bar].time;
for(int j = current_bar; j >= next_bar; j--) {
if(rates[j].low < extreme_price) {
extreme_price = rates[j].low;
extreme_time = rates[j].time;
}
}
}
} else {
extreme_price = rates[current_bar].low;
extreme_time = rates[current_bar].time;
for(int j = current_bar; j >= next_bar; j--) {
if(rates[j].low < extreme_price) {
extreme_price = rates[j].low;
extreme_time = rates[j].time;
int size = ArraySize(extremes);
ArrayResize(extremes, size + 1);
extremes[size].time = extreme_time;
extremes[size].price = extreme_price;
extremes[size].type = current_type;
extremes[size].is_valid = false;
}
}
else
{
// 容忍模式:跨越反向突破K线计算波段
for(int i = 0; i < ArraySize(filtered_bars); i++) {
int start_bar = filtered_bars[i];
int start_type = filtered_types[i];
double wave_high = rates[start_bar].high;
double wave_low = rates[start_bar].low;
datetime wave_high_time = rates[start_bar].time;
datetime wave_low_time = rates[start_bar].time;
int end_bar = 0;
bool wave_terminated = false;
// 向后扫描,直到遇到不可容忍的反向突破
for(int j = i + 1; j < ArraySize(filtered_bars); j++) {
int current_bar = filtered_bars[j];
int current_type = filtered_types[j];
// 更新波段的高低点
if(rates[current_bar].high > wave_high) {
wave_high = rates[current_bar].high;
wave_high_time = rates[current_bar].time;
}
if(rates[current_bar].low < wave_low) {
wave_low = rates[current_bar].low;
wave_low_time = rates[current_bar].time;
}
// 检查中间所有K线的极值
int prev_bar = (j > 0) ? filtered_bars[j-1] : start_bar;
for(int k = prev_bar; k >= current_bar; k--) {
if(rates[k].high > wave_high) {
wave_high = rates[k].high;
wave_high_time = rates[k].time;
}
if(rates[k].low < wave_low) {
wave_low = rates[k].low;
wave_low_time = rates[k].time;
}
}
// 如果遇到反向突破K线,检查回撤是否可容忍
if(current_type != start_type) {
double wave_range = wave_high - wave_low;
double pullback_percent = 0;
if(start_type == 1) {
// 多头波段遇到空单突破K线
pullback_percent = ((wave_high - rates[current_bar].close) / wave_range) * 100.0;
} else {
// 空头波段遇到多单突破K线
pullback_percent = ((rates[current_bar].close - wave_low) / wave_range) * 100.0;
}
if(pullback_percent > InpPullbackTolerance) {
// 回撤超过容忍度,终止波段
end_bar = current_bar;
wave_terminated = true;
break;
}
// 否则继续,忽略此反向突破
}
}
// 添加极值点
if(start_type == 1) {
// 多头波段:先低点后高点
int size = ArraySize(extremes);
ArrayResize(extremes, size + 1);
extremes[size].time = wave_low_time;
extremes[size].price = wave_low;
extremes[size].type = -1; // 低点
extremes[size].is_valid = false;
ArrayResize(extremes, size + 2);
extremes[size + 1].time = wave_high_time;
extremes[size + 1].price = wave_high;
extremes[size + 1].type = 1; // 高点
extremes[size + 1].is_valid = false;
} else {
// 空头波段:先高点后低点
int size = ArraySize(extremes);
ArrayResize(extremes, size + 1);
extremes[size].time = wave_high_time;
extremes[size].price = wave_high;
extremes[size].type = 1; // 高点
extremes[size].is_valid = false;
ArrayResize(extremes, size + 2);
extremes[size + 1].time = wave_low_time;
extremes[size + 1].price = wave_low;
extremes[size + 1].type = -1; // 低点
extremes[size + 1].is_valid = false;
}
// 如果波段被终止,跳到终止点继续
if(wave_terminated) {
// 找到end_bar在filtered_bars中的索引
for(int k = i + 1; k < ArraySize(filtered_bars); k++) {
if(filtered_bars[k] == end_bar) {
i = k - 1; // -1因为循环会++
break;
}
}
} else {
// 波段延续到最后
break;
}
}
int size = ArraySize(extremes);
ArrayResize(extremes, size + 1);
extremes[size].time = extreme_time;
extremes[size].price = extreme_price;
extremes[size].type = current_type;
extremes[size].is_valid = false;
}
// 判断有效波段并标记
+50 -11
View File
@@ -24,21 +24,23 @@
## 参数设置
### 波段识别参数
- K线周期:支持参数设置,不跟随图表,默认1min
- 使用百分比模式:默认true(使用百分比模式)
- 波段阈值点数:默认1000点(固定模式有效
- 波段阈值百分比:默认0.25%(百分比模式有效)
- K线周期:支持参数设置,不跟随图表,默认 **1 Minute**
- MA周期:默认 **14**
- 使用百分比模式:默认 **false**(使用固定点数模式
- 波段阈值点数:默认 **1000点**(固定模式有效)
- 波段阈值百分比:默认 **0.1%**(百分比模式有效)
- **反向突破容忍度:默认0.0%(新功能 - 详见下方说明)**
### 风险管理参数
- 止损点数:默认200点
- 止盈点数:默认300点
- 最大持仓时间:默认5分钟
- 止损点数:默认 **200点**
- 止盈点数:默认 **300点**
- 最大持仓时间:默认 **5分钟**
### 仓位管理参数
- 使用复利模式:默认true(开启复利模式)
- 固定手数:默认0.01(固定模式有效)
- 每500$开仓手数:默认0.05(复利模式有效)
- 最大开仓手数:默认99
- 使用复利模式:默认 **false**(使用固定手数模式)
- 固定手数:默认 **0.01手**
- 每500$开仓手数:默认 **0.05手**(复利模式有效)
- 最大开仓手数:默认 **99手**
## 补充说明
@@ -51,6 +53,43 @@
- 开仓后该波段立即失效
- 必须等新的有效波段形成才能再次开仓
### 反向突破容忍度(新功能)⭐
**问题背景:**
在趋势行情中,可能会出现反向突破K线(回调),导致原本完整的波段被"切断",使策略无法识别出肉眼可见的有效波段。
**示例:**
```
价格从2600上涨到2650(涨幅50点)
中间出现一根空单突破K线(回调到2640)
原有逻辑:
- 波段被切断为:2600→2640 和 2640→2650
- 每段都不足1000点,无法识别为有效波段 ✗
容忍模式(设置30%):
- 回调10点 ÷ 波段50点 = 20% < 30%
- 回撤在容忍范围内,继续计算完整波段
- 识别出2600→2650的有效波段 ✓
```
**参数说明:**
- **0%(默认)**:不容忍任何反向突破,保持原有逻辑
- **10-20%**:容忍小幅回调,适合短期趋势
- **30-40%**:容忍中等回调,适合日内波段
- **50%以上**:容忍大幅回调,可能识别出更大的波段(但也可能误判)
**推荐设置:**
- 保守型:0-10%
- 标准型:20-30%
- 激进型:30-50%
**注意事项:**
1. 设置为0时,完全保持原有逻辑,不影响现有回测结果
2. 容忍度越高,识别的波段越大,但也可能包含更多噪音
3. 建议先回测不同容忍度,找到最适合的数值
4. 容忍度只影响波段识别,不影响止损止盈等其他逻辑
### 波段阈值模式说明
**固定点数模式:**
- 相邻极值点价差达到固定点数即为有效波段