"Floating PositionSelect()错误 - 页 4

 
prostotrader:

再次,对于 "候选人"、"医生"、"教授 "和 "学者"。

任何进入OnTradeTransaction()的事件可能会丢失

这就是为什么我认为在收到有意义的事件TRADE_TRANSACTION_HISTORY_ADD 之后,是一个错误。

终端中的数据将不会被更新!

在帮助(https://www.mql5.com/ru/docs/basis/function/events#ontradetransaction)

从终端手动或通过OrderSend()/OrderSendAsync()函数发送的一个交易请求可以在交易服务器上产生几个连续的交易这些交易到达终端的顺序是不保证的,所以我们不能把我们的交易算法建立在等待一些交易在其他交易之后的到来。此外,交易在从服务器传递到终端时可能会丢失。

因此,尚不清楚为什么需要这一功能。你只是不应该使用它,就这样。你必须自己分析订单和交易的历史。

 
Dmitry Fedoseev:

在帮助(https://www.mql5.com/ru/docs/basis/function/events#ontradetransaction)

因此,不清楚为什么需要这一功能。你只是不应该使用它,仅此而已。你必须自己分析订单和交易的历史。

谢谢。此外,你也不必使用所有其他功能 :)(没有冒犯的意思)
 

至于订单、头寸和交易。

正如帮助中写到的--交易的顺序是不被保证的--订单转移到历史的交易可以比交易的交易早收到。
在终端中改变头寸,严格说来是接收交易的结果,所以收到它就是保证头寸已经改变。
获得将订单转移到历史记录的交易,只能确保该订单不再是有效的(开放的),并被转移到订单历史中。


Кроме того, транзакции могут потеряться при доставке от сервера к терминалу.

至于这句话。

它似乎还停留在具有异步交易的终端的最初版本之一的文件中。它将在不久的将来被删除。罪犯将被处决。

 
MQ Alexander:

至于订单、头寸和交易。

正如帮助中写到的--交易的顺序不被保证--订单转移到历史的交易可以在交易的交易之前收到。
在终端中改变头寸,严格说来是接收交易的结果,所以收到它就是保证头寸已经改变。
获得将订单转移到历史记录的交易,只能确保该订单不再是有效的(开放的),并被转移到订单历史中。


至于这句话。

它似乎还停留在具有异步交易的终端的最初版本之一的文件中。它将在不久的将来被删除。有罪的人将被处决。

非常感谢您!

和我一个机枪(至少是步枪),参加射击?:)

 

MQ亚历山大!

我希望对交易和头寸有一个更详细的解释。

因为是你写的。

Изменение позиции в терминале происходит строго в результате получения сделочной транзакции, соответственно её получение является гарантией того что позиция поменялась.

而事实上,它的结果如下。

测试专家顾问build 1375演示开放(已运行2次)

//+------------------------------------------------------------------+
//|                                              Test_deff_order.mq5 |
//|                                                   Copyright 2016 |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016"
#property link      "https://www.mql5.com"
#property version   "1.00"
//
uint  order_req_id;
ulong order_ticket;
ulong magic=987142563;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   OrderPlace();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
    switch( trans.type )
    {
      case TRADE_TRANSACTION_REQUEST:
        if((order_req_id > 0) && (order_req_id==result.request_id))
        {
          if(result.retcode==TRADE_RETCODE_PLACED) order_ticket=result.order;
        }
      break;
      case TRADE_TRANSACTION_DEAL_ADD:
        if((order_ticket!=0) && (trans.order==order_ticket))
        {
         Print("Deal done. Ticket: ",trans.order);
        }
      break;
      case TRADE_TRANSACTION_HISTORY_ADD:
        if((order_ticket!=0) && (trans.order==order_ticket))
        {
         Print("History done. Ticket: ",order_ticket);
         if(HistoryOrderSelect(order_ticket))
         {
           double vol_cur = HistoryOrderGetDouble(order_ticket,ORDER_VOLUME_CURRENT);
           double vol_init = HistoryOrderGetDouble(order_ticket,ORDER_VOLUME_INITIAL);
           datetime time_setup=datetime(HistoryOrderGetInteger(order_ticket,ORDER_TIME_SETUP));
           double deals_vol = GetDealsVolume(Symbol(),order_ticket,time_setup);
           Print("Volume initial: ",vol_init," Volume current: ",vol_cur," Deals done: ",deals_vol);
           if(PositionSelect(Symbol()))
           {
            Print("Position exists.");
           }
           else
           {
            Print("Position NOT exists.");
           }
         }
        }
      break;
    }
  }
///----
double GetDealsVolume(const string a_symbol,const ulong a_ticket,const datetime start)
  {
   double volume=0;
   if(HistorySelect(start-180,TimeTradeServer()+180))
     {
      int deals=HistoryDealsTotal();
      if(deals>0)
        {
         for(int i=deals-1; i>=0; i--)
           {
            ulong deal_ticket=HistoryDealGetTicket(i);
            ulong ticket=ulong(HistoryDealGetInteger(deal_ticket,DEAL_ORDER));
            if(( ticket>0) && (ticket==a_ticket))
              {
               volume+=HistoryDealGetDouble(deal_ticket,DEAL_VOLUME);
              }
           }
        }
     }
   return( volume );
  } 
