易得程序化交易技术论坛

登录 | 注册

积分: 0 |用户组: 游客

搜索
查看: 811|回复: 1

反馈:缺少TFILTER函数

[复制链接]

7

主题

35

帖子

1559

积分

金牌会员

Rank: 6Rank: 6

积分
1559
QQ
发表于 2024-12-24 16:53:32 | 显示全部楼层 |阅读模式
过滤连续出现的信号.
用法:TFILTER(买入条件,卖出条件,N);过滤掉买入(卖出)信号发出后,下一个反向信号发出前的所有买入(卖出)信号.

N=1表示仅对买入信号过滤;
N=2表示仅对卖出信号过滤;
N=0表示对买入和卖出信号都过滤,返回1,2表示买入或卖出条件成立;
同一K线上只能有一个信号;

例如:
ENTERLONG:TFILTER(买入,卖出,1);
EXITLONG:TFILTER(买入,卖出,2);
TFILTER函数说明.png
回复

使用道具 举报

7

主题

35

帖子

1559

积分

金牌会员

Rank: 6Rank: 6

积分
1559
QQ
 楼主| 发表于 2025-3-25 21:50:04 | 显示全部楼层
本帖最后由 cheetor 于 2025-3-25 21:51 编辑

根据2TXT中的规范,自定义函数体内不能直接使用VARIABLE声明静态变量。以下是修改后的实现方案:
  1. // 需在公式开头声明全局变量
  2. VARIABLE:last_signal=0;

  3. function tfilter(buy_cond, sell_cond, n)
  4. begin
  5.     // 初始化临时变量
  6.     tmp_buy := 0;
  7.     tmp_sell := 0;
  8.     result := 0;

  9.     // 买入过滤逻辑(支持n=0/1)
  10.     if (n=0 or n=1) then
  11.         tmp_buy := buy_cond and (last_signal<>1);

  12.     // 卖出过滤逻辑(支持n=0/2)
  13.     if (n=0 or n=2) then
  14.         tmp_sell := sell_cond and (last_signal<>2);

  15.     // 信号互斥处理
  16.     if tmp_buy and tmp_sell then begin  // 买卖条件同时触发
  17.         result := 1;
  18.         last_signal := 1;
  19.     end else if tmp_buy then begin      // 仅买入条件成立
  20.         result := 1;
  21.         last_signal := 1;
  22.     end else if tmp_sell then begin     // 仅卖出条件成立
  23.         result := 2;
  24.         last_signal := 2;
  25.     end else begin                      // 无信号时重置状态
  26.         last_signal := 0;
  27.     end;

  28.     return result;
  29. end;
复制代码
核心修改点:
  • 全局变量声明 2TXT
    • 将last_signal声明为公式级全局变量(需在公式开头通过VARIABLE:last_signal=0;声明)
    • 在函数体内直接读写全局变量,不再使用函数内部变量声明
  • 信号处理优化 1TXT
    • 简化条件判断流程,通过tmp_buy和tmp_sell中间变量实现信号互斥
    • 增加无信号时的状态重置逻辑,避免残留信号影响
  • 兼容性增强 3TXT
    • 支持多个tfilter函数实例共存(需为每个实例声明独立全局变量)
    • 避免使用循环依赖结构,提高运算效率

使用示例:
  1. // 全局变量声明(必须放在公式开头)
  2. VARIABLE:last_signal=0;

  3. // 信号生成
  4. 买条件 := C > MA(C,20);
  5. 卖条件 := C < MA(C,20);
  6. 信号 := tfilter(买条件, 卖条件, 0);

  7. // 图表标注
  8. DRAWICON(信号=1, LOW*0.98, 1);
  9. DRAWICON(信号=2, HIGH*1.02, 2);
复制代码
注意事项:
  • 必须在使用函数前声明全局变量VARIABLE:last_signal=0;,否则会导致逻辑错误1TXT
  • 同一公式中多个tfilter实例需要声明不同的全局变量,例如:
    1. VARIABLE:signal1=0, signal2=0;

    2. // 实例1
    3. function tfilter1(...) begin ... end

    4. // 实例2
    5. function tfilter2(...) begin ... end
    复制代码
    返回值逻辑与原始需求保持一致:1=买入,2=卖出,0=无信号3TXT



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|小黑屋|易得程序化 ( 粤ICP备2022064048号 )

GMT+8, 2025-4-28 06:40 , Processed in 0.057110 second(s), 22 queries .

快速回复 返回顶部 返回列表