Question sur la fonction OnTradeTransaction - page 5

 
papaklass:

OnTradeTransaction() est le RUNNER d'un événement de transaction. Peu importe ce qui a déclenché l'événement, l'important est que l'événement se soit produit.

Voici un extrait de la documentation :

OrderSend() / OrderSendAsync() sont des FONCTIONS DE COMMERCE.

Pour OnTradeTransaction(), la fonction utilisée pour envoyer l'ordre de transaction OrderSend() ou OrderSendAsync() ne fait aucune différence.

Je l'ai lu tant de fois avant de créer le sujet... Je ne dirai pas un mot.

Mais néanmoins, ma conclusion est qu'il est plus probable de perdre une transaction dans un tas que de perdre une transaction dans une seconde, et peut-être même pas une (seconde). C'est exactement ce que j'essaie de découvrir. J'essaie d'avoir votre avis sur la question. Quelle est la probabilité de perdre une transaction si elle est assez rare et unique ?

 
papaklass:
En termes de probabilités, je ne sais pas.

Je vais devoir me fier à l'unique opinion de Michael, basée sur sa propre expérience. S'il n'a pas perdu une seule transaction en six mois sur une pile de commandes, alors nous supposerons qu'une seule commande ne sera pas perdue.

Je m'y habitue lentement, en essayant de ne pas briser la logique, mais parfois l'un se met en travers de l'autre...

 
AlexeyVik:

Nous devrons nous fier à l'unique opinion de Michael, basée sur sa propre expérience. S'il n'a pas perdu une seule transaction en six mois à partir d'une pile de commandes, alors nous supposerons qu'une seule commande ne sera pas perdue.

Je le maîtrise lentement, en essayant de ne pas briser la logique, mais il s'avère parfois que l'un interfère avec l'autre...

Alexei, pose-toi une question simple :

Qu'est-ce qui est le mieux, fouiller dans l'historique après chaque commande, ou une seule fois, ou peut-être jamais, pour revérifier l'ordre (OnTradeTransaction n'a pas été déclenché) ?

La validation n'est pas facile à mettre en œuvre (d'ailleurs, mon exemple comporte des erreurs), mais le principe de base est que CHAQUE commande a sa propre magie.

Et encore une chose. J'ai déjà dit que chacun est libre de suivre sa propre voie.....

 
Mikalas:

Alexey, posez-vous une question simple :

Est-il préférable de fouiller dans l'historique après chaque commande ou de revérifier l'ordre (OnTradeTransaction n'a pas fonctionné) une fois ou jamais?

La validation n'est pas facile à mettre en œuvre (d'ailleurs, mon exemple comporte des erreurs), mais le principe de base est que CHAQUE commande a sa propre magie.

Et encore une chose. J'ai déjà dit que chacun est libre de suivre sa propre voie.....

Michael, c'est la réponse simple à cette question simple qui m'a entraîné dans toute cette discussion. Et jusqu'à présent, je n'ai pas l'intention d'y renoncer. Mais je n'arrive toujours pas à comprendre si la perte de transaction est possible après la commande OrderSend() ou l'activation d'un ordre en attente, ou pendant la fermeture de la position en utilisant le stop/stop.

D'après votre première réponse, j'ai compris que même avec OrderSendAsync() vous ne perdez pas la transaction. J'essaie de le comprendre afin de décider s'il est nécessaire de prendre la peine de vérifier de telles transactions, plutôt rares. De plus, en tenant compte de ce que j'ai alloué.

