文章 "MQL5 向导:如何创建交易信号模块"

 

新文章 MQL5 向导:如何创建交易信号模块已发布:

本文介绍了如何通过在穿越价格和移动平均线时构成信号这一方法来编写自己的交易信号类,以及如何将其包含在 MQL5 向导的交易策略生成器中,还介绍了用于 MQL5 向导的生成类的说明的结构和格式。

Figure 1. The structure of the CExpert base class

作者:MetaQuotes Software Corp.

 
先生们,同志们我读了这篇文章!我按照文章里写的做了一切,我想现在我可以上天堂了。但是没有 - Master MKL 5 没有看到我的信号文件。我又检查了一遍,又做了一遍,又检查了一遍,但是在创建智能交易 向导中看不到信号。 我附上我的文件,我是按照文章中的建议创建的。请帮我弄明白我做错了什么,或者相反,文章的作者没有添加重要的内容,因此没有以任何方式整合在一起。总之,请尽您所能帮助我。
附加的文件:
 
Tincup:
先生们,同志们我读了这篇文章!我按照文章里写的做了一切,我想现在我可以上天堂了。但是没有 - Master MKL 5 没有看到我的信号文件。我又检查了一遍,又做了一遍,又检查了一遍,但是在创建智能交易向导中看不到信号。 我附上我的文件,我是按照文章中的建议创建的。请帮我弄明白我做错了什么,或者相反,文章的作者没有添加重要的内容,因此没有以任何方式整合在一起。总之,请尽您所能帮助我。


类描述 是原文的重要组成部分。

您的描述符中有两个明显的错误。其一是由于指定了一个不存在的 ENUM,导致无法检测信号。第二个错误会在编译时造成问题(参数名称不正确)。

还有一个微妙之处。在每行描述符中,关键字前只能有一个空格。(我想这个限制将来会取消,但现在是这样的)。

// wizard description start
//+---------------------------------------------------------------------------+
//| Description of the class                                                |
//| Title=Сигнал пересечению ценой скользящей средней                     |
//| Type=Signal                                                             |
//| Name=Sample                                                             |
//| Class=CSampleSignal                                                     |
//| Page=                                                                   |
//| Parameter=PeriodMA,int,12                                                |
//| Parameter=ShiftMA,int,0                                                  | было SniftMA
//| Parameter=MethodMA,ENUM_MA_METHOD,MODE_EMA                               |
//| Parameter=AppliedMA,ENUM_APPLIED_PRICE,PRICE_CLOSE                      | было ENUM_MA_APLLIED_PRICE
//| Parameter=Limit,double,0.0                                               |
//| Parameter=StopLoss,double,50.0                                           |
//| Parameter=TakeProfit,double,50.0                                         |
//| Parameter=Expiration,int,10                                              |
//+---------------------------------------------------------------------------+
// wizard description end


在文本上更进一步。

没有构造函数是不好的。你应该用默认值初始化成员数据。毕竟,在一般情况下,设置参数的方法可能不会被调用。

最后,对方法的描述不正确

   void     LimitMA (int value)                    {m_limit=value;}
   void     StopLoss (int value)                   {m_stop_loss=value;}
   void     TakeProfit (int value)                 {m_take_profit=value;}

必须

   void     LimitMA (double value)                    {m_limit=value;}
   void     StopLoss (double value)                   {m_stop_loss=value;}
   void     TakeProfit (double value)                 {m_take_profit=value;}

 

当然,非常感谢你的回复。我修复了所有问题,并且成功了。

但在编译 Expert Advisor 本身时,它给了我一个错误,如果编译器发现了这个错误,我自己是不会发现的。顺便说一句,你在回答我的问题时,一定是自己不经意地修正了这个错误,但文章原文中就有这个错误。

在文章中

  void               Limit(double value)                 { m_limit=value;                  }

回应我的求助

  void               LimitМА(double value)                 { m_limit=value;}

信号文件中没有 MA,在成功生成智能交易系统后对其进行编译时,会产生以下错误

Limit' - 成员函数 未定义 123456.mq5 77 11
1 个错误,0 个警告 2 1

按照我的情况,至少在第 77 行我们可以看到

signal.Limit(Inp_Signal_Sample_Limit);

在 "限制 "一词后插入 MA

Expert Advisor 文本中的错误消失了。

如果我说错了,请原谅。我不是专业人士。

 
因此,描述不应该是 "限制"(Limit),而应该是 "限度"(LimitMA)。
 

还有一件事:无论如何都会出现这个错误:

'--' - l-value required 1234.mq5 31 57

