需要MT4开发者和程序员的帮助 - 页 3

 
一个固执的专家是一个糟糕的人。
 
Integer:

2.新资料片已完成一半。以前,循环的专家顾问的属性窗口没有打开。现在确实如此,如果现在对参数变化有反应,那就好了。或者,属性窗口可以被关闭,以避免用户的混淆。

正是如此!这就是我想说的,但没有人听到。

服务台 "拒绝了,因为我认为他们根本就不了解情况。以下是请求信息的摘录。

你为什么要告诉一个程序员他能做什么和不能做什么?广播顺利通过,没有出现错误。执行过程中没有错误。用户在输入参数选项卡中看到 "A=5",而系统则给专家顾问 "A=1"。是使用start() 还是while() 循环是一个品味问题。循环不是无限的,正如你所说的那样。如果你仔细观察了专家顾问的文本,它不是while(true),而是while(!IsStopped()&IsConnected()&IsExpertEnabled())。 在以前的MT4版本中,用户不能在Sleep() 函数执行期间改变输入参数的值。在新的建筑中,不再有这种障碍。因此,在这种情况下,要么撤销对改变输入参数的禁令,要么确保它们不是在"输入"标签上改变,而是在计数器上改变。就这样了。


整数:

1.当我安装MetaTrader4终端时,在安装窗口有一个论坛的邀请,这个论坛而不是另一个。

我很抱歉。但我注意到,MT4和MT5之间的界限正在逐渐消失。而正是从我在 "www.mql5.com "上的资料中,我申请到了 "servicedesk"(希望是第一次也是最后一次)。我填写了一个表格,上面清楚地显示你可以选择终端的版本 - 我选择了 "MT4"。

这里是已经关闭的订单的另一个摘录(我不知道他们在自己匆忙关闭订单后是否阅读了订单?)(当然,很有趣,但我只能想到一个关于抓跳蚤的谚语)。

在这种情况下,为什么用户能清楚地看到他们的新值?虽然EA可以全面运作,但这些新的价值是一种虚构的,它们对EA来说是不可用的。RefreshRates() 函数允许EA在任何周期内获得当前报价。为什么不提供一个类似的函数来获取输入参数的更新值,或者在现有的RefreshRates()函数中增加这一功能?

按两次 "自动交易 "按钮(关闭和开启EA)确实打破了这个循环,之后新的数值就会出现,但只有在GRAPHICS SYMBOL上的刻度(新报价)之后才会出现。而且我们不知道它什么时候会来,专家顾问也不禁止处理其他符号,用户不需要这种时间损失。所以我们得到了类似 "回到未来 "的东西。一个新的MT4已经发布。它更现代,更快。他们说,它在屏幕上的速度非常慢,等待一个符号的报价,而其他符号的报价正在如火如荼地进行。也就是说,现在我告诉我的客户:改变参数,按两次 "专家顾问 "按钮来关闭和打开它们,然后在海边等待--总有一天它会 "滴答"。

我以前从来没有求助过,希望以后也不会。反正我迟早会找到绕过 "钩子 "的办法。只要有MT4和它的"策略测试器"存在,情况就一直如此,我现在不想谈这个问题。但当然,任何实时的不准确都是非常严重的事情,特别是对于一个将自己的钱放在线上的用户,有时是相当大的金额。由于我没有看到其他有效的方法来解决这个问题,我求助于 "服务台",说实话,我有点怀疑他们是否会拒绝修复它。嗯...

一切都要 "不顾 "而不是 "感谢",这已经很糟糕了。

 
Integer:
Wex,用一个计时器,你现在可以不用循环了。

你是对的,当然,新的EA的编程方式可以非常不同。但是,有许多已经规划好的EA。而客户不明白为什么他们已经支付了钱的东西突然停止正常工作。

也就是说,已经开发的EA(专家顾问或脚本,甚至指标)与MT4的新版本原则上不兼容,这是一些非常令人不快的趋势。

而且我在编程中没有使用过任何非标准的东西,这是一个原则问题。我的EA是完全基于MQL4 BOMB的特点和功能。我已经被许多指标和EA淹没了(大多数是复杂的或所谓的 "多货币的"),它们要么在新版MT4上完全不能工作,要么看起来工作正常,但出现了我的例子中的情况。(至于翻译错误,我注意到,例如,名称为 "新 "的变量--我理解--因为保留字列表的扩大)。

 

