历史涨跌停的读取
由system创建,
最终由system编辑,
更新于2024/07/31,
阅读量2085
涨跌停是一种极端行情,在这样的极端行情下,一是可能产生特殊的交易机会。二是对常规策略的风险控制也提出了新的要求,另外对历史测试的真实性也造成了障碍。所以读取历史的涨跌停板做细节处理非常有必要。
TBQuant提供了历史涨跌停的基础数据,我们本节就用一个简单的案例,来介绍下涨跌停历史数据的使用。
在距离几跳就要停板时,顺势追入,并启动追踪止损。 关键代码解读: 首先我们要定义两个基础数据变量来获取历史的结算价和停板比例。
Vars
Dic<Array<Numeric>> mysettleprice("TB_SettlePrice"); //结算价
Dic<Array<Numeric>> mypricelimit("TB_PriceLimit"); //停板比例
然后我们在当根bar要能读到对应的这两个基础数据。 所以我们用mysettleprice[0][0]和mypricelimit[0][0]分别获取结算价和停板比例。 最后我们按照交易所的计算规则产生涨跌停价格。注意各个交易所的计算规则有差别。
If(ExchangeCode=="CZCE")
{
myuplimit=RoundUp(mysettleprice[0][0]*(1+0.01*mypricelimit[0][0])/myjump,0)*myjump;
mydnlimit=RoundDown(mysettleprice[0][0]*(1-0.01*mypricelimit[0][0])/myjump,0)*myjump;
}Else If(ExchangeCode=="DCE")
{
myuplimit=RoundDown(mysettleprice[0][0]*(1+0.01*mypricelimit[0][0])/myjump,0)*myjump;
mydnlimit=RoundUp(mysettleprice[0][0]*(1-0.01*mypricelimit[0][0])/myjump,0)*myjump;
}Else If(ExchangeCode=="SHFE")
{
myuplimit=RoundDown(mysettleprice[0][0]*(1+0.01*mypricelimit[0][0])/myjump,0)*myjump;
mydnlimit=RoundDown(mysettleprice[0][0]*(1-0.01*mypricelimit[0][0])/myjump,0)*myjump;
}Else If(ExchangeCode=="CFFEX")
{
myuplimit=RoundDown(mysettleprice[0][0]*(1+0.01*mypricelimit[0][0])/myjump,0)*myjump;
mydnlimit=RoundUp(mysettleprice[0][0]*(1-0.01*mypricelimit[0][0])/myjump,0)*myjump;
}
Params
Numeric lastnum(1); //距离几跳停板
Numeric hcrate(1); //回撤价格百分比幅度
Vars
Series<Numeric> buylasthigh; //买入持仓盈利价格峰值
Series<Numeric> selllastlow; //卖出持仓盈利价格低谷
Dic<Array<Numeric>> mysettleprice("TB_SettlePrice"); //结算价
Dic<Array<Numeric>> mypricelimit("TB_PriceLimit"); //停板比例
Series<Numeric> myuplimit; //涨停价
Series<Numeric> mydnlimit; //跌停价
Events
OnBar(ArrayRef<Integer> indexs)
{
//计算涨跌停价格
Numeric myjump=MinMove*pricescale;
If(ExchangeCode=="CZCE")
{
myuplimit=RoundUp(mysettleprice[0][0]*(1+0.01*mypricelimit[0][0])/myjump,0)*myjump;
mydnlimit=RoundDown(mysettleprice[0][0]*(1-0.01*mypricelimit[0][0])/myjump,0)*myjump;
}Else If(ExchangeCode=="DCE")
{
myuplimit=RoundDown(mysettleprice[0][0]*(1+0.01*mypricelimit[0][0])/myjump,0)*myjump;
mydnlimit=RoundUp(mysettleprice[0][0]*(1-0.01*mypricelimit[0][0])/myjump,0)*myjump;
}Else If(ExchangeCode=="SHFE")
{
myuplimit=RoundDown(mysettleprice[0][0]*(1+0.01*mypricelimit[0][0])/myjump,0)*myjump;
mydnlimit=RoundDown(mysettleprice[0][0]*(1-0.01*mypricelimit[0][0])/myjump,0)*myjump;
}Else If(ExchangeCode=="CFFEX")
{
myuplimit=RoundDown(mysettleprice[0][0]*(1+0.01*mypricelimit[0][0])/myjump,0)*myjump;
mydnlimit=RoundUp(mysettleprice[0][0]*(1-0.01*mypricelimit[0][0])/myjump,0)*myjump;
}
If(myuplimit<=mydnlimit) Return;
PlotNumeric("myuplimit",myuplimit);
PlotNumeric("mydnlimit",mydnlimit);它这段代码没有明确指出计算昨天的涨跌停板价。理论上计算昨天的涨跌停价,需要前日的结算价与昨天涨跌停比例,不知道如何获得这两个数据?它这段代码没有明确指出计算昨天的涨跌停板价。理论上计算昨天的涨跌停价,需要前日的结算价与昨天涨跌停比例,不知道如何获得这两个数据?
......如果你每根bar上都计算了当日的涨跌停价,那昨日涨跌停价不就是回溯一下就解决了吗?