|

楼主 |
发表于 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
|
|