一个人太懒了,懒得去读文档。其余的人显示他们非常聪明...吁!

抓住代码 :)

我仍然不知道你的问题是什么。

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright     "Grizzly_v :)"
#property link          "http://www.mql5.com"
//+------------------------------------------------------------------+
extern int      A1=      1;
extern int      A2=      2;
int      C1,C2;
//+------------------------------------------------------------------+
int OnInit(){
   C1=A1;
   C2=A2;
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason){
   Comment("");
}
//+------------------------------------------------------------------+
void OnTick(){
   string   t;

   t=TimeToStr(TimeCurrent(),TIME_MINUTES|TIME_SECONDS);
   Comment(t+"\nA1="+A1+"   A2="+A2+"\nC1="+C1+"   C2="+C2);
}
//+------------------------------------------------------------------+
 
grizzly_v:

一个人太懒了,懒得去读文档。其余的人显示他们非常聪明...吁!

抓住代码 :)

我仍然不知道你的问题是什么。

问题是,专家顾问是循环的,所以OnTick事件不会发生在它身上,它不会看到改变的参数。
 

好吧,那就这样吧。同样的周期只通过新的功能。

  extern int      A1=      1;
  extern int      A2=      2;
         int      C1,C2;
//+------------------------------------------------------------------+
int OnInit(){
   C1=A1;
   C2=A2;
   EventSetMillisecondTimer(100);
   return(0);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason){
   EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTimer(){
   string   t;
   RefreshRates();
   t=TimeToStr(TimeCurrent(),TIME_MINUTES|TIME_SECONDS);
   Comment(t+"\nA1="+A1+"   A2="+A2+"\nC1="+C1+"   C2="+C2);
}
//+------------------------------------------------------------------+
 
stringo:

1.看看Wex的资料。这是一个专业的MQL4开发者。装傻充愣。或者说是扯皮。我不知道为什么。

2.我们需要思考这个问题。当新的参数到来时,你不能强行中断循环。类似IsNewParameter的函数,应该由程序员自己在无尽循环中调用。

1.我也注意到了这个奇怪的现象...

2.这将是非常好的。

 
stringo:

1.看看Wex的资料。这是一个专业的MQL4开发者。装傻充愣。或者说是扯皮。目前还不清楚原因。

2.这就是我们需要思考的地方。我们不能在新参数到来时强行中断循环。类似IsNewParameter的函数,应该由程序员自己在无尽循环中调用。

斯特林格。

变量似乎就没有进入这样一个永恒的循环。当值被改变时,init方法不起作用。而外部变量只通过init传递。现在可以在专家顾问系统中使用OnTick和OnTimer 函数。

OnChartEvent.在我的记忆中,专家顾问的启动功能是在一个新的刻度线上触发的。

摘自文件。

该程序只接收来自它所启动的图表的事件。所有的事件都按照收到的顺序一个接一个地处理。如果队列中已经有一个事件NewTick,或者该事件处于处理状态,一个新的事件NewTick不会被放入mql4-程序的队列中。同样,如果mql4-程序的队列已经包含了ChartEvent 事件或者这样的事件正在被处理,那么这种类型的新事件将不会被放入队列中。计时器事件按照同样的方案处理--如果队列中存在或已经有一个计时器 事件,那么这种类型的新事件将不会被放入队列中。

因此,由于启动函数无限循环,当一个新的事件发生时,该函数将不会启动,其内部的变量也不会被更新。

只有一个办法,使用语言的新功能,而不去管旧功能。

События клиентского терминала - Документация на MQL4
  • docs.mql4.com
События клиентского терминала - Документация на MQL4
 
artmedia70:

1.注意到了 这个奇怪的现象...

而在别人的眼里,你总是可以看到哪怕是一根稻草。而一个人眼中的木头越多,可以辨别出的稻草就越小。

在任何业务中,最重要的是结果,而不是过程。结果是这样的:黑色被呈现为白色--字面意思--而不是比喻--执行系统向用户显示了另一个数值而不是一个。这是在哪里做的--在某个函数内,还是在函数外--并不重要。一个实时多任务系统能够同时处理几个进程。在这个过程中,Sleep() 函数大部分时间都在 "运行",根本不消耗任何系统资源。这是经典的东西,基本上是用来暂停进程的。所有其他进程可以不受阻碍地运行。

- 同志们,我们能按102%的比例完成计划吗?

- ...是的,我们可以。