Traitement des transactions (OnTradeTransaction) - page 9

 
JRandomTrader:

Une position imaginaire est nécessaire du point de vue de l'algorithme du robot : s'il l'a ouverte, il doit la fermer.

Je dois ajouter que la tâche du premier post était encore plus facile - nous devions implémenter le fonctionnement d'une grille d'ordres limités où chaque nœud de la grille ferme son SL/TP.

Par exemple, un seul EA unidirectionnel de ce type fonctionne sur un compte et aucun autre. Mais nous parlons ici aussi de positions imaginaires.


Et la question soulevée ne concerne pas seulement la compensation. Il en va de même pour les opérations de couverture. Il y a plusieurs Expert Advisors en couverture, et quelqu'un vient de fermer plusieurs positions par CloseBy. Si les Expert Advisors sont mis en œuvre par le biais de positions imaginaires, un tel effondrement ne brisera pas la logique.


En général, ce problème peut être résolu grâce à un environnement commercial virtuel. Il peut être résolu facilement. C'est ainsi que les bureaux algorithmiques gèrent leurs portefeuilles de TS sur les bourses.

 
Alexey Viktorov:

Pour simplifier les choses, oui. D'accord.

À ce stade, le "gestionnaire des transports" n'a pas complètement clarifié le problème et ses actions.

Qu'entendez-vous par ordres stop ? Pour l'ensemble de la position ou seulement la partie sur laquelle porte cette EA ???

Bien sûr, pour une partie d'une position avec laquelle notre EA travaille, les ordres stop sont en attente de vente/achat stop et de vente/achat limite.

Jusqu'à présent, j'ai réalisé qu'il serait préférable de passer à OnTrade en raison d'un grand nombre de pièges de OnTradeTransactions.

 
Илья Ребенок:

Bien entendu, les ordres stop sont des ordres de vente/achat stop et de vente/achat limite en attente pour une partie d'une position qui est gérée par un EA spécifique.

Jusqu'à présent, j'ai compris qu'il est préférable d'opter pour OnTrade en raison du grand nombre de pièges que présentent les transactions OnTrade.

Faites seulement attention à ce qu'ils fonctionnent ensemble. Je ne me souviens pas lequel est le premier et lequel est le second. Mais OnTradeTransactions dispose au moins de certaines informations sans code supplémentaire, alors que OnTrade doit tout obtenir de force. Tout d'abord, nous devons déterminer quel événement a déclenché la fonction...

 