Entoute logique, si OrderSend() n'est pas interrompu avant d'avoir reçu une réponse, la transaction ne peut pas être perdue. Mais l'activation d'un ordre en suspens et la clôture d'une position n'entrent pas dans ma logique. Si, dans ce cas, une transaction est déclenchée dans MT5, respectivement, elle ne sera pas perdue, mais si elle passe par un serveur... Je ne sais pas. (Mais je suppose que l'intuition dit que le serveur m'envoie une réponse et active OnTradeTransaction().

 

Les gars, voilà le problème :

Si j'ouvre une position, OnTradeTransaction ne traite que TRADE_TRANSACTION_DEAL_ADD... Tout va bien.

Si un SellStop, par exemple, est placé, seul TRADE_TRANSACTION_ORDER_ADD est déclenché... Tout est également normal.

Mais si je définis une position et un ordre en attente, TRADE_TRANSACTION_DEAL_ADD fonctionne et TRADE_TRANSACTION_ORDER_ADD fonctionne deux fois.

pourquoi est-ce que c'est comme ça ?

#include <Trade\Trade.mqh>


double point, FirstOpenPrice, TakeProfit, SecondOpenPrice, MaxPrice , MinPrice, SecondTake;
bool  NewStart;
       
    CTrade Trade;
    MqlTradeResult v_res, v_result;
    MqlTradeTransaction v_Trans;

/*******************Expert initialization function*******************/
int OnInit()
{
 point = _Digits%2 == 0 ? _Point : _Point * 10;
  NewStart = true;
   return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
{
 if(NewStart)
  {
   Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, 0.1, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0.0, 0.0);
    Trade.SellStop(0.78, SymbolInfoDouble(_Symbol, SYMBOL_BID)-52*point, Symbol(), 0.0, 0.0, 0, 0);
   NewStart = false;
  }
}/*******************************************************************/

/*********************TradeTransaction function**********************/
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{

  ENUM_TRADE_TRANSACTION_TYPE type = (ENUM_TRADE_TRANSACTION_TYPE)trans.type;
   
   switch(type)
    {
     case TRADE_TRANSACTION_ORDER_ADD:
      {
       Print("order add    * Тикет ордера * ", trans.order);
        Print("order add    * Объём ордера * ", trans.volume);
       break;
      }
     case TRADE_TRANSACTION_DEAL_ADD:
      {
       Print("deal add    * Тикет сделки * ", trans.deal);
        Print("deal add    * Объём сделки * ", trans.volume);
       break;
      }
     default: break;
    }

}/*******************************************************************/
 
AlexeyVik:

Les gars, voilà le problème :

Si j'ouvre une position, OnTradeTransaction ne traite que TRADE_TRANSACTION_DEAL_ADD... Tout va bien.

Si un SellStop, par exemple, est placé, seul TRADE_TRANSACTION_ORDER_ADD est déclenché... Tout est également normal.

Mais si je définis une position et un ordre en attente, TRADE_TRANSACTION_DEAL_ADD et deux fois TRADE_TRANSACTION_ORDER_ADD se déclenchent.

pourquoi en est-il ainsi ?

Vous devez vous tromper quelque part. Il doit y avoir au moins deux événements dans les deux cas : TRADE_TRANSACTION_ORDER_ADD et TRADE_TRANSACTION_DEAL_ADD. La raison pour laquelle vous ne recevez pas TRADE_TRANSACTION_ORDER_ADD n'est pas claire.

Essayez de commenter le commutateur et d'imprimer le journal complet de tous les événements reçus dans OnTradeTransaction.

 
C-4:

Tu t'es trompé quelque part. Dans les deux cas, il doit y avoir au moins deux événements : TRADE_TRANSACTION_ORDER_ADD et TRADE_TRANSACTION_DEAL_ADD. La raison pour laquelle vous ne recevez pas TRADE_TRANSACTION_ORDER_ADD n'est pas claire.

Essayez de commenter le commutateur et d'imprimer le journal complet de tous les événements reçus dans OnTradeTransaction.

Oui, j'ai essayé. Le Print(EnumToString(type)) a été imprimé avant switch(type) ; il s'est imprimé exactement comme je l'ai décrit.

Voici les expériences répétées.




 

J'ai vérifié votre code par moi-même. - Tout fonctionne correctement.

Option sans envoi d'un ordre d'arrêt de suivi :

2015.02.10 18:32:03.332 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_DEAL_ADD

2015.02.10 18:32:03.331 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_HISTORY_ADD

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_DELETE

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

Option permettant d'envoyer un ordre d'arrêt :

2015.02.10 18:35:59.633 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_UPDATE

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_DEAL_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_HISTORY_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_DELETE

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD


s.e., le temps pour un cycle complet a été une agréable surprise : 60-70 msec de manière stable. Bravo, les développeurs !
 
C-4:

J'ai vérifié votre code par moi-même. - Tout fonctionne correctement.

Variante sans envoyer ensuiteun ordre stop:

Option avec envoi d'un ordre stop :

s.e., le temps pour un cycle complet a été agréablement surpris : 60-70 msec de manière stable. Bravo aux développeurs, ils ont fait un excellent travail !

Apparemment, c'est la perte des transactions... et, tout d'abord, (extrait de la documentation)

Et l'ordre dans lequel ces transactions arrivent au terminal n'est pas garanti

Vasily, est-ce un testeur ou une démo ? J'ai un échantillon du testeur. Je me demande s'il y a une différence entre l'opération OnTradeTransaction dans le testeur et sur le compte. Je le vérifierai à l'occasion.


ps ; Il s'avère qu'après avoir perdu une transaction, celle-ci apparaît soudainement lors de l'activation suivante de OnTradeTransaction.

 
AlexeyVik:

Apparemment, c'est la perte des transactions... et, tout d'abord, (extrait de la documentation)

Vasily, est-ce un testeur ou une démo ? J'ai des échantillons du testeur. Je me demande s'il y a une différence entre le déclenchement de OnTradeTransaction dans le testeur et dans le compte. Je le vérifierai à l'occasion.


ps ; Il s'avère qu'après avoir perdu une transaction, celle-ci apparaît soudainement lorsque OnTradeTransaction est activé la fois suivante.

Non, les transactions ne sont pas perdues, elles peuvent simplement ne pas arriver dans un certain ordre.

Seul TRADE_TRANSACTION_REQUEST vient toujours en premier, sinon vous n'auriez pas de ticket pour la commande.

Lisez attentivement la documentation.