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

 
doshur:
天啊。所以睡眠也没有帮助?

我们可以做什么来避免这种情况?

这对我有帮助。我使用了snelle_modas的提示加上睡眠。这就成功了。

但从那时起,我修改了交易的打开方式。现在我不需要这两种解决方案了。以下是我昨天写给angevoyageur的内容。我希望它能有所帮助。

你好。

上次我解决了这个问题,是在交易后使用睡眠功能。但在我的新机器人中,不再需要这个了。也许这是因为现在打开交易的处理方式不同。我遇到这个问题的第一个机器人(也许其他EA也有这种开仓方式,这就是为什么也有这个问题(如metaquant))使用这种方法。

void SetOrder(ENUM_ORDER_TYPE type, double lot)
{
   int ticket = -1;
   ResetLastError();
   double price = 0;
   double ask, bid;
   ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
   bid = SymbolInfoDouble(Symbol(), SYMBOL_BID);
   if (maxSpread != 0 && NormalizeDouble(ask - bid, _Digits) >= NormalizeDouble(maxSpread * point, _Digits)) return; 
   if (type == ORDER_TYPE_BUY) price = ask;
   if (type == ORDER_TYPE_SELL) price = bid;
   trade.PositionOpen(Symbol(), type, lot, price, 0, 0, "");
   Sleep(1000);
   int err = GetLastError();
   if (err > 0) Print(ErrorDescription(err));
}


现在我按照我从文件中学到的方法开单,不再有这个问题了。

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 price
         if (StopLoss!=0) mrequest.sl = NormalizeDouble(latest_price.bid + StopLoss*point,Digits()); // Stop Loss
         if (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 order
         OrderSend(mrequest,mresult);
         // get the result code
         if(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;
           }
}


也许这有帮助。我看到doshur像我一样使用类似的方式开顶交易,当它造成这种行为时。

好心的问候
 
所以,ctrade 类有问题?

在我修改代码之前,谁能确认这一点?
 
doshur:
所以,ctrade类有问题?

在我修改代码之前,谁能确认这一点?

我只能说,在删除ctrade类之后,我不再有这个问题了。

你可能想创建第二个版本的EA,使用 "老式 "的开仓方式,看看是否有帮助。


另一方面,睡眠功能 确实也为我解决了这个问题。

Documentation on MQL5: Common Functions / Sleep
Documentation on MQL5: Common Functions / Sleep
  • www.mql5.com
Common Functions / Sleep - Documentation on MQL5
 
doshur:
那就是ctrade类有问题了?

在我修改代码之前,谁能确认这一点?
请耐心等待,我将尽快回答你。我将尝试在市场开放时重现这个问题。
 
我不知道经纪人是否在这里发挥了作用,但似乎我们的经纪人是一样的。阿尔帕里。

如果需要,请删除 经纪人的名字。
 
Klammeraffe:

我只能说,在删除ctrade类之后,我不再有这个问题了。

你可能想创建第二个版本的EA,使用 "老式 "的开仓交易方式,看看是否有帮助。


另一方面,睡眠功能 也确实为我解决了这个问题。

这是一个有趣的观点。

我使用ctrade类来调整止损值。

      
My_Trade.PositionModify(Symbol(), 
                        NormalizeDouble(dPositionStoploss,   Digits()), 
                        NormalizeDouble(dPositionTakeProfit, Digits())
                        ); 


开仓本身是通过使用 "老式 "的方式完成的。

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 afwijking                                                                                                        OrderSend(mrequest,mresult); //--- send order

有没有可能在我调整止损单的时候,ctrade类送来了一个新的双倍订单?这似乎很奇怪。

 
Klammeraffe:

我只能说,在删除ctrade类之后,我不再有这个问题了。

你可能想创建第二个版本的EA,使用 "老式 "的开仓方式,看看是否有帮助。


另一方面,睡眠功能 也确实为我解决了这个问题。

如果你研究一下ctrade类。使用这个类与mqltraderequest方式有什么区别吗?
 
snelle_moda:

这是个好问题。也许我应该只使用投标价格的变化。

图表上的BAR也是基于BID价格的?


对于我的EA的触发信号,我只对1分钟BAR所依据的价格变化感兴趣。

Snelle_moda 你使用mqltraderequest 发送订单时还会出现重复输入吗?
Documentation on MQL5: Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure
Documentation on MQL5: Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure
  • www.mql5.com
Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure - Documentation on MQL5
 

我可以问一下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应该是安全的?

你怎么看?

Documentation on MQL5: Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure
Documentation on MQL5: Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure
  • www.mql5.com
Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure - Documentation on MQL5
 
doshur:
Snelle_moda 你使用mqltraderequest 发送订单时还会出现重复输入吗?


自03-10-2013以来,我又有一次重复输入。我使用两种方法发送我的订单。见我之前的帖子。