Traitement des transactions (OnTradeTransaction) - page 5

 
fxsaber:

Crétin.

Je pensais que tu voulais dire toi.

Qu'est-il arrivé à"Il trouvera la solution s'il le veut" ?" ?

 
fxsaber:

Il m'est plus facile de répondre en un seul message que d'en faire des dizaines avec des "recommandations".

S'il le veut, il trouvera une solution.

J'avais l'habitude de vouloir... Mais votre code est autre chose.
 
Alexey Viktorov:
Il était une fois, je voulais... Mais votre code est quelque chose hors du commun.

Dans ce cas, vous n'avez besoin que d'une petite connaissance de MT4/5.

 
fxsaber:

Dans ce cas, vous n'avez besoin que d'une petite connaissance de MT4/5.

Malheureusement, je n'en sais guère plus qu'un peu.

Je te l'ai déjà dit, tu mets ton code dans tous les barils comme un bouchon de cul. Ceux qui en ont besoin l'utilisent depuis longtemps et certains en font même la publicité. Mais l'imposer là où elle n'est pas vraiment nécessaire est tout simplement indécent. Surtout quand une personne veut comprendre et se lancer dans la programmation en mql5, et non par des astuces.

 
Alexey Viktorov:

Malheureusement, je n'en sais guère plus qu'un peu.

Je te l'ai déjà dit une fois, tu mets ton code dans tous les barils pour les affaires et sans aucune raison. Ceux qui en ont besoin l'utilisent depuis longtemps et certains en font même la publicité. Mais l'imposer là où elle n'est pas vraiment nécessaire est tout simplement indécent. Surtout quand une personne veut comprendre et se lancer dans la programmation en mql5, et non par des astuces.