//---
//+------------------------------------------------------------------+
//| Place order                                                      |
//+------------------------------------------------------------------+
void OrderPlace()
{
  ResetLastError();
  MqlTradeRequest request={0};
  MqlTradeResult  result={0};
  order_ticket=0;
  order_req_id=0;
    
//--- Fill structure
  request.action=TRADE_ACTION_DEAL;//PENDING;
  request.magic=magic;
  request.symbol=Symbol();
  request.volume=1;
  double step=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE); 
  request.price=0;//SymbolInfoDouble(Symbol(), SYMBOL_ASK);//-step;
  request.type = ORDER_TYPE_BUY;//BUY_LIMIT;
  request.comment = "";      
  request.type_filling = ORDER_FILLING_IOC; ///
  request.type_time = ORDER_TIME_DAY;
  if(OrderSendAsync(request, result))
  {
    if(result.retcode==TRADE_RETCODE_PLACED) 
    {
      order_req_id=result.request_id;
    }
    else
    {
      Print( __FUNCTION__, ": Error! Retcode: ",GetLastError());
    }
  }
  else
  {
    Print( __FUNCTION__, ": Order not sent!");
  }
}   
//+------------------------------------------------------------------+

在这里,结果是。

两次都是TRADE_TRANSACTION_HISTORY_ADD在前,但

在第一种情况下,没有位置,但在第二种情况下,却有!"。

我应该如何理解它

我忘了附上终端日志。

2016.08.15 15:37:14.935 Experts expert Test_deff_order (GAZR-9.16,M1) loaded successfully
2016.08.15 15:37:17.694 Trades  '1007932': exchange buy 1.00 GAZR-9.16 at market
2016.08.15 15:37:17.702 Trades  '1007932': exchange buy 1.00 GAZR-9.16 at market placed for execution in 8 ms
2016.08.15 15:37:17.721 Trades  '1007932': deal #7487011 buy 1.00 GAZR-9.16 at 13897 done (based on order #50942179)
2016.08.15 15:37:46.456 Trades  '1007932': exchange sell 1.00 GAZR-9.16 at market, close #50942179 buy 1.00 GAZR-9.16 13897
2016.08.15 15:37:46.463 Trades  '1007932': exchange sell 1.00 GAZR-9.16 at market, close #50942179 buy 1.00 GAZR-9.16 13897 placed for execution in 7 ms
2016.08.15 15:37:46.497 Trades  '1007932': deal #7487015 sell 1.00 GAZR-9.16 at 13892 done (based on order #50942187)
2016.08.15 15:37:50.348 Experts expert Test_deff_order (GAZR-9.16,M1) removed
2016.08.15 15:37:51.845 Experts expert Test_deff_order (GAZR-9.16,M1) loaded successfully
2016.08.15 15:37:53.776 Trades  '1007932': exchange buy 1.00 GAZR-9.16 at market
2016.08.15 15:37:53.786 Trades  '1007932': exchange buy 1.00 GAZR-9.16 at market placed for execution in 9 ms
2016.08.15 15:37:53.807 Trades  '1007932': deal #7487017 buy 1.00 GAZR-9.16 at 13898 done (based on order #50942195)
2016.08.15 15:37:58.632 Trades  '1007932': exchange sell 1.00 GAZR-9.16 at market, close #50942195 buy 1.00 GAZR-9.16 13898
2016.08.15 15:37:58.639 Trades  '1007932': exchange sell 1.00 GAZR-9.16 at market, close #50942195 buy 1.00 GAZR-9.16 13898 placed for execution in 7 ms
2016.08.15 15:37:58.664 Trades  '1007932': deal #7487020 sell 1.00 GAZR-9.16 at 13892 done (based on order #50942197)
2016.08.15 15:41:52.483 Experts expert Test_deff_order (GAZR-9.16,M1) removed
 

prostotrader,让我问你一个亲密的问题。为什么你这么喜欢历史订单 而不喜欢交易?:-))

MQ亚历山大 说。

Что касается ордеров, позиций и сделок.

正如帮助中写到的--传入交易的顺序是不保证的--订单转入历史的交易可以在交易之前收到。
在终端中改变头寸严格来说 是收到交易 的结果,因此,收到它就保证了头寸已经改变。
获得将订单转入历史的交易只能保证该订单不再是有效的(开放的),并已转入订单历史。

而在你的情况下

case TRADE_TRANSACTION_DEAL_ADD


几乎是空的...

还有一句抒情的话。在MT5的概念中,历史订单的存在反映了有一个试图进行交易的事实。而且不是因为它被执行的事实。而为了找到答案,我们需要参考一下贸易。它已经反映了贸易操作的结果。那么在你的代码中处理事务就更合理了...

 
Dennis Kirichenko:

prostotrader,让我问你一个亲密的问题。为什么你这么喜欢历史订单 而不喜欢交易?:-))

MQ亚历山大 说。

而在你的情况下


几乎是空的...

我正在回答你的私密问题。

你可能在外汇市场上工作,处理单一订单。

所以你坚持在一个你根本不了解的问题上 "撒谎"。

想象一下,在一辆汽车上有两个方向盘,两个司机都只看向

路上。第一个司机怎么会知道另一个司机正在转向(比方说向右)?

还要仔细 看。

你所有的原始逻辑都是基于市场 订单的执行,所以。

我将提请你注意, 有限 价单挂单

可能不会完全执行,但可以分部分执行。

 
prostotrader:

另外,要仔细观察

我应该在那里看到什么呢?

你是否意识到,在TRADE_TRANSACTION_HISTORY_ADD的情况下,你会意外地得到仓位信息?

而你已经被告知,...
 

prostotrader:

你所有的原始逻辑都是基于市场 订单的执行,所以。

我想提请您注意, 有限 价单挂单

可以不全部执行,而是部分执行。

你不要判断我的原始逻辑,孩子...
 
Dennis Kirichenko:
你不是评判我原始逻辑的人......。

那么谁来判断呢?

我通过你的陈述来判断你的能力!

这张照片显然不好看 :(

这是否更有意义,"教授"?

而且我不记得MQ亚历山大 委托你为他回答。

原因: