文章 "通用EA交易: CUnIndicator 和挂单的使用(第9部分)"

 

新文章 通用EA交易: CUnIndicator 和挂单的使用(第9部分)已发布:

本文讲述的是通过通用的 CUnIndicator 类来操作指标,另外,还探讨了操作挂单的新方法。请注意,从这一点开始,CStrategy 项目的结构开始发生本质改变,现在所有的文件都位于一个目录中以便用户方便使用。

下面的屏幕截图显示了在策略测试器中 CIpmulse 2.0 的测试片段,它显示了设置的挂单以及对它们的处理:


图 1. 在 Impulse 2.0 策略测试中对挂单的处理

作者:Vasiliy Sokolov

 

太棒了!我说的是指标包装器。

我个人认为,在您出色的通用智能交易系统 中,唯一欠缺的是在一个账户中使用多个不同的智能交易系统进行 FORTS 操作的可能性,即用魔法而非标准方法跟踪智能交易系统的仓位。

因此,目前我使用自己的解决方案

 
Viktor Vlasenko:

太棒了!我说的是指标包装器。

我个人认为,在您出色的通用智能交易系统中,唯一欠缺的是在一个账户中使用多个不同的智能交易系统进行 FORTS 操作的可能性,即用魔法而非标准方法跟踪智能交易系统的仓位。

因此,到目前为止,我使用自己的解决方案

为此,我使用了HedgeTerminal,其 API 与通用智能交易系统集成。顺便说一下,通用专家最初是作为 HedgeTerminal 的包装器而创建的。但为了普及该引擎,我将其从 HT 中分离出来,作为一个独立项目开始开发。

 
Vasiliy Sokolov:

为此,HedgeTerminal对冲终端)与 Universal Expert Advisor(通用专家顾问)集成了 API。顺便说一下,通用专家最初是作为 HedgeTerminal 的封装程序而创建的。但为了普及该引擎,我将其从 HT 中分离出来,并开始作为一个独立项目进行开发。

谢谢,我读了关于 HedgeTerminal 的资料,它对我来说是多余的,我不想使用别人的封闭工具。

我非常喜欢当前版本中文件文件夹结构的改变。

 

通用专家 是什么意思?我认为我们的出发点是它既适用于 MT4,也适用于 MT5。但它并不是为 MT4 编译的,它的所有库都在 MQL5 中。

 
void CUnIndicator::PushName(string name)
{
   int old_size = ArraySize(m_params);
   int size = ArrayResize(m_params, ArraySize(m_params) + 1);
   for(int i = 0; i < old_size; i++)
      m_params[i+1] = m_params[i];
   m_params[0].type = TYPE_STRING;
   m_params[0].string_value = name;
}

我怀疑在这里,整个 m_params 数组被应用于它的第一个参数堵塞了

 

void CUnIndicator::PushName(string name)
{
int old_size = ArraySize(m_params);
int size = ArrayResize(m_params, ArraySize(m_params) + 1);
for(int i = 0; i < old_size; i++)
m_params[i+1] = m_params[i];
m_params[0].type = TYPE_STRING;
m_params[0].string_value = name;
m_params_count++;
}

在我看来,应该是这样的,注意 m_params_count++;我们增加了传入参数数组的大小,所以我们增加了传入参数的计数器,至少在调用 不带参数的指示器 时是这样的。在其他情况下,似乎在指标开始时没有感知到最后一个参数。

 

是的,而且是在同一个函数中:

For(int i = old_size-1; i >= 0; i--)
m_params[i+1] = m_params[i];

 

不错的文章。

CUnIndicator类中Create方法用于客户自定义指标时,那个代码有中有调用PushName(),这个函数有bug,

创建用户自己定义指标时,MqlParam  parameters_array[] 第一个元素必须放置自定义的指标名称。

所有的元素都必须向右移动一个位置,把0号元素位置腾出来放置自定义的指标名称

修改如下:

void CUnIndicator::PushName(string name)
{
   int old_size = ArraySize(m_params);
   int size = ArrayResize(m_params, ArraySize(m_params) + 1);
   //for(int i = 0; i < old_size; i++) m_params[i+1] = m_params[i];  // 这么写是错的
   for(int i=old_size-1;i>=0;i--) m_params[i+1] = m_params[i]; //这样才对
   m_params[0].type = TYPE_STRING;
   m_params[0].string_value = name; //自定义的指标名称
   m_params_count++;// 参数个数 加1 
}
 
向作者提问:给我一个方向:如何使通过 CUnIndicat 调用的指标可加载?
 

您好。

向作者提问:已经下载了文章所附交易引擎的最新版本,正在测试所附策略 Impluse 2.0。

1.在可视化模式下的策略测试器中,交易模式控制面板是否应该工作?

2.通过 TradeState.SetTradeState 方法设置的交易模式是否应该执行?

在账户上进行交易时,面板可以工作,模式可以切换,但在策略测试器中却不行。