| 
 | 
 
 
 楼主 |
发表于 2025-3-25 21:50:04
|
显示全部楼层
 
 
 
 本帖最后由 cheetor 于 2025-3-25 21:51 编辑  
 
根据 2TXT中的规范,自定义函数体内不能直接使用VARIABLE声明静态变量。以下是修改后的实现方案: - // 需在公式开头声明全局变量 
 
 - VARIABLE:last_signal=0;
 
 -  
 
 - function tfilter(buy_cond, sell_cond, n)
 
 - begin 
 
 -     // 初始化临时变量 
 
 -     tmp_buy := 0;
 
 -     tmp_sell := 0;
 
 -     result := 0;
 
 -  
 
 -     // 买入过滤逻辑(支持n=0/1)
 
 -     if (n=0 or n=1) then 
 
 -         tmp_buy := buy_cond and (last_signal<>1);
 
 -  
 
 -     // 卖出过滤逻辑(支持n=0/2)
 
 -     if (n=0 or n=2) then 
 
 -         tmp_sell := sell_cond and (last_signal<>2);
 
 -  
 
 -     // 信号互斥处理 
 
 -     if tmp_buy and tmp_sell then begin  // 买卖条件同时触发 
 
 -         result := 1;
 
 -         last_signal := 1;
 
 -     end else if tmp_buy then begin      // 仅买入条件成立 
 
 -         result := 1;
 
 -         last_signal := 1;
 
 -     end else if tmp_sell then begin     // 仅卖出条件成立 
 
 -         result := 2;
 
 -         last_signal := 2;
 
 -     end else begin                      // 无信号时重置状态 
 
 -         last_signal := 0;
 
 -     end;
 
 -  
 
 -     return result;
 
 - end;
 
  复制代码核心修改点: - 全局变量声明 2TXT
 
- 将last_signal声明为公式级全局变量(需在公式开头通过VARIABLE:last_signal=0;声明)
 - 在函数体内直接读写全局变量,不再使用函数内部变量声明
 
 
  - 信号处理优化 1TXT
 
- 简化条件判断流程,通过tmp_buy和tmp_sell中间变量实现信号互斥
 - 增加无信号时的状态重置逻辑,避免残留信号影响
 
 
  - 兼容性增强 3TXT
 
- 支持多个tfilter函数实例共存(需为每个实例声明独立全局变量)
 - 避免使用循环依赖结构,提高运算效率
 
 
  
 
 使用示例: - // 全局变量声明(必须放在公式开头)
 
 - VARIABLE:last_signal=0;
 
 -  
 
 - // 信号生成 
 
 - 买条件 := C > MA(C,20);
 
 - 卖条件 := C < MA(C,20);
 
 - 信号 := tfilter(买条件, 卖条件, 0);
 
 -  
 
 - // 图表标注 
 
 - DRAWICON(信号=1, LOW*0.98, 1);
 
 - DRAWICON(信号=2, HIGH*1.02, 2);
 
  复制代码注意事项: - 必须在使用函数前声明全局变量VARIABLE:last_signal=0;,否则会导致逻辑错误1TXT
 - 同一公式中多个tfilter实例需要声明不同的全局变量,例如:
 - VARIABLE:signal1=0, signal2=0;
 
  
- // 实例1 
 
 - function tfilter1(...) begin ... end 
 
  
- // 实例2 
 
 - function tfilter2(...) begin ... end 
 
  复制代码 返回值逻辑与原始需求保持一致:1=买入,2=卖出,0=无信号3TXT 
  
 
 
 |   
 
 
 
 |