【问题标题】:State Machine where a state knows what the trigger is状态机知道触发器是什么
【发布时间】:2015-08-26 16:30:56
【问题描述】:

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

假设我有以下触发器:

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

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

【问题讨论】:

    标签: c# state-machine stateless-state-machine


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢。我想另一种方法是将状态/触发器的历史推送到堆栈中,并在堆栈中搜索“模式”。但这看起来很笨拙且势在必行,但它可能可以发挥作用。
    • @Ivan 是的,你可以这样做——事实上,你所描述的听起来像是下推自动机模型。它比有限状态机更强大,所以它比你需要的多一点(严格来说)......但它可以让你更容易地模拟你的情况。从理论上讲,人类执行的每个程序都可以用有限自动机模型来描述,尽管对于大多数现实程序来说这样做是非常愚蠢的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    相关资源
    最近更新 更多