鼎元C++程序化策略超市产品 第011款 “Supertrend交易系统“
  
- UID
- 2
- 积分
- 2948080
- 威望
- 1424077 布
- 龙e币
- 1524003 刀
- 在线时间
- 13794 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-5-1

|
鼎元C++程序化策略超市产品 第011款 “Supertrend交易系统“

一、原理:
1、Supertrend 是一种跟随趋势的指标,常用于股票、期货和外汇交易中,它会直接画在价格图上,显示买卖信号。核心思路是基于 ATR(Average True Range,平均真实波动范围)来动态调整支撑位和阻力位。
2、Supertrend 计算步骤
先计算 ATR(Average True Range)
True Range (TR) = max(当日最高价 - 当日最低价, |当日最高价 - 前一日收盘价|, |当日最低价 - 前一日收盘价|)
ATR 通常是 TR 的 N 日(比如14日)移动平均,可以用简单移动平均 (SMA) 或指数移动平均 (EMA)。
计算 Supertrend 的上下轨
设定:
Multiplier:倍数(比如2)
然后:
Upper Band = (High + Low) / 2 + Multiplier × ATR
Lower Band = (High + Low) / 2 - Multiplier × ATR
根据价格位置调整 Supertrend
Supertrend本身跟随价格变化:
如果价格收盘价 > 上一根K线的 Supertrend,那么当前Supertrend走在 Lower Band 上,并且信号是 买入。
如果价格收盘价 < 上一根K线的 Supertrend,那么当前Supertrend走在 Upper Band 上,并且信号是 卖出。
规则补充(防止频繁切换)
如果当前是买入状态,Supertrend 不能突然切到更低的 Lower Band,只能随着原有 Lower Band 上升。
如果当前是卖出状态,Supertrend 不能突然切到更高的 Upper Band,只能随着原有 Upper Band 下降。
公式总结

然后根据之前的趋势和收盘价来选择最终的 Supertrend。
简单示例
比如:
ATR(14) = 2
Multiplier = 3
今天最高 = 105,最低 = 95
(High + Low)/2 = 100
那么:
Upper Band = 100 + 3 × 2 = 106
Lower Band = 100 - 3 × 2 = 94
如果今天收盘价 > 上一根 Supertrend,那么Supertrend走Lower Band(即94)。 |
论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
|
|
|
|
|
|
  
- UID
- 2
- 积分
- 2948080
- 威望
- 1424077 布
- 龙e币
- 1524003 刀
- 在线时间
- 13794 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-5-1

|
C++核心计算模块:- //在主程序区计算SuperTrend函数指标
- vector<double>HL2;//声明中轴线变量容器
- RsqBar(sPeriod, sInst);//申请策略运行面板设置的品种周期数据
- //下面是迭代和遍历取所需数据
- map<string, TKVALUE>::iterator it;
- for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); it++)
- {
- closep.push_back(it->second.dClose);//将收盘价存入closep
- HL2.push_back((it->second.dHigh + it->second.dLow) / 2);//中轴值计算:当根bar的(high-low)取平均
- }
- ATRvalue = avgtruerange(sPeriod, sInst, ATRLength);//计算 atr atrlength周期的平均值
- hilovalue = HL2[HL2.size() - 1]; //求得(high+low)/2的值即中轴值
- Upperband = hilovalue + Multiplier * ATRvalue; //上沿 = 平均值 + atr倍数 * atr值
- Lowerband = hilovalue - Multiplier * ATRvalue; //下沿 = 平均值 - atr倍数 * atr值
- //确定supertrend的值
- if (HL2.size() < length)
- {
- SuperTrend = Upperband;
- PrevTrend = 1;
- }
- else
- {
- //确定supertrend值(计算方法比较前一个supertrend值与upperband或lowerband值大小)
- if (closep[closep.size() - 1] > PrevSupertrend)SuperTrend = max2(Lowerband, PrevSupertrend);//如果收盘价大于supertrend前一个值,则新的supertrend值在下沿和上值取小者
- if (closep[closep.size() - 1] < PrevSupertrend) SuperTrend = min2(Upperband, PrevSupertrend);//反之亦然
- //确定trend值
- if (closep[closep.size() - 1] > SuperTrend)trend = 1;//closep[closep.size() - 1]为最新收盘价,最新收盘价大于supertrend则trend为1
- if (closep[closep.size() - 1] < SuperTrend)trend = -1;//最新收盘价小于supertrend则trend为-1
- }
- //输出进场价格至LOG面板
- string s2 = " 合约: " + sInst + " 周期: " + sPeriod + " 高低值周期: " + to_string(length) + " atr值 : " + to_string(ATRvalue) + " 中轴值: " + to_string(hilovalue) + " 上沿 : " + to_string(Upperband) + ", 下沿 : " + to_string(Lowerband) + " SuperTrend价 : " + to_string(SuperTrend);
- InsertLog(s2);
- //输出进场价格至LOG面板
- //(将最新的变量值传递给前值,为下一轮计算做准备,这一段放在策略码最底部)
- PrevSupertrend = SuperTrend;
- PrevTrend = trend;
复制代码 |
|
|
|
|
|
|
  
- UID
- 2
- 积分
- 2948080
- 威望
- 1424077 布
- 龙e币
- 1524003 刀
- 在线时间
- 13794 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-5-1

|
|
|
|
|
|
|
  
- UID
- 2
- 积分
- 2948080
- 威望
- 1424077 布
- 龙e币
- 1524003 刀
- 在线时间
- 13794 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-5-1

|
|
|
|
|
|
|