请求将MQL5简单移动平均函数转换为单核心OpenCL内核(附尝试代码)
将MQL5简单移动平均函数转换为单核心OpenCL内核
没问题,我帮你把MQL5的CalculateSimpleMA函数完整转换成单核心的OpenCL内核。先看你提供的MQL5代码片段(我补全了未写完的标准SMA逻辑):
void CalculateSimpleMA(int rates_total,int prev_calculated,int begin,const double &price[]) { int i,limit; //--- 首次计算或K线数量变更 if(prev_calculated==0)// 首次计算 { limit=InpMAPeriod+begin; //--- 为前limit根K线设置空值 for(i=0;i<limit-1;i++) ExtLineBuffer[i]=0.0; //--- 计算首个可见值 double sum=0.0; for(i=begin;i<limit;i++) sum+=price[i]; ExtLineBuffer[limit-1]=sum/InpMAPeriod; //--- 批量计算剩余K线 for(i=limit;i<rates_total;i++){ sum=sum-price[i-InpMAPeriod]+price[i]; ExtLineBuffer[i]=sum/InpMAPeriod; } } else { //--- 仅计算新增K线 limit=rates_total-1; double sum=ExtLineBuffer[limit-1]*InpMAPeriod - price[limit-InpMAPeriod] + price[limit]; ExtLineBuffer[limit]=sum/InpMAPeriod; } }
下面是严格匹配原逻辑的单核心OpenCL内核实现,完全串行执行,不依赖并行计算:
__kernel void CalculateSimpleMA( const int rates_total, const int prev_calculated, const int begin, const int inpMAPeriod, __global const double *price, __global double *extLineBuffer ) { // 单核心串行执行,不使用任何并行索引 int i, limit; if (prev_calculated == 0) { limit = inpMAPeriod + begin; // 为前limit-1根K线设置空值 for (i = 0; i < limit - 1; i++) { extLineBuffer[i] = 0.0; } // 计算第一个有效SMA值 double sum = 0.0; for (i = begin; i < limit; i++) { sum += price[i]; } extLineBuffer[limit - 1] = sum / inpMAPeriod; // 批量计算剩余所有K线的SMA for (i = limit; i < rates_total; i++) { sum = sum - price[i - inpMAPeriod] + price[i]; extLineBuffer[i] = sum / inpMAPeriod; } } else { // 增量计算仅新增的K线 limit = rates_total - 1; double sum = extLineBuffer[limit - 1] * inpMAPeriod - price[limit - inpMAPeriod] + price[limit]; extLineBuffer[limit] = sum / inpMAPeriod; } }
核心细节说明:
- 完全遵循原MQL5的计算逻辑,包括首次全量计算和后续增量计算的分支
- 因为要求单核心执行,内核中没有使用
get_global_id(0)这类并行索引,全程用串行循环完成计算 - 所有参数与原MQL5函数一一对应,
__global修饰符标识从主机端传入的全局内存数组 - 补全了原MQL5代码中未写完的首次计算批量处理逻辑,保证功能完整性
内容的提问来源于stack exchange,提问作者Jaffer Wilson
相关产品推荐
相关产品推荐

