2

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

假设我有以下触发器:

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 > 70TrendingUp,则转换为空头头寸。或者,如果 TrendingUpRSI > 70,则转换为空头头寸。因为这两个条件发生的顺序无关紧要。对于其他可能的情况,反之亦然。但如果只有一个条件为真,则不会触发任何仓位。但是如果我处于一个状态,我怎么知道我是来自None哪个不触发位置,还是来自其他触发位置的条件?

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

4

1 回答 1

3

从理论上讲,有限自动机模型能够模拟您的情况。if与陈述相比,它是否实用取决于您。

基本上,您所描述的是一台机器,其中触发器是您的一组触发器的子集。因此,您将需要使用 的不可变集合Trigger,而不仅仅是Trigger,来指定机器中的转换。例如,要对规则“如果至少有两个触发器 A、B 和 C 发生,则从状态一转换到状态二”建模,您需要定义三个转换:

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

那么,有可能吗?应该是,只要有一些集合类型StateMachine可以接受作为触发器类型。它比替代品更好吗?你的来电。

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

于 2015-08-26T16:40:44.897 回答