基于布林带(Bollinger Bands)的股票买卖程序出现段错误
排查布林带股票交易程序段错误的实用思路
嘿,我特别懂这种写量化策略碰到段错误的头疼感!你这个布林带程序的逻辑方向是对的——用M天窗口的移动平均线(MA)和标准差(SD)生成上下轨,再根据股价突破情况判断买卖点,但段错误十有八九是和内存访问不合法有关,结合你的需求,我给你列几个最可能的排查点:
- 数组越界是重灾区:你要计算
n-M+1到n天的股价数据,首先得明确数组的索引规则。如果你的股价数组是从0开始索引(比如prices[0]是第一天数据),那当n的取值小于M-1时,n-M+1会变成负数或者0之前的数,直接访问这个位置的内存就会触发段错误。举个例子:如果N=10,M=5,那n的有效范围应该是从4到9(对应第5天到第10天),要是循环里n从0开始跑,那第一次计算的起始索引就是0-5+1=-4,这肯定踩内存了。 - 未正确分配内存:如果你的程序里用来存储MA、SD或者上下轨的数组是指针类型(比如
double *ma;),但没提前用malloc或者calloc分配足够的空间(至少要分配N-M+1个元素的空间),那往里面写入计算结果时就会写到未知内存区域,触发段错误。 - 参数合法性没校验:要是用户输入的M比N还大,那根本凑不齐M天的股价数据来计算MA和SD,程序硬着头皮计算的话,必然会访问不存在的数组元素。所以程序开头一定要加判断:如果
M > N,直接输出参数错误提示并退出,别让程序继续跑。 - 循环边界写错了:比如你在遍历计算每个窗口的MA时,循环的终止条件写错了。比如本来应该循环到
i = N - M,结果写成了i = N,那最后一次计算时,窗口的结束索引就会超出股价数组的最大下标,直接越界。
另外,给你个实用调试技巧:用gdb(Linux下)或者VSCode的调试功能,运行程序触发段错误后,查看调用栈(backtrace),就能精准定位到哪一行代码出问题了,比瞎猜高效多了。
内容的提问来源于stack exchange,提问作者Ode To Sleep
相关产品推荐
相关产品推荐

