如何计算昨涨跌停板价?

历史涨跌停的读取由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上都计算了当日的涨跌停价,那昨日涨跌停价不就是回溯一下就解决了吗?

回复:不好意思我没看懂,麻烦举列说明一下,谢谢你

回复: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; //跌停价 Series<Numeric> yes_uplimit; //昨日涨停价 Series<Numeric> yes_dnlimit; //昨日跌停价EventsOnBar(ArrayRef<Integer> indexs){ // 计算当日涨跌停价格 Numeric myjump=MinMove*pricescale; // 获取昨日结算价(当前Bar的前一个交易日结算价) Numeric yesterday_settle = mysettleprice[1][0]; // [1]表示前一根Bar // 获取昨日涨跌停比例 Numeric yesterday_limitrate = mypricelimit[1][0]; // 计算昨日涨跌停价 If(ExchangeCode=="CZCE") { yes_uplimit = RoundUp(yesterday_settle*(1+0.01*yesterday_limitrate)/myjump,0)*myjump; yes_dnlimit = RoundDown(yesterday_settle*(1-0.01*yesterday_limitrate)/myjump,0)*myjump; }Else If(ExchangeCode=="DCE") { yes_uplimit = RoundDown(yesterday_settle*(1+0.01*yesterday_limitrate)/myjump,0)*myjump; yes_dnlimit = RoundUp(yesterday_settle*(1-0.01*yesterday_limitrate)/myjump,0)*myjump; }Else If(ExchangeCode=="SHFE") { yes_uplimit = RoundDown(yesterday_settle*(1+0.01*yesterday_limitrate)/myjump,0)*myjump; yes_dnlimit = RoundDown(yesterday_settle*(1-0.01*yesterday_limitrate)/myjump,0)*myjump; }Else If(ExchangeCode=="CFFEX") { yes_uplimit = RoundDown(yesterday_settle*(1+0.01*yesterday_limitrate)/myjump,0)*myjump; yes_dnlimit = RoundUp(yesterday_settle*(1-0.01*yesterday_limitrate)/myjump,0)*myjump; } // 如果需要,也可以同时计算当日的涨跌停价 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回溯一下,写myuplimit[1]就行了序列对象的回溯操作属于tbl语法里很基础的内容,如果这个内容都没有掌握开发模型恐怕不太合适