我想我已经在智能交易系统中实施了策略模式,但可能方式不同。
这可以为我们敬爱的读者提供一个更实用的例子,对我来说,如果我犯了概念上的错误,我也希望得到您的反馈:
我在这里简化一下过程:
专家本身是一个对象,并成为上下文:
- 我有一个枚举来选择策略(例如 STRATEGY_RSI、STRATEGY_MA......)。
- 我在策略枚举的 OnInit() 中使用了开关语句,根据结果,我
switch(strategyName) { case STRATEGY_RSI : m_strategy = new Strategy_RSI(); break; case STRATEGY_MA : m_strategy = new Strategy_MA(); break; default: break; }
- 通过参数对象(如 mqlparams)为策略设置输入参数
[...] // 通过专家方法将信号参数添加到策略中 Expert.AddParameterObject(signal_RSI_Params); // signal_RSI_Params 是参数对象,其中包含输入参数 //AddParameterObject 方法的细节(简化): bool CExpert::AddParameterObject(CParameter & parameter) { if(!m_strategy.AddParameterObject(parameter)) { return(false); } } return true; } // 添加通用专家参数。 Expert.InitStrategyParameters(expert_1_Params); //方法的细节(简化) : bool CExpert::InitStrategyParameters(CParameter & expertParameters) { // if(!m_strategy.InitStrategyParameters(expertParameters)) { [...] return false; } return true; }
- 所有策略都执行相同的方法(打开信号、关闭交易......)。
- 所有策略都可以加载信号或自定义指标
在专家的 OnTick 函数中,我调用通用的策略方法
bool CExpert::CheckOpenLong(void) { [...] if(true == m_strategy.CheckOpenLong([...])) { [...] } [...] }
效果很好,因为我可以用同一个专家测试多个策略/优化。
除了将输入参数放在一个单独的文件中外,我唯一没有找到的是如何根据用户选择的特定输入参数(即策略输入)动态加载输入参数。
我想听听你们对我的实现方式的反馈意见,这是一种策略模式,还是一种混合模式,有哪些地方可以改进?
您知道我们如何才能拥有(我认为 MT5 不可能)动态上下文输入参数吗?
非常感谢
Didma
很有启发
为什么具有相同功能的函数有不同的名称
,例如此处
void Memento::SetState(string state) { m_state=state; } void Originator::State(string state) { m_state=state; }
新文章 软件开发和 MQL5 中的设计范式(第 4 部分):行为范式 2已发布:
在本文中,我们将终结有关设计范式主题的系列文章,我们提到有三种类型的设计范式:创建型、结构型、和行为型。我们将终结行为类型的其余范式,其可以帮助设置对象之间的交互方法,令我们的代码更整洁。
在本章节中,我们将辩证另一种行为设计范式,即备忘录范式。备忘录范式可将对象的状态外部化,以便提供回滚功能,它也称为令牌。
范式有什么作用?
当我们需要存储对象的状态快照,以便稍后恢复对象时,以及当获取状态的直接接口会暴露执行的细节,并破坏对象的封装时,我们可以使用备忘录范式。故此,该范式将捕获稍后要恢复的对象状态,并将其外部化,以下是该范式的结构图,展示其工作原理:
作者:Mohamed Abdelmaaboud