"Erreur de PositionSelect() flottante - page 4

 
prostotrader:

Une fois encore, pour les "candidats", les "médecins", les "professeurs" et les "universitaires".

Tout événement provenant de OnTradeTransaction() peut être perdu.

C'est pourquoi je pense que c'est une erreur qu'après avoir reçu l'événement significatifTRADE_TRANSACTION_HISTORY_ADD

les données dans le terminal ne seront pas mises à jour !

Dans l'aide(https://www.mql5.com/ru/docs/basis/function/events#ontradetransaction):

Une demande de transaction envoyée manuellement depuis le terminal ou via les fonctionsOrderSend()/OrderSendAsync() peut générer plusieurs transactions consécutives sur le serveur de transactions. L'ordre d'arrivée de ces transactions dans le terminal n'est pas garanti. Nous ne pouvons donc pas construire notre algorithme de négociation en attendant l'arrivée de certaines transactions commerciales après d'autres. En outre, les transactions peuvent être perdues lors de leur transfert du serveur au terminal.

Par conséquent, on ne voit pas bien pourquoi cette fonction est nécessaire. Vous ne devez pas l'utiliser, c'est tout. Vous devez analyser vous-même l'historique des commandes et des transactions.

 
Dmitry Fedoseev:

Dans l'aide(https://www.mql5.com/ru/docs/basis/function/events#ontradetransaction):

Il n'est donc pas évident de savoir pourquoi cette fonction est nécessaire. Tu ne devrais pas l'utiliser, c'est tout. Vous devez analyser vous-même l'historique des ordres et des transactions.

Merci. De plus, vous n'avez pas besoin d'utiliser toutes les autres fonctions :) (sans vouloir vous offenser)
 

Quant aux ordres, positions et transactions.

Comme il est écrit dans l'aide - la séquence des transactions n'est pas garantie - la transaction de transfert d'ordre vers l'historique peut être reçue avant la transaction de transaction.
Lamodification d'une position dans le terminal est strictement le résultat de la réception d'une transaction commerciale, de sorte que sa réception est une garantie que la position a changé.
L'obtention d'une transaction pour transférer un ordre dans l'historique garantit uniquement que l'ordre a cessé d'être actif (ouvert) et a été déplacé dans l'historique des ordres.


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

Quant à cette phrase.

Il semble être resté dans la documentation de l'une des premières versions du terminal avec échanges asynchrones. Il sera supprimé dans un avenir proche. Les coupables seront exécutés.

 
MQ Alexander:

Quant aux ordres, positions et transactions.

Comme indiqué dans l'aide - la séquence des transactions n'est pas garantie - une transaction de transfert d'ordre vers l'historique peut être reçue plus tôt qu'une transaction de transaction.
Lamodification d'une position dans le terminal est strictement le résultat de la réception d'une transaction commerciale, de sorte que sa réception est une garantie que la position a changé.
L'obtention d'une transaction pour transférer un ordre dans l'historique garantit uniquement que l'ordre a cessé d'être actif (ouvert) et a été déplacé dans l'historique des ordres.


Quant à cette phrase.

Il semble être resté dans la documentation de l'une des premières versions du terminal avec échanges asynchrones. Il sera supprimé dans un avenir proche. Les coupables seront exécutés.

Merci beaucoup !

Et moi une mitraillette (ou au moins un fusil), pour participer au tir ? :)

 

MQ Alexander !

J'aimerais avoir une explication plus détaillée des transactions et des positions.

Parce que VOUS avez écrit :

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

Et en fait, il en ressort ce qui suit :

Ouverture de la démo de Test Expert Advisor build 1375 (a été exécuté 2 fois)

//+------------------------------------------------------------------+
//|                                              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!");
  }
}   
//+------------------------------------------------------------------+

Et voici les résultats :

Les deux fois, TRADE_TRANSACTION_HISTORY_ADD est arrivé en premier, mais

dans le premier cas, il n'y avait pas de position, mais dans le deuxième cas, il y en avait une !

Comment dois-je le comprendre?

J'ai oublié de joindre le journal du terminal :

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, laissez-moi vous poser une question intime. Pourquoi aimez-vous tant les commandes historiques et pas les transactions? :-))

MQ Alexander a déclaré :

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

Comme il est écrit dans l'aide - la séquence des transactions entrantes n'est pas garantie - la transaction de transfert d'ordre vers l'historique peut être reçue avant la transaction.
Lechangement d'une position dans le terminal est strictement le résultat de la réception d'une transaction commerciale, donc sa réception est une garantie que la position a changé.
L'obtention d'une transaction pour transférer l'ordre dans l'historique garantit seulement que l'ordre a cessé d'être actif (ouvert) et a été déplacé dans l'historique des ordres.

Et dans votre cas

case TRADE_TRANSACTION_DEAL_ADD


presque vide...

Et une autre remarque lyrique. Dans le concept de MT5, la présence d'un ordre historique reflète le fait qu'il y a eu une tentative de transaction. Et ce n'est pas le fait qu'il ait été exécuté. Et pour le savoir, il faut se référer au métier. Il reflète déjà le résultat de l'opération commerciale. Il est alors plus logique de traiter les transactions dans votre code...

 
Dennis Kirichenko:

prostotrader, laissez-moi vous poser une question intime. Pourquoi aimez-vous tant les commandes historiques et pas les transactions? :-))

MQ Alexander a déclaré :

Et dans votre cas


est presque vide...

Je réponds à votre question intime.

Vous travaillez probablement sur le marché FOREX et traitez un ordre unique,

Vous vous obstinez donc à "mentir" sur une question que vous ne comprenez même pas.

Imaginez qu'il y ait deux volants dans une voiture et deux conducteurs qui regardent tous deux uniquement l'écran de contrôle.

la route. Comment le premier conducteur peut-il savoir que l'autre conducteur braque (disons vers la droite) ?

Regardez aussi attentivement:

Toute votre logique primitive est basée sur l'exécution d'un ordre de marché, donc..,

Je vous signale qu'il y a des ordres limités et en attente.

qui peuvent ne pas être entièrement exécutés mais peuvent être exécutés en partie.

 
prostotrader:

Aussi, regardez bien:

Et qu'est-ce que je devrais voir là-bas ? !

Réalisez-vous que vous obtenez accidentellement des informations sur la position dans le cas TRADE_TRANSACTION_HISTORY_ADD ?

Et on vous a déjà dit que...
 

prostotrader:

Toute votre logique primitive est basée sur l'exécution d'un ordre de marché, donc..,

Je voudrais porter à votre attention qu'il y a des ordres limités et en attente

qui peut ne pas être exécuté en totalité mais en partie.

Bébé, ce n'est pas à toi de juger ma logique primitive...
 
Dennis Kirichenko:
Ce n'est pas à vous de juger ma logique primitive...

Et qui doit juger ?

Je juge vos capacités par vos déclarations !

La photo n'est clairement pas jolie :(

Est-ce plus clair, "Professeur" ?

Et je ne me souviens pas queMQ Alexander vous ait délégué pour répondre à sa place.