文章 "软件开发和 MQL5 中的设计范式(第 4 部分):行为范式 2"

 

新文章 软件开发和 MQL5 中的设计范式(第 4 部分):行为范式 2已发布:

在本文中,我们将终结有关设计范式主题的系列文章,我们提到有三种类型的设计范式:创建型、结构型、和行为型。我们将终结行为类型的其余范式,其可以帮助设置对象之间的交互方法,令我们的代码更整洁。

在本章节中,我们将辩证另一种行为设计范式,即备忘录范式。备忘录范式可将对象的状态外部化,以便提供回滚功能,它也称为令牌。

范式有什么作用?

当我们需要存储对象的状态快照,以便稍后恢复对象时,以及当获取状态的直接接口会暴露执行的细节,并破坏对象的封装时,我们可以使用备忘录范式。故此,该范式将捕获稍后要恢复的对象状态,并将其外部化,以下是该范式的结构图,展示其工作原理:

Memento

作者:Mohamed Abdelmaaboud

 



我想我已经在智能交易系统中实施了策略模式,但可能方式不同。

这可以为我们敬爱的读者提供一个更实用的例子,对我来说,如果我犯了概念上的错误,我也希望得到您的反馈:

我在这里简化一下过程:
专家本身是一个对象,并成为上下文:

  • 我有一个枚举来选择策略(例如 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;
  }