一个状态知道触发器是什么的状态机

State Machine where a state knows what the trigger is

我想知道状态机是否适合这种情况。

假设我有以下触发器:

enum Trigger
{
    None,
    RSIGt70,
    RSILt30,
    TrendUp,
    TrendDown
}

我有以下状态

enum State
{
    Flat,
    ShortUnit1,
    ShortUnit2,
    LongUnit1,
    LongUnit2
}

var position= new StateMachine<State, Trigger>(State.Flat);

position.Configure(State.Flat)
            .Permit(Trigger.RSIGt70, State.Flat);
            .Permit(Trigger.TrendingUp, State.Flat);
            .Permit(Trigger.RSIGt70, State.ShortUnit1);
            .Permit(Trigger.TrendingUp, State.ShortUnit1);

我试图摆脱 if 语句并用状态机替换交易逻辑。不确定它是否有效,因为它可能是从一种状态转换到另一种状态的触发器的汇合。问题是,状态机如何处理这种情况?它们足够丰富还是我必须使用标准的图灵机,即 if 有记忆的语句?

问题是两个以上(在本例中)条件必须为真才能从持平转为多头或空头头寸之一。

所以我的意思是,例如,如果 RSI > 70 TrendingUp,则过渡到空头头寸。或者,如果 TrendingUp and RSI > 70,则过渡到空头头寸。因为这两种情况发生的顺序无关紧要。对于其他可能的情况,反之亦然。但如果只有一个条件为真,则不会触发任何仓位。但是如果我处于一个状态,我怎么知道我是来自 None 不会触发位置,还是来自其他触发位置的条件?

如果系统变得更加复杂,我会尽量避免容易出错的 if/else 语句。不确定这是否可以用 FSM 处理,因为它取决于当前状态如何随时间变化的历史。

从理论上讲,有限自动机模型能够对您的情况进行建模。与 if 语句相比是否实用取决于您。

基本上,您所描述的是一台机器,其中触发器是触发器集的子集。因此,您将需要使用 Trigger 的不可变集合,而不仅仅是 Trigger,以在您的机器中指定转换。例如,要对规则 "transition from state one to two if at least two of triggers A, B, and C occur" 建模,您需要定义三个转换:

  1. 在触发器子集 {A, B} 上从状态一到状态二
  2. 在触发器子集 {B, C} 上从状态一到状态二
  3. 在触发器子集 {A, C} 上从状态一到状态二

那么,有可能吗?应该是,前提是 StateMachine 将接受某种集合类型作为触发器类型。它比替代方案更好吗?你来电。

另请注意 - 这可能会导致不确定的机器,可能不受支持(不确定 StateMachine 的详细信息)。好消息是,您始终可以将非确定性机器转换为确定性机器,所以如果您发现自己处于这种情况,只需查看详细信息并重新设计您的机器。