'--' - l-value required 1234.mq5 31 59
'--' - l-value required 1234.mq5 31 61
'--' - l-value required 1234.mq5 31 63
'--' - l-value required 1234.mq5 31 65
'--' - l-value required 1234.mq5 31 67
'--' - l-value required 1234.mq5 31 69
'--' - l-value required 1234.mq5 31 71
'--' - l-value required 1234.mq5 31 73
'--' - l-value required 1234.mq5 31 75
'--' - l-value required 1234.mq5 31 77
'--' - l-value required 1234.mq5 31 79
'--' - l-value required 1234.mq5 31 81
'--' - l-value required 1234.mq5 31 83
'--' - l-value required 1234.mq5 31 85
'--' - l-value required 1234.mq5 31 87
'--' - l-value required 1234.mq5 31 89
'--' - l-value required 1234.mq5 31 91
'--' - l-value required 1234.mq5 31 93
'--' - l-value required 1234.mq5 31 95
'--' - l-value required 1234.mq5 31 97
'--' - l-value required 1234.mq5 31 99
'--' - l-value required 1234.mq5 31 101
'--' - l-value required 1234.mq5 31 103
'--' - l-value required 1234.mq5 31 105
'--' - l-value required 1234.mq5 31 107
'--' - l-value required 1234.mq5 31 109
'--' - l-value required 1234.mq5 31 111
'--' - l-value required 1234.mq5 31 113
'--' - l-value required 1234.mq5 31 115
'-' - 预期操作数 1234.mq5 31 117
'Inp_Signal_Sample_Expiration' - 未声明标识符 1234.mq5 77 22
32 个错误,0 个警告 33 1

转到 EA 的第 31 行,可以看到以下内容

输入 double Inp_Signal_Sample_StopLoss =50.0;
输入 double Inp_Signal_Sample_TakeProfit=50.0;
input int Inp_Signal_Sample_Expiration=10-------------------------------------------------------------;
//--- 输入资金
输入 double Inp_Money_FixLot_Percent =10.0;

输入 double Inp_Money_FixLot_Lots =0.1;

去掉从 10 开始的虚线 形式的尾部,所有错误都会消失。

Expert Advisor 即可运行并进行优化。

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования - Документация по MQL5
 
Tincup:
是的,相应地,描述也不应该是 Limit,而应该是 LimitMA。

是的,LimitMA,我查过了。

总的来说,今后...创建类描述符时,应更积极地使用复制粘贴,因为编译器不会检查注释(构成描述符),而描述符的方法名和参数名的重合非常重要。这只有在编译智能交易系统时才会 "暴露 "出来,并引起负面情绪。不过,正如您所看到的,这并不是什么致命的问题。

 
Tincup:

还有一件事:无论如何都会出现这个错误:

'--' - l-value required 1234.mq5 31 57

出现这个错误的原因是类描述符字符串的长度。假期过后,我们会解决这个问题。
Документация по MQL5: Основы языка / Типы данных / Тип string
Документация по MQL5: Основы языка / Типы данных / Тип string
  • www.mql5.com
Основы языка / Типы данных / Тип string - Документация по MQL5
 
好东西......写得好,肯定让人大开眼界。
 

下午好!

  1. 如果我没弄错的话,附件中有一个错别字!在计算 sl 和 tp 变量的 CheckOpenLong 函数说明行中,符号应该相反。
  2. 我对 CheckOpenLong 函数作了如下修改:
    bool CSampleSignal::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration)
      {
    
       Print("Close(0)=",DoubleToString(Close(0),5)," Close(1)=",DoubleToString(Close(1),5));
       Print("Open(0)=",DoubleToString(Open(0),5)," Open(1)=",DoubleToString(Open(1),5));
       Print("MA(0)=",DoubleToString(MA(0),5)," MA(1)=",DoubleToString(MA(1),5));
    
       return(false);
       
      }
    也就是说,它应该简单地输出上一栏和前一栏的收盘价、开盘价和 MA 值。因此,如果 EveryTick 的值为假,则一切正常,但如果为真,则输出的不是值,而是零!你能告诉我哪里出错了吗?我做错了什么?

谢谢!

 
lVlaxim:

下午好!

  1. 如果我没弄错的话,附件中有一个错别字!在计算 sl 和 tp 变量的 CheckOpenLong 函数说明行中,符号应该相反。
  2. 我对 CheckOpenLong 函数做了如下修改:即它应该只输出最后一棒和上一棒的收盘价、开盘价和 MA 值。因此,如果 EveryTick 的值为假,则一切正常,但如果为真,则输出的不是值,而是零!你能告诉我哪里出错了吗?我做错了什么?

谢谢!

关于第 1 点,感谢您发现错误。它将被修复。

关于第 2 点,有一个与 MQL5 不一致的小问题,已修复。它应该会出现在下一个版本中。

该网站使用cookies。了解有关我们Cookies政策的更多信息。