Vous voyez, lorsque vous faites des affirmations, c'est une bonne idée de les étayer d'une manière ou d'une autre dans la pratique. En quelques pages, aucune solution OnTradeTransaction n'est apparue. Et si c'est le cas, on comprendra rapidement pourquoi la solution donnée est ainsi et pas autrement. La solution doit montrer la logique, pas l'enfer de la logique. Si je retire le plug-in, le code source ne perdra pas un seul bit de sa logique. Et vous devez seulement comprendre la logique (l'idée), rien de plus.

Je suis d'accord avec cette déclaration. Une fois que la logique est comprise, ils jettent tous les inclusions et créent les leurs. C'est exactement ce qui est proposé : ne pas maîtriser un inlude, mais montrer par le code et non par la peur comment la tâche dont la solution est requise peut fonctionner.

 

Je reviens ici à la source du problème. Et les questions se posent :

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Traitement des transactions (OnTradeTransaction)

Ilya Child, 2019.02.07 20:08

Bonsoir.

Les gars, s'il vous plaît, aidez-nous à résoudre ce problème. Le problème n'est probablement pas nouveau, mais je n'ai pas trouvé de solution univoque (ni en pratique, ni sur les forums).

J'exécute deux robots différents dans le terminal sur deux instruments différents. Les magies sont différentes partout. Le robot place des limites en attente et la procédure OnTradeTransaction me permet de détecter une transaction et de placer des ordres stop en attente en utilisant cette transaction.

Voici le code de la transaction commerciale

case TRADE_TRANSACTION_DEAL_ADD:
        {
         drop_info2("TRADE_TRANSACTION_DEAL_ADD\r\n"+TransactionDescription(trans));
         if((trans.deal_type==DEAL_TYPE_BUY || trans.deal_type==DEAL_TYPE_SELL) && trans.order!=0)
           {
            if(getIsDealOfExpert(trans.deal)) //функция проверки принадлежности сделки к роботу
              {
               drop_info2("Сделка наша");
               analyzeFilledOrder(trans.order,trans.volume); //процедура по выставлению отложенных стоп ордеров
              }
           }
        }
      break;

Voici le code de la fonction qui vérifie si l'affaire appartient à un robot

bool getIsDealOfExpert(ulong dealTicket)
     {
      if(HistoryDealSelect(dealTicket) && HistoryDealGetInteger(dealTicket,DEAL_MAGIC)==magic_number && HistoryDealGetString(dealTicket,DEAL_SYMBOL)==symbol)
         return true;
      else
         return false;
     }

Voici le code de la procédure pour les ordres stop en attente

void analyzeFilledOrder(ulong orderTicket,double volume)
  {
   bool isFindOrder=false;
   string fullComment;
   ENUM_ORDER_TYPE orderType;
   if(getIsOrderOfExpert(orderTicket,true)) //Если ордер из сделки уже в истории
     {
      fullComment=HistoryOrderGetString(orderTicket,ORDER_COMMENT);
      orderType=ENUM_ORDER_TYPE(HistoryOrderGetInteger(orderTicket,ORDER_TYPE));
      isFindOrder=true; //локальная переменная, если нашли в истории
     }
   if(!isFindOrder && getIsOrderOfExpert(orderTicket,false)) //Если не нашли ордер в истории и ордер есть не в истории
     {
      fullComment=OrderGetString(ORDER_COMMENT); 
      orderType=ENUM_ORDER_TYPE(OrderGetInteger(ORDER_TYPE));
      isFindOrder=true; //локальная переменная, если нашли не в истории
     }
   if(isFindOrder) //если хоть где-то нашли, то выставляем отложенные стоп ордера
     {
     //выставляем стоп ордера

Voici le code de la fonction de recherche d'un ordre dans l'historique et hors de l'historique

bool getIsOrderOfExpert(ulong OrderTicket,bool isHistory)
     {
      bool is_expert=false;
      //если ордер находится в истории
      if(isHistory)
        {
         if(HistoryOrderSelect(OrderTicket) && HistoryOrderGetInteger(OrderTicket,ORDER_MAGIC)==magic_number && HistoryOrderGetString(OrderTicket,ORDER_SYMBOL)==symbol)
            is_expert=true;
        }
      else
        {
         if(OrderSelect(OrderTicket) && OrderGetInteger(ORDER_MAGIC)==magic_number && OrderGetString(ORDER_SYMBOL)==symbol)
            is_expert=true;
        }
      return is_expert;
     }

J'éditerais les informations sur les transactions entrantes dans les fichiers journaux dans l'ordre où elles sont reçues dans le terminal. J'ai maintenant un problème auquel j'ai été confronté lorsque je négociais sur un compte de démonstration :

Parfois, les transactions se présentent dans l'ordre suivant : TRADE_TRANSACTION_ORDER_DELETE, puis TRADE_TRANSACTION_DEAL_ADD, puis TRADE_TRANSACTION_HISTORY_ADD. Dans ce cas, les ordres stop ne sont souvent pas placés après l'exécution d'une transaction. Je suppose que cela se produit parce que la commande a déjà été supprimée mais n'a pas encore été ajoutée à l'historique. Cela signifie que nous ne pouvons pas trouver l'ordre de l'opération ni dans l'historique ni dans le terminal. Bien que cela soit douteux, le fait est qu'aucun ordre stop n'est placé car le robot ne le trouve pas après avoir recherché l'ordre dans toutes les dimensions(isFindOrder=false). L'ordre des transactions peut être correct, mais l'ordre est toujours introuvable. Dans tous les cas, le robot détecte correctement la transaction, mais ne parvient pas à placer des ordres.Cependant, il arrive aussi qu'il fonctionne correctement et que des ordres soient placés.

J'ai essayé différentes approches, mais rien ne fonctionne. J'envisage maintenant d'ajouter un intervalle d'une seconde au début de la procédure de passation des commandes en attente. Je ne sais pas où creuser d'autre.

Veuillez partager vos expériences et vos idées.

Comment puis-je concilier ce qui est mis en évidence avec la phrase suivante :

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies

Traitement des transactions (OnTradeTransaction)

Ilya Child, 2019.02.07 20:20

J'ai oublié d'ajouter que le mode est le filet. La position est la même pour tous les robots. C'est-à-dire qu'un robot a acheté une position, le second l' a achetée, les événements TRADE_TRANSACTION_DEAL_ADD sont arrivés en ordre inverse et finalement le premier robot ne l'a pas vu.

Oui et j'ai logiquement besoin d'obtenir un commentaire sur l'ordre de la transaction, la position n'est pas d'une grande aide ici.

Ne faisons pas attention à la faute de frappe, l'un a acheté l'autre a acheté... L'essentiel est qu'il semble que deux EA fonctionnent sur un seul symbole avec le type de compte compensant... Ou peut-être que je ne comprends pas quelque chose ?

 
Alexey Viktorov:

Ne faisons pas attention à la faute de frappe, l'un a acheté l'autre a acheté... L'essentiel est qu'il semble que deux EAs travaillent sur le même instrument avec le type de compte compensant... Ou peut-être que je ne comprends pas quelque chose ?

Il est normal d'avoir plusieurs EA sur un même symbole de compensation. Par exemple, les filets. Il est donc tout à fait possible que la position de compensation soit nulle, mais qu'il y ait deux SL et deux TP. Le problème est clairement formulé ci-dessus.

 
fxsaber:

Les EA multiples sont la norme sur un seul symbole de filet. Par exemple, la compensation des positions. Il est donc tout à fait possible que la position de compensation soit nulle, mais qu'il y ait deux SL et deux TP. Le problème est clairement formulé ci-dessus.

Nous pouvons deviner ce que nous voulons. J'aimerais entendre le "chef des transports". Après tout, j'ai cité ses messages.

 
Alexey Viktorov:

On peut inventer tout ce qu'on veut. J'aimerais entendre le responsable du transport. Je le citais.

Je pense que le patron a été tellement "intimidé" qu'il ne se représentera plus :)

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

Je ne te suis pas vraiment. Voici le traitement de ma transaction

Sur le statut de la commande dans la transaction. Vous réalisez que je n'invente pas tout ça moi-même. Dans toutes les transactions deal_add, il s'agit du statut de la commande. Veuillez noter qu'il s'agit d'un ordre au marché et qu'il s'agissait auparavant d'un ordre en attente.

Nous avons maintenant une autre part d'incompréhension. Une transaction deal_add s'est envolée et la position n'est pas apparue et le pending sur la position inexistante a été placé.

Ajouté.

La transaction Deal_add est envoyée, mais la position n'a pas été placée et un ordre en attente pour la position inexistante a été placé. Le type de transaction est Vendre, le type d'ordre est Acheter. Bien qu'initialement la limite était Sell_limit

Apparemment, soit les anciennes informations ne sont pas effacées quelque part, soit des informations non initialisées sont prises.

Si j'ai un deal_add, la commande est généralement déjà dans l'historique, ou a déjà été supprimée, mais n'est pas encore apparue dans l'historique.

Mais il arrive aussi que la commande soit toujours là, et qu'elle soit alors dans l'état placé.

Mais ça ne peut pas être le cas en ce moment.

Vérifiez, lorsqu'une commande ou une histoire est sélectionnée, qu'elles _sont_ effectivement sélectionnées.