一个状态知道触发器是什么的状态机
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" 建模,您需要定义三个转换:
- 在触发器子集 {A, B} 上从状态一到状态二
- 在触发器子集 {B, C} 上从状态一到状态二
- 在触发器子集 {A, C} 上从状态一到状态二
那么,有可能吗?应该是,前提是 StateMachine
将接受某种集合类型作为触发器类型。它比替代方案更好吗?你来电。
另请注意 - 这可能会导致不确定的机器,可能不受支持(不确定 StateMachine 的详细信息)。好消息是,您始终可以将非确定性机器转换为确定性机器,所以如果您发现自己处于这种情况,只需查看详细信息并重新设计您的机器。
我想知道状态机是否适合这种情况。
假设我有以下触发器:
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" 建模,您需要定义三个转换:
- 在触发器子集 {A, B} 上从状态一到状态二
- 在触发器子集 {B, C} 上从状态一到状态二
- 在触发器子集 {A, C} 上从状态一到状态二
那么,有可能吗?应该是,前提是 StateMachine
将接受某种集合类型作为触发器类型。它比替代方案更好吗?你来电。
另请注意 - 这可能会导致不确定的机器,可能不受支持(不确定 StateMachine 的详细信息)。好消息是,您始终可以将非确定性机器转换为确定性机器,所以如果您发现自己处于这种情况,只需查看详细信息并重新设计您的机器。