J'ai écrit un capteur de transactions - il peut être utile de déterminer quoi et d'où (bien qu'il y ait un traitement simple en fonction du type de transaction) - il n'y a pas de référence à l'historique des ordres et des transactions (par exemple pour imprimer l'ID du conseiller expert).

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value 
   ENUM_TRADE_TRANSACTION_TYPE trans_type=trans.type;
   if(trans_type==TRADE_TRANSACTION_ORDER_ADD || trans_type==TRADE_TRANSACTION_ORDER_UPDATE || trans_type==TRADE_TRANSACTION_ORDER_DELETE ||
      trans_type==TRADE_TRANSACTION_HISTORY_ADD || trans_type==TRADE_TRANSACTION_HISTORY_UPDATE || trans_type==TRADE_TRANSACTION_HISTORY_DELETE)
     {
      Print("---");
      Print(EnumToString(trans_type));
      PrintFormat("%-15s: %d","order",trans.order);
      PrintFormat("%-15s: %s","symbol",trans.symbol);
      PrintFormat("%-15s: %s","order_type",EnumToString(trans.order_type));
      PrintFormat("%-15s: %s","orders_state",EnumToString(trans.order_state));
      PrintFormat("%-15s: %s","time_type",EnumToString(trans.time_type));
      if(trans.time_type==ORDER_TIME_SPECIFIED || trans.time_type==ORDER_TIME_SPECIFIED_DAY)
        {
         PrintFormat("%-15s: %s","time_expiration",TimeToString(trans.time_expiration,TIME_DATE|TIME_SECONDS));
        }
      else
        {
         PrintFormat("%-15s: %s","time_expiration","---");
        }
      PrintFormat("%-15s: %.8f","price",trans.price);
      if(trans.order_type==ORDER_TYPE_BUY_STOP_LIMIT || trans.order_type==ORDER_TYPE_SELL_STOP_LIMIT)
        {
         PrintFormat("%-15s: %.2f","price_trigger",trans.price_trigger);
        }
      else
        {
         PrintFormat("%-15s: %s","price_trigger","---");
        }
      PrintFormat("%-15s: %.8f","price_sl",trans.price_sl);
      PrintFormat("%-15s: %.8f","price_tp",trans.price_tp);
      PrintFormat("%-15s: %.2f","volume",trans.volume);
      if(trans_type!=TRADE_TRANSACTION_ORDER_ADD && (trans.order_type==ORDER_TYPE_BUY || trans.order_type==ORDER_TYPE_SELL))
        {
         PrintFormat("%-15s: %d","position",trans.position);
        }
      else
        {
         PrintFormat("%-15s: %s","position","---");
        }
      if(trans.order_type==ORDER_TYPE_CLOSE_BY)
        {
         PrintFormat("%-15s: %d","position_by",trans.position_by);
        }
      else
        {
         PrintFormat("%-15s: %s","position_by","---");
        }
     }
   else if(trans_type==TRADE_TRANSACTION_DEAL_ADD || trans_type==TRADE_TRANSACTION_DEAL_UPDATE || trans_type==TRADE_TRANSACTION_DEAL_DELETE)
     {
      Print("---");
      Print(EnumToString(trans_type));
      PrintFormat("%-15s: %d","deal",trans.deal);
      PrintFormat("%-15s: %d","order",trans.order);
      PrintFormat("%-15s: %s","symbol",trans.symbol);
      PrintFormat("%-15s: %s","deal_type",EnumToString(trans.deal_type));
      PrintFormat("%-15s: %.8f","price",trans.price);
      PrintFormat("%-15s: %.8f","price_sl",trans.price_sl);
      PrintFormat("%-15s: %.8f","price_tp",trans.price_tp);
      PrintFormat("%-15s: %.2f","volume",trans.volume);
      PrintFormat("%-15s: %d","position",trans.position);
      if(trans.order_type==ORDER_TYPE_CLOSE_BY)
        {
         PrintFormat("%-15s: %d","position_by",trans.position_by);
        }
      else
        {
         PrintFormat("%-15s: %s","position_by","---");
        }
     }
   else if(trans_type==TRADE_TRANSACTION_POSITION)
     {
      Print("---");
      Print(EnumToString(trans_type));
      PrintFormat("%-15s: %s","symbol",trans.symbol);
      PrintFormat("%-15s: %s","deal_type",EnumToString(trans.deal_type));
      PrintFormat("%-15s: %.8f","price",trans.price);
      PrintFormat("%-15s: %.8f","price_sl",trans.price_sl);
      PrintFormat("%-15s: %.8f","price_tp",trans.price_tp);
      PrintFormat("%-15s: %.2f","volume",trans.volume);
      PrintFormat("%-15s: %d","position",trans.position);
     }
   else if(trans_type==TRADE_TRANSACTION_REQUEST)
     {
      Print("---");
      Print(EnumToString(trans_type));
     }
  }
 
Илья Ребенок:

fxsaber : merci pour l'exemple !

Seulement, ce n'est pas vraiment un exemple, c'est une solution complète au problème original.

 
Илья Ребенок:

Bien entendu, les ordres stop sont des ordres de vente/achat stop et de vente/achat limite en attente pour une partie d'une position qui est gérée par un EA spécifique.

Jusqu'à présent, j'ai compris qu'il est préférable d'opter pour OnTrade en raison du grand nombre de pièges que présentent les transactions OnTrade.

Continuez à faire du bon travail :)

Un petit conseil MqlTradeTransaction &trans - SEULS les champs sont pertinents

CHAMPS DE TRANSACTION_TRANSACTION_DEAL_*.

