我的EA做了一个重复输入 - 页 10

 
angevoyageur: 我不确定我是否理解你的意思。我们在这个话题中讨论的这个问题不是由糟糕的编码造成的,而是由mql5中糟糕的设计造成的(这是我的观点,也可能只是一个错误?)你说的 "多个交易线程 "是什么意思?

我回去重读了你认为不好的设计

在old-mt4中,这些 是不存在的。检查Successful_Orders的正常方法是Ticket#==(-1) && GetLastError()。我从来没有见过这样的情况:你的订单返回一个有效的Ticket#并且GLE=0,但是在下一个tick,你的OrdersTotal()仍然返回0。

现在请记住,我还没有看完整个mql5的文档。但是,如果它说PositionSelect_Information直到后来才会被更新。而有人在使用PositionSelect来评估他们的进入逻辑。那么这个人必须等到PositionSelect_Information被更新后再退出OrderSend逻辑。

对于线程的事情...我说的是多线程与单线程发送订单的问题。就像同时打开的订单一样。它可能与这里有关,也可能无关。

 
Ubzen:

我回去重读了你认为不好的设计

在old-mt4内,这些 不存在。在内部检查Successful_Orders的正常方法是Ticket#==(-1) && GetLastError()。我从来没有见过这样的情况:你的订单返回一个有效的Ticket#并且GLE=0,但是在下一个tick时,你的OrdersTotal()仍然返回0。

现在请记住,我还没有看完整个mql5的文档。但是,如果它说PositionSelect_Information直到后来才会被更新。而有人在使用PositionSelect来评估他们的进入逻辑。那么这个人必须等到PositionSelect_Information被更新后再退出OrderSend逻辑。

对于线程的事情...我说的是多线程与单线程发送订单的问题。就像同时打开的订单一样。它可能与此有关,也可能与此无关。

关于PositionSelect的文件 并没有说什么 "以后才会更新"。 它只是说,即使PositionSelect是真的,关于Position的信息也可能是过时的,这与你的问题没有关系。

我会开市 时花 时间 做一些 测试 ,以确保 不说 傻话,以后会有更完整的答案。

 
angevoyageur:

关于PositionSelect的文档 并没有说什么 "以后才会更新"。 它只是说,即使PositionSelect是真的,关于Position的信息也可能是过时的,这与你的问题无关。

我会开市 时花 时间 做一些 测试 ,以确保 不说 傻话,以后会有更完整的答案。

K.....,另外,如果文件中没有说什么,那么我完全同意你的观点。

我们最终要问服务台的问题是 "为什么当trade.PositionOpen()==true时不能更新Position_Information?"

他们可能会给我们一个很好的答案

 
angevoyageur:

不,我只是在想这个问题......如果所有相关的人就这个问题向ServiceDesk写一张票,可能会很有用。但是我非常怀疑MQ是否愿意改变这种设计。但我们可以试试。

人们可以写信给ServiceDesk,并在这里报告票号。我的是

错误MetaTrader 5 MQL打开开始。2013.12.23 19:08,#916435


我也已经通知服务台,#933192|2014.01.19 14:44

 

MQ实际上可以很容易地重新设计,使之具有超时功能

比如没有回应,那么我们就会得到一个错误,类似这样的东西?

 
doshur:

MQ实际上可以很容易地重新设计,使之具有超时功能?

比如没有回应,那么我们就会得到一个错误,类似这样的东西?


他们恰恰做了相反的事情。当mql5创建的时候,对于PositionSelect这样的函数,有一个超时参数

但是他们后来删除了它,见这里的第9点https://www.mql5.com/en/forum/53/page5#comment_14479

 

我同意设计不良的论点,但在我看来,MQL5的主要问题是将一个成功的基于外汇的代码适应于股票市场(这确实是个好东西)。

例如,一些股票市场使用FIX协议作为标准,而对我来说,这种通信协议不容易适应任何代码或架构。

无论如何,我相信MQ的人有一个时间挑战,他们必须在MQL4的基础上创建MQL5,而不是从头开始。我记得那年的锦标赛被暂停,以便他们有更多的时间。

所以,也许这个话题可以为未来的 MQL6和真正的新架构提供一个很好的建议,主要是关于交易的弹性和不可知的解决方案,以在任何市场上工作。

 
doshur:

MQ实际上可以很容易地重新设计,使之具有超时功能?

比如没有回应,那么我们就会得到一个错误,类似这样的东西?

传统上,超时并不意味着该订单不会成为一个头寸。你将不得不等待很长一段时间......检查它是否真的成为头寸......如果订单没有被执行,最终将暂停交易。

我想MQ会同意figurelli 的观点,即这是一个程序员的错误。因为trade.PositionOpen所依据的函数 明确指出,你需要检查其他东西。


******(添加个人议程......你可以在这一点上停止阅读) *******

这就是我在mql_forum上帮助新的程序员时,不追问他们关于函数及其返回值的原因。我认为没有必要说总是做以下事情。

if( OrderSend()<0 ){ Print( GetLastError() ); }

这应该是一个自动交易商......你可能不在......而它所做的是Print()?

在我看来,Error_Handling和Error_Reporting是两个完全不同的怪物。试图解释处理错误的正确方法可能需要几页纸,而且对于交易者来说,他们应该重试多少次,甚至是否应该终止交易都是非常个人化的。

**** 现在我并不是说如果一个新手正在编写EA,而它在交易中出现了问题......他们不应该Print( GetLastError(); ) <- 这应该是很明显的。但如果我要告诉他们总是Get_Error,那么我也应该告诉他们总是Handle_Error。*** 议程结束。****

 
angevoyageur:


他们做了完全相反的事情。当mql5被创建的时候,对于PositionSelect这样的函数有一个超时参数

但是他们后来删除了它,见这里的第9点https://www.mql5.com/en/forum/53/page5#comment_14479

是时候恢复它了吗?
 
doshur:
是时候恢复它了吗?

我不这么认为。一个同步的交易请求必须在所有方面都是同步的。就这么简单。

这里的请求是同步的,但你必须要管理异步的东西。而这一点没有任何记录。