EA混合买入和卖出订单 - 页 3

 
WHRoeder:

int OrderType = OrderType() 是不行的,一个可能隐藏了另一个(局部声明隐藏了全局,没有错误。

int orderType = OrderType()

原来的代码是 . . .

int orderType;
   for(cnt = total-1; cnt >= 0; cnt--)
   {
      while (!OrderSelect(cnt, SELECT_BY_POS)) {Sleep(500);}
      orderType = OrderType();

. . .这实际上与你的建议是一样的?

我想dvarrin 是说他的问题在于他的票号。

 

不是这样的。

在循环外声明的订单类型 将有效地将订单类型的值转移到下一个循环,即使发生错误,该值将进入下一个条件。

如果你在循环内声明,立即设置OrderType()的值,就不会有这样的错误。

(也许这不是OP的问题,但它可能会阻止其他问题的发生)不尝试一下有什么用?

另外,半秒的睡眠时间有点过了。循环的时候,10毫秒的睡眠定时器应该是很好的,不会对你的cpu负载造成任何影响(好吧,几乎是:P)

 
forexCoder:

不是这样的。

在循环外声明的订单类型将有效地将订单类型的值转移到下一个循环,即使发生错误,该值将进入下一个条件。

如果你在循环内声明,立即设置OrderType()的值,就不会有这样的错误。

(也许这不是OP的问题,但它可能会阻止其他人的发生)不尝试一下有什么用?

另外,半秒的睡眠时间有点过了。循环的时候,10毫秒的睡眠定时器应该是没有问题的,不会对你的cpu负载造成任何影响(好吧,几乎是:P)


我怀疑这个问题是在向前测试EA时使用了 "要求手动确认",但我不明白到底发生了什么。

我所知道的是,一个名为OrderType的变量不可能干扰一个同名的方法,而且声明的位置也与我的问题没有关系。

问题是OrderTicket()、OrderStoploss()......在使用OrderSelect() 之后,没有给出同一个订单的数据。

如果我使用本地变量并在调用OrderSelect()后设置这些变量,就能正常工作,但如果我直接使用OrderTicket()或OrderStoploss(),就会给出错误的值。


为什么在我的代码中,OrderStopLoss()在 "for "循环的同一迭代中返回其他订单的止损值?

 

以下是该EA的完整代码。

问题出在updateFbOrders()方法的第一个 "for "循环中。

为了测试它,我在图表上添加了鳄鱼和分形指标,并找到了最后一个上升分形在鳄鱼线以上,最后一个下降分形在鳄鱼线以下的图表。

然后,它应该创建买入和卖出挂单。如果有一个分形被突破,它将立即开出一个订单。

然后它将在每次分形变化时修改每个订单的止损,但它为错误的订单设置止损。

检查警报窗口,寻找类似这样的信息。计数。1 买入订单的止损1.41008000。46454014 orderType:5,如果你检查46454014号订单,你会发现它实际上是一个 "卖出 "订单。即使止损没有改变,它也会继续修改订单,这是因为它采取了错误的止损水平
附加的文件:
 

这很愚蠢。你不是在粘贴整个代码。

你有一个

areBuyOrdersInProfitAt

函数,我们在里面没有看到,请粘贴它。现在看来,你很可能在其他地方犯了错误。你是否在其他地方使用了OrderSelect函数?

另外,你在哪里设置longSL和shortSL变量?请把这部分的代码也粘贴出来。

编辑:我在打字的时候你已经粘贴了,现在看新的帖子。

 
forexCoder:

这很愚蠢。你不是在粘贴整个代码。

你有一个

areBuyOrdersInProfitAt

函数,我们在里面没有看到,请粘贴它。现在看来,你很可能在其他地方犯了错误。你是否在其他地方使用了OrderSelect函数?

另外,你在哪里设置longSL和shortSL变量?请把这部分的代码也粘贴出来。

编辑:我在打字的时候你已经粘贴了,现在看新的帖子。

嗨,forexCoder

我已经把EA添加到前一个帖子中。


但我认为你已经指出了问题所在:我在 "areBuyOrdersInProfitAt "方法中使用了OrderSelect()。 :-)))))))))))

 

是的,和我想的一样。

areBuyOrdersInProfitAt包含另一个OrderSelect函数,它覆盖了原始片段中的那个函数的作用。当这个areBuyOrdersInProfitAt函数返回时,OrderSelect被改变,票据也被改变。在这种情况下,你应该总是在这里得到列表中的最后一个订单。

 

一旦你开始在一个for循环中使用OrderSelect,浏览所有的订单,你就不能在里面再创建一个OrderSelect for循环,因为当第二个循环返回时,你将使用交易池中最后一个订单的票。

你的代码很冗长,所以我不太愿意纠正它(抱歉:P),但你现在有了一个正确方向的指针。

 
dvarrin:

但我认为你已经指出了问题所在:我在 "areBuyOrdersInProfitAt "方法中使用了OrderSelect()。 :-)))))))))))

很高兴听到你正在解决这个问题的路上。)
 
RaptorUK:
很高兴听到你正在解决的路上。)
非常感谢大家。这真的是我犯的一个愚蠢的错误 :-( )