来自一个 "傻瓜 "的问题 - 页 7

 
kPVT:

我有一个专家,我试图用它来处理事件。

我得到的事件与行动并不对应。

完全匹配点击图表和点击按钮的行为

一个有争议的事件id=9(CHARTEVENT_CUSTOM) 它是在例如图表移位和有大约10个类似事件时产生的

没有检查CHARTEVENT_OBJECT_ENDEDIT 事件。

其他的都不清楚。在手动创建对象时,要么描述与事件编号不匹配,要么创建对象的事件被错误地生成。

总而言之,请大家帮忙。

如果你这样走会更好。

//+------------------------------------------------------------------+
//| Expert chart event function                                      |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // идентификатор события  
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam) // параметр события типа string
  {
   string str_id="";
   switch(id)
     {
      case CHARTEVENT_KEYDOWN:          str_id="KEYDOWN";        break;
      case CHARTEVENT_OBJECT_CREATE:  str_id="OBJECT_CREATE";  break;
      case CHARTEVENT_OBJECT_CHANGE:  str_id="OBJECT_CHANGE";  break;
      case CHARTEVENT_OBJECT_DELETE:  str_id="OBJECT_DELETE";  break;
      case CHARTEVENT_CLICK:            str_id="CLICK";          break;
      case CHARTEVENT_OBJECT_CLICK:      str_id="OBJECT_CLICK";   break;
      case CHARTEVENT_OBJECT_DRAG:       str_id="OBJECT_DRAG";    break;
      case CHARTEVENT_OBJECT_ENDEDIT:    str_id="OBJECT_ENDEDIT"; break;
      case CHARTEVENT_CHART_CHANGE:      str_id="CHART_CHANGE";   break;
      default:
         if(id>CHARTEVENT_CUSTOM)       str_id="CUSTOM+"+IntegerToString(id-CHARTEVENT_CUSTOM);
         else                         str_id="UNKNOWN";
     }
//--- для отладки
   printf("ChartEvent :id=%s, l=%d d=%f s=%s",str_id,lparam,dparam,sparam);
//---
   ExtExpertPrg.ChartEvent(id,lparam,dparam,sparam);
  }
 

我可能做错了什么,但我会试着更详细地描述为什么我有一个误解。

AlexSTAL:

你最初为已经分配的数字常数CHARTEVENT_XXXXXXXXX分配数字对应关系。

我在哪里可以看到CHARTEVENT_XXXXXXXXX常数的数值?

我找不到,所以我做了实验,发现CHARTEVENT_KEYDOWN =0CHARTEVENT_CLICK =4,这与帮助中对这些常数的描述顺序 相一致。

我已经相应地给其他事件分配了数字,所以有一个数组event[10]。

罗什

不幸的是,我不明白你的问题。究竟是什么出了问题?

根据我对事件的编号,并使用我之前帖子中的专家顾问。

例如,我画了一条趋势线->事件CHARTEVENT_OBJECT_CHANGE

移动这一行 -> 事件CHARTEVENT_OBJECT_CHANGE

通过菜单改变属性 -> 2个事件CHARTEVENT_CHART_CHANGE CHARTEVENT_CUSTOM

按Del键->只发生CHARTEVENT_KEYDOWN 事件来删除它,(如果事件编号有误,应该仍有2个事件,删除和按下按钮)

所有这些都是基于我的编号。

下一步...

我正在使用一个专家顾问

绘制趋势线 -> ChartEvent :id=OBJECT_DRAG, l=0 d=0.000000 s=H1趋势线 40716

移动此线 -> ChartEvent :id=OBJECT_DRAG, l=0 d=0.000000 s=H1趋势线 40716

我通过菜单->ChartEvent :id=OBJECT_CHANGE, l=0 d=0.000000 s=H1 Trendline 40716和ChartEvent :id=CHART_CHANGE, l=0 d=0.000000 s=.

我按Del键删除它 -> ChartEvent :id=KEYDOWN, l=46 d=0.000000 s=

这种情况还没有得到澄清。

以防万一。

MT5 64x - build 458。

系统是W7 64x Home Extended。

谢谢你的回应))。




Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика - Документация по MQL5
 
kPVT:

我可能做错了什么,但我会试着更详细地描述我产生误解的原因。

我在哪里可以找到CHARTEVENT_XXXXXXX常数的数值?

