void open_sell(double xlot, int xTP)
{
MqlTradeRequest mrequest;
MqlTick latest_price;
MqlTradeResult mresult;
if(!SymbolInfoTick(Symbol(),latest_price))
{
Alert("Error getting the latest price quote - error:",GetLastError(),"!!");
return;
}
ZeroMemory(mrequest);
mrequest.action=TRADE_ACTION_DEAL; // immediate order execution
mrequest.price = NormalizeDouble(latest_price.bid,Digits()); // latest Bid priceif (StopLoss!=0) mrequest.sl = NormalizeDouble(latest_price.bid + StopLoss*point,Digits()); // Stop Lossif (xTP!=0) mrequest.tp = NormalizeDouble(latest_price.bid - xTP*point,Digits()); // Take Profit
mrequest.symbol = Symbol(); // currency pair
mrequest.volume = xlot; // number of lots to trade
mrequest.magic = EA_Magic; // Order Magic Number
mrequest.type= ORDER_TYPE_SELL; // Sell Order
mrequest.type_filling = ORDER_FILLING_FOK; // Order execution type
mrequest.deviation=100; // Deviation from current price//--- send orderOrderSend(mrequest,mresult);
// get the result codeif(mresult.retcode==10009 || mresult.retcode==10008) //Request is completed or order placed
{
// Print("A Sell order has been successfully placed with Ticket#:",mresult.order,"!!");
}
else
{
Print("The Sell order request could not be completed -error:",GetLastError());
ResetLastError();
return;
}
}
mrequest.action = TRADE_ACTION_DEAL; // immediate order execution stoploss en takeprofit worden aangepast
mrequest.price = NormalizeDouble(Latest_Price.ask, Digits()); // latest ask price
mrequest.symbol = Symbol(); // currency pair
mrequest.volume = dTradePosition_Size; // number of lots to trade
mrequest.magic = EA_Magic_Number; // Order Magic Number
mrequest.type = ORDER_TYPE_BUY; // Buy Order
mrequest.type_filling = ORDER_FILLING_RETURN; // Order execution type
mrequest.deviation = 1000; // Max prijs afwijkingOrderSend(mrequest,mresult); //--- send order
我强烈地感觉到,当我们使用cTrade和MqlTradeRequest 的方式时,没有任何区别,睡眠功能应该有助于延迟一切,使我们的客户端在PositionSelect()再次运行之前得到 "更新",从而导致重复输入。从我的日志标签检查, >2013.12.20 08:35:00Trades'800****': exchange buy 0.01 EURUSD at market placed for execution in 313 ms <
天啊。所以睡眠也没有帮助?
这对我有帮助。我使用了snelle_modas的提示加上睡眠。这就成功了。
但从那时起,我修改了交易的打开方式。现在我不需要这两种解决方案了。以下是我昨天写给angevoyageur的内容。我希望它能有所帮助。
你好。
上次我解决了这个问题,是在交易后使用睡眠功能。但在我的新机器人中,不再需要这个了。也许这是因为现在打开交易的处理方式不同。我遇到这个问题的第一个机器人(也许其他EA也有这种开仓方式,这就是为什么也有这个问题(如metaquant))使用这种方法。
现在我按照我从文件中学到的方法开单,不再有这个问题了。
也许这有帮助。我看到doshur像我一样使用类似的方式开顶交易,当它造成这种行为时。
好心的问候所以,ctrade类有问题?
我只能说,在删除ctrade类之后,我不再有这个问题了。
你可能想创建第二个版本的EA,使用 "老式 "的开仓方式,看看是否有帮助。
另一方面,睡眠功能 确实也为我解决了这个问题。
那就是ctrade类有问题了?
我只能说,在删除ctrade类之后,我不再有这个问题了。
你可能想创建第二个版本的EA,使用 "老式 "的开仓交易方式,看看是否有帮助。
另一方面,睡眠功能 也确实为我解决了这个问题。
这是一个有趣的观点。
我使用ctrade类来调整止损值。
开仓本身是通过使用 "老式 "的方式完成的。
有没有可能在我调整止损单的时候,ctrade类送来了一个新的双倍订单?这似乎很奇怪。
我只能说,在删除ctrade类之后,我不再有这个问题了。
你可能想创建第二个版本的EA,使用 "老式 "的开仓方式,看看是否有帮助。
另一方面,睡眠功能 也确实为我解决了这个问题。
这是个好问题。也许我应该只使用投标价格的变化。
图表上的BAR也是基于BID价格的?
对于我的EA的触发信号,我只对1分钟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应该是安全的?
你怎么看?
Snelle_moda 你使用mqltraderequest 发送订单时还会出现重复输入吗?
自03-10-2013以来,我又有一次重复输入。我使用两种方法发送我的订单。见我之前的帖子。