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

 
doshur:
服务台有什么更新吗?
还没有。
 
angevoyageur:
还没有。

你好。

服务台有什么消息吗?

 
doshur:

你好。

服务台有什么消息吗?

你可以肯定的是,如果我得到答复,我会在这里发布。

个人而言, 还没来 的及 重现这个问题。

 

我的EA生成信号的速度非常慢,今天它做了一笔交易。

在我使用新代码后,手数没有问题,但我不能确认新代码是否有效。

 
doshur:

我的EA生成信号的速度非常慢,今天它做了一笔交易。

在我使用新的代码后,手数没有问题,但是我不能确认新的代码是否有效。

你好,doshur。

服务台还没有回复。然而,你的问题 "困扰 "着我 你能确认你是在真实账户而不是在模拟账户上得到这个双倍交易的问题吗?(我在我的模拟账户上无法重现这个问题)。

另外,通过再次检查你的帖子,我现在注意到这个日志。

关于交易、自动交易系统和测试交易策略的论坛

我的EA做了一个重复输入

(基于订单#40018327)DEAL2 - 第3 个条目

2013.12.20 08:35:01 交易 '800****': exchange buy 0.01 EURUSD at market placed for execution in 331 msDEAL2 - Entry 2

2013.12.20 08:35:01 交易 '800****': 交易#27731691在1.36353买入0.01欧元兑美元完成(基于订单#40018326)DEAL 1 - Entry 3

2013.12.20 08:35:00 交易 '800****': 交易所在市场买入0.01 EURUSDDEAL2 - 第1项

2013.12.20 08:35:00 交易 '800****': exchange buy 0.01 EURUSD at market placed for execution in 313 msDEAL1 - Entry 2

2013.12.20 08:35:00 交易 '800****': exchange buy 0.01 EURUSD at marketDEAL1 - Entry 1

如果我理解正确的话,这证实了问题在于PositionSelect()仍然是假的,而新的头寸正在被打开。事实上,你可以看到,1个交易导致了3个条目,在交易1的第三个条目到达之前(确认新的交易/位置),第二个交易已经开始。

关于使用Sleep()函数的解决方法,我并不满意,因为没有办法知道该使用哪种延迟。当然,这个延迟越大,获得 "双重交易 "的机会就越小,但这仍然是可能的。所以我仍然在寻找一个更好的解决方案。


 
angevoyageur:

关于使用Sleep()函数的解决方法,我并不满意,因为没有办法知道该使用哪种延迟。当然,这个延迟越大,获得 "双重交易 "的机会就越小,但这仍然是可能的。所以我仍然在寻找一个更好的解决方案。

如果我错了,请原谅,因为我刚刚来到这个主题,但看起来这段代码可能是一个比Sleep()更好的解决方法,并将有助于确定问题和真正必要的延迟值。

bool fatalError=false; // atention: declare this as global

....

if (fatalError==false) {
  if (m_Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, LotSize, Price, 0, 0)) {
    Print("Position opened in ", Symbol());
    int maxTimeout=0;
    while (!PositionSelect(Symbol())) {
       Sleep(100);
       maxTimeout++;
       if (maxTimeout>100) {
          Print("### PositionSelect fatal error!");
          fatalError=true;
          break;
       }
    }
    Print("--> PositionSelect delay=",maxTimeout*100);
    break;
  }
}
 
angevoyageur:

你好,doshur。

服务台还没有回复。然而,你的问题 "困扰 "着我 你能确认你是在真实账户而不是在模拟账户上得到这个双倍交易的问题吗?(我在我的模拟账户上无法重现这个问题)。

通过再次检查你的帖子,我现在注意到这个日志。

如果我理解正确,它证实了问题是PositionSelect()仍然是假的,而新的头寸正在打开。事实上,你可以看到,1笔交易产生了3个条目,在交易1的第三个条目到来之前(确认新的交易/位置),第二笔交易已经开始。

关于使用Sleep()函数的解决方法,我不满意,因为没有办法知道使用哪种延迟。当然,这个延迟越大,获得 "双重交易 "的机会就越小,但这仍然是可能的。所以我仍然在寻找一个更好的解决方案。


是的,我使用的是真实账户
又完成了一笔交易。没有重复输入。也许我的新代码有效?
Documentation on MQL5: Standard Constants, Enumerations and Structures / Environment State / Account Properties
Documentation on MQL5: Standard Constants, Enumerations and Structures / Environment State / Account Properties
  • www.mql5.com
Standard Constants, Enumerations and Structures / Environment State / Account Properties - Documentation on MQL5
 
figurelli:

如果我错了,请原谅,因为我刚刚来到这个主题,但看起来这段代码可能是一个比Sleep()更好的解决方法,并将有助于确定问题和真正必要的延迟值。

有趣的想法。我会用它来确定问题,但我不喜欢Sleep()函数 虽然每个人都可以自由选择他的解决方案。

谢谢你。

Documentation on MQL5: Common Functions / Sleep
Documentation on MQL5: Common Functions / Sleep
  • www.mql5.com
Common Functions / Sleep - Documentation on MQL5
 
angevoyageur:

有趣的想法。我将用它来确定问题,但我不喜欢Sleep()函数 虽然每个人都可以自由选择他的解决方案。

谢谢你。

不客气,这个方案只是一个变通,我也不喜欢Sleep,因为你会丢失ticks。也许信号灯/标志或者甚至是状态机会更安全/有效/优雅。
 
figurelli:
不客气,这个方案只是一个变通,我也不喜欢 "睡眠",因为你会损失一些时间。也许信号灯/标志,甚至是状态机会更安全/更有效/更优雅。
我对你的解决方案的测试表明,PositionSelect()在PositionOpen(maxcount=0)之后有时为真,有时为假(maxcount=1)。所以显然有一个延迟。如果有人能在真实账户 上进行测试,那会很有趣。
Documentation on MQL5: Standard Constants, Enumerations and Structures / Environment State / Account Properties
Documentation on MQL5: Standard Constants, Enumerations and Structures / Environment State / Account Properties
  • www.mql5.com
Standard Constants, Enumerations and Structures / Environment State / Account Properties - Documentation on MQL5