Traitement des transactions (OnTradeTransaction) - page 8

 
fxsaber:

Regardez cette vidéo à partir de 01:35 et 03:35.


Pourquoi ai-je besoin de tes trucs faits maison ? Vous me surprenez. Avec une telle connaissance de la programmation, vous ne pouvez pas comprendre le gestionnaire OnTradeTransaction.

 
Alexey Viktorov:

Pourquoi ai-je besoin de tes trucs faits maison ? Vous me surprenez. Avec une telle connaissance de la programmation, vous ne pouvez pas comprendre le gestionnaire OnTradeTransaction.

C'est difficile de parler à quelqu'un qui ne peut même pas imaginer la tâche.

 
Alexey Viktorov:

Il n'y a pas de positions, ou elles sont entre guillemets ?

Il s'agit d'une situation tout à fait normale lorsque, en termes de compensation, il n'y a pas de position (c'est-à-dire que la position totale == 0,0).

Et du point de vue de deux EAs - chacun a sa propre position ouverte.

Il peut y avoir plus d'un conseiller expert sur un même symbole. De plus, certains métiers peuvent se faire à la main.

 
JRandomTrader:

Il s'agit d'une situation tout à fait normale lorsque, en termes de compensation, il n'y a pas de position (c'est-à-dire que la position totale == 0,0).

Et du point de vue de deux conseillers - chacun a sa propre position ouverte.

Il peut y avoir plus d'un conseiller expert sur un même symbole. De plus, certains métiers peuvent être effectués à la main.

La femme a pris l'argent de la table de nuit et a acheté une télé. Le mari a pris la télé, l'a vendue et a mis l'argent dans la table de nuit. En termes de compensation, il n'y a pas de télévision. Et selon votre logique, la femme a la télé et l'argent dans la table de nuit. Ils décident donc d'acheter un autre téléviseur ou de dépenser l'argent.

Ou bien ont-ils chacun une télévision ? Après tout, chacun d'entre eux l'a tenu dans ses mains. Exagérer.


Si un conseiller a ouvert une position et que l'autre la ferme, elle disparaît... Oubliez-les... Il n'y a pas de position.

 
Alexey Viktorov:

La femme a pris l'argent dans la table de nuit, a acheté une télévision. Le mari a pris la télé, l'a vendue et a mis l'argent dans la table de nuit. En termes de compensation, il n'y a pas de télévision. Et selon votre logique, la femme a la télé et l'argent dans la table de nuit. Ils décident alors d'acheter une autre télévision ou de dépenser tout l'argent obtenu en boissons.

Ou bien chacun d'entre eux avait-il un poste de télévision ? Après tout, chacun d'entre eux en a tenu un dans ses mains. J'exagère.


Si un conseiller a ouvert une position et que l'autre la ferme, elle disparaît... Oubliez-les... Il n'y a pas de position.

Il n'y a pas de position.

Mais dans le cadre de leur logique - chaque EA a une position différente. Par exemple, l'un - "long terme" - s'assoira sur la perte, tandis que l'autre - "scalper" - fera sienne la contre-tendance au même moment.

 
JRandomTrader:

Il n'y a pas de position.

Mais dans les limites de leur logique - chaque EA défend sa propre position. Par exemple, l'un - le "long terme" - attendra les pertes, et l'autre - le "scalper" - recherchera une contre-tendance.

Apparemment, vous essayez d'appliquer la logique de deux stratégies de couverture à la compensation. La séquence la plus logique serait la suivante.

Un scalper sur une contre-tendance ferme une position et place un ordre limite au prix TP attendu pour sa position imaginaire. Et si cet interrupteur de fin de course fonctionne, la position sera rétablie dans son intégralité MAIS !!! avec un ticket différent. Il n'est donc pas absolument correct de la considérer comme une continuation de cette position fermée, et l'EA à long terme ne pourra pas la déterminer comme la leur.

Il s'agit d'une autre question si le scalper fonctionne avec un plus petit volume. Le billet restera alors le même, malgré le fait que le prix d'ouverture change. En général, n'essayez pas de transférer simplement la stratégie à la compensation pour la couverture, rien de bon n'en sortira. L'analogie fonctionne, mais les actions doivent être différentes. Les spécificités de la compensation doivent être prises en compte.

 
Alexey Viktorov:

Apparemment, vous essayez d'appliquer la logique de deux stratégies de couverture à la compensation. Une séquence plus logique serait la suivante.

Un scalper sur une contre-tendance fermera sa position et fixera un ordre limite au prix TP attendu pour sa position imaginaire. Et si cet interrupteur de fin de course fonctionne, la position sera rétablie dans son intégralité MAIS !!! avec un ticket différent. Il n'est donc pas absolument correct de la considérer comme une continuation de cette position fermée et l'EA à long terme ne pourra pas la déterminer comme la leur.

Il en va tout autrement si le scalper travaille avec des valeurs plus petites. Dans ce cas, le billet restera au moins le même, malgré le fait que le prix d'ouverture ait changé. En général, n'essayez pas de transférer simplement la stratégie de compensation pour couvrir, rien de bon n'en sortira. L'analogie fonctionne, mais les actions doivent être différentes. Les spécificités de la compensation doivent être prises en compte.

Ceci n'est qu'un exemple du scalper et du long riser, il peut y avoir beaucoup d'EA sur le symbole, et ils peuvent avoir des lots différents.

"Le scalper ferme une position sur une contre-tendance et place un interrupteur de limite au prix du TP attendu pour sa position imaginaire". - Mais le scalpeur suppose pour lui-même qu'il a une "position imaginaire".

Et le fait que la position totale ait changé le billet - donc le conseiller à long terme n'en a pas besoin, il sait déjà qu'il a sa propre position, qui n'est pas liée à la position totale.

Par conséquent, chaque EA fonctionne indépendamment de qui d'autre travaille avec elle sur ce symbole, sans savoir ou vouloir savoir quoi que ce soit à ce sujet.

Et oui, je n'essaie pas de transférer des stratégies de couverture, car j'ai commencé tout de suite avec MT5, FORTS et la compensation. Je voulais simplement que plusieurs robots puissent trader sur le symbole et qu'ils puissent échanger leurs mains sans interférer avec eux.

 

JRandomTrader:

Mais pour lui-même, le dilapidateur pense avoir une "position imaginaire".

C'est ce que je dis, vous devez construire une logique différente pour les filets. Il ne devrait pas y avoir de positions imaginaires . Je l'ai dit comme ça parce que je ne trouvais pas d'autre mot pour que tu me comprennes. S'il y a un remplissage, alors le volume total de la position et le nouveau prix de la position ouverte sont pris en compte, s'il y a une fermeture partielle, la même chose et le prix et le volume sont pris en compte.

 
Alexey Viktorov:

C'est ce que je dis : il faut construire une logique différente pour les filets. Il ne doit pas y avoir de positions imaginaires . J'ai dit ça parce que je ne trouvais pas d'autre mot pour que tu me comprennes. S'il y a un remplissage, alors le volume total de la position et le nouveau prix d'ouverture sont pris en compte ; s'il y a une fermeture partielle, alors il en est de même et le prix et le volume total sont pris en compte.

Nous devrons alors établir une certaine interaction entre les robots et tenir compte des actions des "voisins", qui sont les mêmes aujourd'hui et peuvent être différents demain. Et les avantages qui en découleront ne sont pas clairs.

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

 
JRandomTrader:

Je dois ensuite créer une sorte d'interaction entre les robots et prendre en compte les "voisins" qui sont un aujourd'hui et peut-être un autre demain. Et les avantages qui en découleront ne sont pas clairs.

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

Pour simplifier les choses, oui. Je suis d'accord.

Alors, le "gestionnaire des transports" n'a pas entièrement formulé le problème et ses actions.

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

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, 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.

Que signifient les ordres stop ? Pour la position totale ou seulement pour la partie avec laquelle ce conseiller expert travaille ???