C#实现可变变量与逻辑的交易机器人信号判断算法方案
C# 实现可配置交易信号判断逻辑的方案
核心思路是用树形规则节点结构解决括号/优先级处理问题,用接口抽象指标判断逻辑实现扩展免修改,整体分为三层设计:
1. 基础数据结构定义
首先定义通用枚举和规则节点类,用嵌套节点天然对应括号分组,无需手动处理括号拼接:
// 逻辑运算符枚举 public enum LogicOperator { AND, OR, ANDNOT } // 指标类型枚举,新增指标仅需在此新增枚举值 public enum IndicatorType { RSI, StochRSI, MACD, AwesomeOscillator, HurstExponent } // 指标实际信号结果 public enum IndicatorSignal { Buy, Ignore } // 规则节点:支持嵌套,直接对应带括号的组合逻辑 public class RuleNode { // 节点类型:true=逻辑组(对应括号内的组合规则),false=单个指标规则 public bool IsGroup { get; set; } // 逻辑组节点的子节点列表 public List<RuleNode> Children { get; set; } = new(); // 逻辑组内子节点之间的连接运算符 public LogicOperator GroupOperator { get; set; } // 单个指标节点对应的指标类型 public IndicatorType? Indicator { get; set; } // 单个指标的判断参数(可存阈值、判断方向等配置,如"<30"、"金叉"等) public string IndicatorParam { get; set; } }
2. 指标判断逻辑解耦
用统一接口抽象所有指标的判断逻辑,新增指标无需修改核心执行代码:
// 指标判断统一接口 public interface IIndicatorJudge { IndicatorType SupportType { get; } bool IsMatch(string configParam, IndicatorSignal actualSignal); } // RSI指标判断实现示例 public class RsiJudge : IIndicatorJudge { public IndicatorType SupportType => IndicatorType.RSI; public bool IsMatch(string configParam, IndicatorSignal actualSignal) { // 此处实现对应指标的判断逻辑,可解析configParam拿阈值、判断方向,也可接入实时行情数值计算 return actualSignal == IndicatorSignal.Buy; } } // 其他指标(StochRSI、MACD等)均按上述格式实现即可
3. 通用逻辑执行器
递归计算规则节点的结果,自动处理嵌套分组的逻辑优先级:
public class SignalJudgeExecutor { private readonly Dictionary<IndicatorType, IIndicatorJudge> _judgeMap; // 依赖注入所有IIndicatorJudge实现类,新增指标时DI自动扫描注册即可,无需修改此处 public SignalJudgeExecutor(IEnumerable<IIndicatorJudge> allJudges) { _judgeMap = allJudges.ToDictionary(x => x.SupportType, x => x); } // 递归计算规则的最终结果 public bool Judge(RuleNode rootRule, Dictionary<IndicatorType, IndicatorSignal> actualSignals) { // 处理逻辑组节点 if (rootRule.IsGroup) { var childResults = rootRule.Children.Select(child => Judge(child, actualSignals)).ToList(); return rootRule.GroupOperator switch { LogicOperator.AND => childResults.All(r => r), LogicOperator.OR => childResults.Any(r => r), LogicOperator.ANDNOT => childResults.First() && !childResults.Skip(1).All(r => r), _ => throw new NotSupportedException("不支持的逻辑运算符") }; } // 处理单个指标节点 if (!rootRule.Indicator.HasValue || !_judgeMap.TryGetValue(rootRule.Indicator.Value, out var judge)) return false; var signal = actualSignals.TryGetValue(rootRule.Indicator.Value, out var s) ? s : IndicatorSignal.Ignore; return judge.IsMatch(rootRule.IndicatorParam, signal); } }
4. 表单数据适配
你现有表单提交的平级Algorithm结构可以直接转换为上述RuleNode结构:
示例规则:
(RSI < 30 OR StochRSI < 20) AND (MACD金叉 OR Awesome Oscillator发出买入信号) AND Hurst Exponent > 0.5
对应生成的规则节点结构为:
- 根节点:AND逻辑组
- 子节点1:OR逻辑组(含RSI、StochRSI两个指标节点)
- 子节点2:OR逻辑组(含MACD、Awesome Oscillator两个指标节点)
- 子节点3:Hurst Exponent单个指标节点
扩展说明
后续新增指标仅需两步:
- 往
IndicatorType枚举新增对应枚举值 - 新增实现
IIndicatorJudge接口的指标判断类
无需修改核心逻辑执行代码,符合开闭原则。
内容的提问来源于stack exchange,提问作者Jamie Hartnoll
相关产品推荐
相关产品推荐