我找不到,所以我做了实验,发现CHARTEVENT_KEYDOWN =0CHARTEVENT_CLICK =4,这与帮助中对这些常数的描述顺序 相一致。

我给其余的事件相应的编号,这就是数组事件[10]的结果。

绝不能以任何方式这样做!

数值是由开发者指定的,可以在任何时候改变。

只能使用字符常数

--------------

uncleVic 给了你一个正确用法的例子(或我的帮助片段)。

--------------

你在做什么?为什么你需要一个数字表示?

 
AlexSTAL:

在任何情况下都不能这样做。

数值是由开发者指定的,可以在任何时候改变。

只能使用字符常数

好的。我同意你一定不要这样做。

忘了我的手艺吧)。

继续前进...

AlexSTAL

UncleVic 给了你一个正确使用的例子(好吧,或者说是我的一片帮助)。

正如我在上面写的,使用uncleVic的 例子,你也会得到不符合行动的事件。

kPVT

绘制趋势线 -> ChartEvent :id=OBJECT_DRAG, l=0 d=0.000000 s=H1 趋势线 40716 而不是CHARTEVENT_OBJECT_CREATE

.....

按Del->ChartEvent :id=KEYDOWN, l=46 d=0.000000 s=而不是CHARTEVENT_OBJECT_DELETE,然后再 CHARTEVENT_KEYDOWN 来删除它。

AlexSTAL

你在做什么?为什么你需要一个数字表示?

这是个很长的解释,而且这并不重要。让我们忘记我的编号。

最主要的是,我试图让事件变得有意义,但即使使用uncleVic的 例子,我也不明白产生的事件和执行的动作之间的不一致。

 
kPVT:

好的。我同意,你不能这样做。

忘掉我的手忙脚乱吧)。

继续前进...

正如我在上面写的,使用uncleVic的 例子,你也会得到不符合行动的事件。

kPVT


把它添加到初始化中。

   ChartSetInteger(0, CHART_EVENT_OBJECT_CREATE, true);
   ChartSetInteger(0, CHART_EVENT_OBJECT_DELETE, true);

你会没事的。

Создание:
DS      0       _err (EURUSD,M30)       17:13:18        ChartEvent :id=OBJECT_CREATE, l=0 d=0.000000 s=M30 Horizontal Line 58241
DG      0       _err (EURUSD,M30)       17:13:18        ChartEvent :id=OBJECT_DRAG, l=0 d=0.000000 s=M30 Horizontal Line 58241
Удаление кл. Del:
EH      0       _err (EURUSD,M30)       17:13:21        ChartEvent :id=OBJECT_DELETE, l=0 d=0.000000 s=M30 Horizontal Line 58241
QD      0       _err (EURUSD,M30)       17:13:21        ChartEvent :id=KEYDOWN, l=46 d=0.000000 s=
 

亚历克斯非常感谢你把它整理出来了。

AlexSTAL:

添加到初始化中。

....

添加到专家区块

void OnInit()
{
 ChartSetInteger(0, CHART_EVENT_OBJECT_CREATE, true);
 ChartSetInteger(0, CHART_EVENT_OBJECT_DELETE, true);
}

一切都在它的位置上。

看了一下帮助,没有任何地方写到这两个事件需要被 "初始化 "以获得所有其他事件的正确性。

我把它们注释出来,一切都正常了。

事实证明,如果专家顾问/指示器没有OnInit 块,它就会把事件搞乱。

也许是这个想法,但是mql5的程序员应该知道它,以防万一。

 
我在Wizard中生成了一个Expert Advisor,但是测试器生成的Core 1测试器因为OnInit临界错误而停止,有人遇到过这种情况吗? 如何解决? 毕竟,Wizard,OK,我在那里会犯错误...
 
Europa:
我在Wizard中生成了一个Expert Advisor,但测试器给出的错误是Core 1测试器因OnInit关键错误而停止,有人遇到过这种情况吗? 如何解决? 毕竟Wizard,我在那里会搞砸一些事情...
请附上源代码。和测试参数。
 
uncleVic:
附上产生的源代码。和测试参数。
附加的文件:
TheFirst.mq5  7 kb
 
Europa:

它没有重现。

我要求提供更多的测试参数。我做到了。

MT5的版本和比特率都是如此。