新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1110

 
if(OrderSelect(ticket, SELECT_BY_TICKET)){
      double lots;
      string symbol = OrderSymbol(); 
      while(true){
         RefreshRates();
         double price;
         parseClosePrice(OrderType(), symbol, price);
         if(OrderClose(OrderTicket(), OrderLots(), price, 500)){
            break;
         }else{
            Print(GetLastError());
         }              
         Sleep(1000);
      }   

有时会返回错误4108--订单关闭的错误票据。有没有可能OrderTicket()与OrderSelect 中的票据不匹配?票据变量可以等于零。

我花了很长时间来重现这个错误,问起来比较容易。
 
Dmitri Custurov:

有时会返回错误4108--订单关闭的错误票据。有没有可能OrderTicket()与OrderSelect中的票据不匹配? 票据变量可以等于零。

我花了很长时间来重现这个错误,问起来比较容易。

你通过票据选择一个订单。你确定所选的订单还没有关闭吗?但你试图再次关闭它......。成功选票后,请查看关闭时间。

 
Artyom Trishkin:

你在选择 票面上的顺序。你确定所选的订单没有被关闭?但你又试图关闭它。在票面上选择成功后查看关闭时间。

当我重现这个错误时,我会进行检查。我把所有票据都储存在全局变量中。当订单关闭时,它们会被删除。在OrderSelect()的票据从全局变量中获取。如果票据不在变量中 - 这个变量将是0,因此订单不应该被选择,OrderSelect()将返回false。但总的来说,是的,这值得检查。谢谢你。

 
Dmitri Custurov:

当我重现这个错误时,我会进行检查。我把所有票据都储存在全局变量中。当订单关闭时,它们会被删除。在OrderSelect()的票据从全局变量中获取。如果票据不在变量中 - 这个变量将是0,因此订单不应该被选择,OrderSelect()将返回false。但总的来说,是的,这值得检查。谢谢你。

当一个订单被票选时,检查收盘价是标准做法。你不会以任何其他方式知道该订单是否被关闭并从关闭的订单列表中选择,或者是否仍然开放并从市场订单列表中选择。

最短视的方法是将票据存储在全局变量 中。它们应该取自交易环境--当前的信息就在那里。

 
Artyom Trishkin:

当一个订单被票选时,检查收盘价是标准做法。你不会以任何其他方式知道该订单是否被关闭并从关闭的列表中选择,或者是否仍然开放并从市场的列表中选择。

全局变量 中存储门票是最短视的。它们应该取自交易环境--当前的信息就在那里。

如果我像这样选择:OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES),是不是应该部分解决这个问题?我在全局变量中存储票据是出于其他原因,好吧,我在这个案例中也使用了它。

 
Dmitri Custurov:

如果我像这样选择:OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES),是不是应该部分解决这个问题?我出于其他原因将票据存储在全局变量中,在这种情况下我也使用了它们。

不,不会的--池子(MODE_TRADES)在按票选择时被忽略。

 
Dmitri Custurov:

有时会返回错误4108--订单关闭的错误票据。有没有可能OrderTicket()与OrderSelect中的票据不匹配? 票据变量可能等于零。

我花了很长时间来重现这个错误,问起来就容易多了。

通常只需检查市场订单即可。

OrderCloseTime() == 0 //订单已开启

OrderCloseTime() > 0 //订单已关闭

对于限价订单,你还应该检查收盘价;如果它等于0,说明限价订单已经被取消。

 
谢谢大家的回答,我明白了 ))
 

你好!

如果可以的话,请分享使用PositionClosePartial方法的代码。

理论上我明白它是如何工作的,但我希望看到一些工作代码。

或者建议我去哪里找。

预先感谢你。

 
odyn:

你好!

如果可以的话,请分享使用PositionClosePartial方法的代码。

理论上我明白它是如何工作的,但我希望看到一些工作代码。

或者建议我去哪里找。

我在此表示感谢。

事实上,这只是一行代码。但是,你必须为它拿到位置票。这是OnInit的专家顾问,以0.2手开仓,在OnTick中关闭一半的仓位。

//+------------------------------------------------------------------+
//|                                                           00.mq5 |
//|                                          © 2020, Alexey Viktorov |
//|                     https://www.mql5.com/ru/users/alexeyvik/news |
//+------------------------------------------------------------------+
#property copyright "© 2020, Alexey Viktorov"
#property link      "https://www.mql5.com/ru/users/alexeyvik/news"
#property version   "1.00"

#include <Trade\Trade.mqh>
CTrade trade;
ulong posTicket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
 {
  trade.SetExpertMagicNumber(111);
  trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, 0.2, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0.0, 0.0);
  return(INIT_SUCCEEDED);
 }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
 {
//---
 }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
 {
  if(PositionSelectByTicket(posTicket) && PositionGetDouble(POSITION_VOLUME) > 0.1)
    trade.PositionClosePartial(posTicket, 0.1);
 }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
 {
//---
  if(trans.type == TRADE_TRANSACTION_HISTORY_ADD)
   {
    if(PositionSelectByTicket(trans.position) && PositionGetInteger(POSITION_MAGIC) == 111 && PositionGetString(POSITION_SYMBOL) == _Symbol)
      posTicket = PositionGetInteger(POSITION_TICKET);
   }
 }
//+------------------------------------------------------------------+

或者这里是CTrade类 的完整代码

//+------------------------------------------------------------------+
//| Partial close specified opened position (for hedging mode only)  |
//+------------------------------------------------------------------+
bool CTrade::PositionClosePartial(const ulong ticket,const double volume,const ulong deviation)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- for hedging mode only
   if(!IsHedging())
      return(false);
//--- check position existence
   if(!PositionSelectByTicket(ticket))
      return(false);
   string symbol=PositionGetString(POSITION_SYMBOL);
//--- clean
   ClearStructures();
//--- check filling
   if(!FillingCheck(symbol))
      return(false);
//--- check
   if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      //--- prepare request for close BUY position
      m_request.type =ORDER_TYPE_SELL;
      m_request.price=SymbolInfoDouble(symbol,SYMBOL_BID);
     }
   else
     {
      //--- prepare request for close SELL position
      m_request.type =ORDER_TYPE_BUY;
      m_request.price=SymbolInfoDouble(symbol,SYMBOL_ASK);
     }
//--- check volume
   double position_volume=PositionGetDouble(POSITION_VOLUME);
   if(position_volume>volume)
      position_volume=volume;
//--- setting request
   m_request.action   =TRADE_ACTION_DEAL;
   m_request.position =ticket;
   m_request.symbol   =symbol;
   m_request.volume   =position_volume;
   m_request.magic    =m_magic;
   m_request.deviation=(deviation==ULONG_MAX) ? m_deviation : deviation;
//--- close position
   return(OrderSend(m_request,m_result));
  }
附加的文件:
00.mq5  5 kb
原因: