我强烈地感觉到,当我们使用cTrade和MqlTradeRequest 的方式时,没有任何区别,睡眠功能应该有助于延迟一切,使我们的客户端在PositionSelect()再次运行之前得到 "更新",从而导致重复输入。从我的日志标签检查, >2013.12.20 08:35:00Trades'800****': exchange buy 0.01 EURUSD at market placed for execution in 313 ms <
I think the problem is the (to slow) execution of the PositionSelect(Symbol()) function. Maybe, the new ticks come in so fast, the EA sends in a new order before it receives a response of the PositionSelect(Symbol()). So the current position size is not calculated properly. In my code, its theoretically impossible to send in a new/double order if the current position size is equal or greater than the max allowed position size, see code.
//-------------------------------------------------- Check for new bar staticdatetime OldTime;
datetime NewTime[1];
bool newBar=false;
int copied=CopyTime(Symbol(),Period(),0,1,NewTime);
if (copied>0)
{
if (OldTime != NewTime[0])
{
newBar=true;
OldTime=NewTime[0];
}
}
else
{
Print("Error in copying historical times data, error =",GetLastError());
ResetLastError();
return;
}
if(newBar==false) return;
//-------------------------------------------------- Check for new bar
我可以问一下PositionSelect()是检查客户端还是服务器端吗?
我有一种强烈的感觉,这个问题是由服务器(经纪商)正在处理请求而没有更新客户端的延迟造成的,这就是为什么PositionSelect()会再次运行的原因。
我强烈地感觉到,当我们使用cTrade和MqlTradeRequest 的方式时,没有任何区别,睡眠功能应该有助于延迟一切,使我们的客户端在PositionSelect()再次运行之前得到 "更新",从而导致重复输入。从我的日志标签检查, >2013.12.20 08:35:00 Trades '800****': exchange buy 0.01 EURUSD at market placed for execution in 313 ms <
把睡眠超过400应该是安全的?
你怎么看?
"我有一种强烈的感觉,这个问题是由服务器(经纪商)处理请求而没有更新客户端的延迟造成的,这就是为什么PositionSelect()再次运行的原因"
我也认为这就是重复输入的原因。在我的代码中,如果当前头寸大小等于或大于允许的最大头寸大小,理论上是不可能发送新订单的,所以当PositionSelect()没有及时收到当前头寸的状态时,我的EA会再次发送新订单。
"把睡眠超过400应该是安全的吗?"?
时间间隔越大越好,但有一个问题。如果你分两步调转你的头寸(长线转短线或短线转长线),这个额外的时间延迟可能是导致执行价格不佳的原因,特别是在宏观经济事件期间。
"我有一种强烈的感觉,这个问题是由服务器(经纪方)处理请求而没有更新客户端的延迟造成的,这就是为什么PositionSelect()会再次运行"
我也认为这就是重复输入的原因。在我的代码中,如果当前头寸大小等于或大于允许的最大头寸大小,理论上是不可能发送新订单的,所以当PositionSelect()没有及时收到当前头寸的状态时,我的EA会再次发送新订单。
"把睡眠时间超过400应该是安全的?
时间间隔越大越好,但有一个问题。如果你分两步调转你的头寸(长线转短线或短线转长线),这个额外的时间延迟可能是导致执行价格不佳的原因,特别是在宏观经济事件期间。
我不知道经纪人是否在这里发挥了作用,但似乎我们的经纪人是一样的。阿尔帕里。
自2013年3月10日以来,我又有一次重复输入。我使用两种方法发送我的订单。见我以前的帖子。
这是我刚刚实施的,希望能解决这个问题。
这是我刚刚实施的,希望能解决这个问题。
我认为找到这个问题背后的原因是非常重要的,当然,在我们能够完全理解发生了什么之前,有一个变通的办法也是非常重要的(睡眠?所以我试着恢复一下情况。
我同意snella_moda的观点,最好的解释是。
I think the problem is the (to slow) execution of the PositionSelect(Symbol()) function. Maybe, the new ticks come in so fast, the EA sends in a new order before it receives a response of the PositionSelect(Symbol()). So the current position size is not calculated properly. In my code, its theoretically impossible to send in a new/double order if the current position size is equal or greater than the max allowed position size, see code.
但这很难检查。
我认为最好的办法是征求Metaquotes的意见。我将尝试这样做。
关于 "每个tick "的那一行可能是它不再发生的原因。
该函数 只在新的条形图出现时执行。因此,最可能的是,只有条形图的第一个刻度可以执行交易。在第一个条形图之后,代码得到一个 "返回",直到新条形图出现。也许这对我来说已经解决了问题。
我认为这段代码来自文章。
关于"每个tick " 的那一行可能是它不再发生的原因。
只有当一个新的柱状体出现时,该函数才会被执行。因此,最有可能的是,只有条形图的第一个刻度可以执行交易。在第一个条形图之后,代码得到一个 "返回",直到新条形图出现。也许这对我来说已经解决了问题。
我认为这段代码是来自文章。
更正。有一个双倍的"Position opened in... "和2个交易已经被打开。