Pour les transactions commerciales liées au traitement des transactions (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE et TRADE_TRANSACTION_DEAL_DELETE), les champs suivants sont remplis dans la structure MqlTradeTransaction

  • deal - billet d'échange ;
  • ordre - le ticket d'ordre, sur la base duquel la transaction a été exécutée ;
  • symbole - nom d'un instrument financier dans la transaction ;
  • type - type de transaction commerciale ;
  • deal_type - type de transaction ;
  • prix - prix auquel la transaction a été exécutée ;
  • price_sl - prix Stop Loss (à remplir, si spécifié dans l'ordre, sur la base duquel la transaction est exécutée) ;
  • price_tp - prix du Take Profit (rempli si spécifié dans l'ordre, sur la base duquel la transaction est exécutée) ;
  • volume - volume d'une transaction en lots.
  • position - ticket d'une position ouverte, modifiée ou fermée suite à l'exécution d'une transaction.
  • position_by - ticket de la position opposée. Rempli uniquement pour les transactions de fermeture d'une position par la position opposée (out by).

Et regardez MqlTradeResult &result.

Mais maintenant vous avez 1000 lignes de code !

 
prostotrader:

Continuez à faire du bon travail :)

Un petit conseil MqlTradeTransaction &trans - SEULS les champs sont pertinents

TRADE_TRANSACTION_DEAL_*.

Pour les transactions commerciales liées au traitement des transactions (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE et TRADE_TRANSACTION_DEAL_DELETE), les champs suivants sont remplis dans la structure MqlTradeTransaction

  • deal - billet d'échange ;
  • ordre - le ticket d'ordre, sur la base duquel la transaction a été exécutée ;
  • symbole - nom d'un instrument financier dans la transaction ;
  • type - type de transaction commerciale ;
  • deal_type - type de transaction ;
  • prix - prix auquel la transaction a été exécutée ;
  • price_sl - prix Stop Loss (à remplir s'il est spécifié dans l'ordre, sur la base duquel la transaction est exécutée) ;
  • price_tp - prix du Take Profit (rempli si spécifié dans l'ordre, sur la base duquel la transaction est exécutée) ;
  • volume - volume d'une transaction en lots.
  • position - ticket d'une position ouverte, modifiée ou fermée suite à l'exécution d'une transaction.
  • position_by - ticket de la position opposée. Rempli uniquement pour les transactions de fermeture d'une position par la position opposée (out by).

Et regardez MqlTradeResult &result.

Mais maintenant vous avez 1000 lignes de code !

Bien sûr, je comprends que vous débordiez d'ego. L'expérience, tout...

Mais je ne suis pas venu ici pour un peu de sarcasme mais pour de l'aide. Si vous regardez un peu plus haut, vous verrez que j'ai reconnu avoir fait une erreur en analysant les champs qui ne sont pas remplis pour deal_add.

Je vous serais reconnaissant pour une aide plus constructive, je peux me "chier" dessus) J'accepte les critiques constructives.

A propos de"Et regardez MqlTradeResult &result".

Selon l'aide, le résultat de la transaction commerciale est rempli uniquement avecTRADE_TRANSACTION_REQUEST et il doit être analysé uniquement avec ce type de transactions.

 

Vous avez une étrange perception.

Je ne rêverais pas de "chier sur qui que ce soit", c'est probablement votre perception de la vie et vous l'utilisez probablement beaucoup vous-même.

Vous l'utilisez probablement beaucoup vous-même.

Ce n'est pas moi, mais fxsaber(a), parce que dans presque tous les sujets il pousse son

Mais lui-même ne négocie pas sur le vrai Marché, et certainement pas sur les FORTS !

Il existe des solutions simples et complexes pour le même problème.

À en juger par votre question, vous êtes un débutant.

Mais comme le dit le dicton : "Nous ne cherchons pas la facilité" !

La fonction OnTradeTransaction a été spécialement conçue pour simplifier les tâches suivantes

"La vie pour les programmeurs dans le développement de robots, mais les vieux de la vieille ne veulent pas l'utiliser,

parce qu'ils sont habitués à OnTrade et doivent écrire un tas de code pour le faire fonctionner.

Je vous ai déjà dit que la commande est la tête, pas l'affaire !

Que ferez-vous si le volume de la commande initiale n'est pas de 1, mais de 2, 10 ?

Vous définissez un ordre en suspens, et cela signifie que vous ne pouvez pas le contrôler "strictement", et encore moins contrôler les transactions !

Vous ne pouvez pas le contrôler "étroitement", d'autant plus si vous faites des transactions ! Il y a beaucoup de pièges avec les ordres en attente.

Mais, vous avez choisi la voie de la facilité, en obtenant une solution prête à l'emploi douteuse, au lieu d'essayer de...

Mais vous avez choisi la voie de la facilité, au lieu d'essayer de le découvrir vous-même (avec des indices).

Bonne chance, je ne suis plus impliqué.

 
prostotrader:

Vous avez une étrange perception.

Je ne rêverais pas de "chier sur qui que ce soit", c'est probablement votre perception de la vie et vous l'utilisez probablement beaucoup vous-même.

Vous l'utilisez probablement beaucoup vous-même.

Ce n'est pas moi, mais fxsaber(a), parce que dans presque tous les sujets il pousse son

Mais lui-même ne négocie pas sur le vrai Marché, et certainement pas sur les FORTS !

Il existe des solutions simples et complexes pour le même problème.

À en juger par votre question, vous êtes un débutant.

Mais comme le dit le dicton : "Nous ne cherchons pas la facilité" !

La fonction OnTradeTransaction a été spécifiquement conçue pour rendre

"vie" pour les programmeurs dans le développement de robots, mais ce sont les vieux de la vieille qui ne veulent pas l'utiliser,

parce qu'ils sont habitués à OnTrade et doivent écrire un tas de code pour le faire fonctionner.

Je vous ai déjà dit que la commande est la tête, pas l'affaire !

Que ferez-vous si le volume de la commande initiale n'est pas de 1, mais de 2, 10 ?

Vous définissez un ordre en suspens, et cela signifie que vous ne pouvez pas le contrôler "strictement", et encore moins contrôler les transactions !

Vous ne pouvez pas le contrôler "étroitement", d'autant plus si vous faites des transactions ! Il y a beaucoup de pièges avec les ordres en attente.

Mais, vous avez choisi la voie de la facilité, en obtenant une solution prête à l'emploi douteuse, au lieu d'essayer de...

Mais vous avez choisi la voie de la facilité, au lieu d'essayer de le découvrir vous-même (avec des indices).

Bonne chance, je ne suis plus impliqué.

Commençons par le fait que je n'utilise pas de solutions toutes faites. Je ne sais pas ce que vous avez inventé pour moi, mais je n'ai utilisé aucune des solutions proposées dans ce fil de discussion (même si j'en ai tiré quelques connaissances utiles) et je suis encore en train d'expérimenter et de découvrir des choses. En général, j'ai remarqué dans vos messages que vous aimez remettre en question les autres. Sans vouloir vous offenser.

Quant au volume des commandes, il n'a pas d'importance. C'est un marché qui me permet de juger du volume réellement exécuté. Je pense que c'est plus facile que d'attraper l'exécution partielle de l'ordre par son type approprié. Dans l'un des sujets, en outre, il a été souligné que seule une transaction permet de s'assurer que la position a été exécutée.

 
Илья Ребенок:

Pour commencer, je n'utilise pas de solutions toutes faites. Je ne sais pas ce que vous avez inventé pour moi, mais je n'ai utilisé aucune des solutions proposées dans le fil de discussion (bien que j'aie appris quelque chose d'utile) et je suis encore en train d'expérimenter et de trouver des solutions. En général, j'ai remarqué dans vos messages que vous aimez remettre en question les autres. Sans vouloir vous offenser.

Quant au volume des commandes, il n'a pas d'importance. C'est un accord qui me permet de juger du volume réellement exécuté. Je pense que c'est plus facile que d'attraper l'exécution partielle de l'ordre selon le type d'ordre approprié. Dans l'un des sujets, il a été souligné que seule une transaction nous donne la certitude que la position a été exécutée.

Avez-vous oublié comment lire ?

"Bonne chance, je ne suis plus impliqué."

Raison: