Répartir les postes ouverts en groupes - page 9

 
Sergey Voytsekhovsky:

Si je vous comprends bien, c'est la bonne façon de procéder. En tant que camarade plus expérimenté, veuillez me dire si un tel filtre fonctionnera dans le but d'attraper des positions naissantes. Ou peut-être y a-t-il une meilleure option ?

Ceci est pour Alexey - je ne travaille pas avec OnTradeTransaction() pour une raison quelconque.

 
Alexey Viktorov:

Suggérez-vous donc que les autres postes soient repoussés ? Les laisser sans les mentionner ? Ce n'est pas juste.

À mon avis, il est préférable de définir une section distincte du forum dans laquelle chaque problème serait un sujet distinct. Le nombre de sujets est bien inférieur au nombre de messages par sujet. Ainsi, malgré le nombre considérable de sujets, ils ne seront pas repoussés aussi loin que les problèmes individuels et les rapports de bogue le sont maintenant.

Eh bien, vous avez souligné en rouge que vous ne savez pas. Quel était le problème ? Comment s'est-elle manifestée ? Et quelle est la nouvelle méthode ?

Quant au signalement des bogues : "à tort ou à raison", mais si vous voulez le signaler, vous le ferez. Et si tu ne veux pas, tu ne veux pas. Et se fermer comme si "laisser les gens parler des leurs" était une excuse.

 
Sergey Voytsekhovsky:

Si je vous comprends bien, c'est la bonne façon de procéder. En tant que camarade plus expérimenté, veuillez me dire si un tel filtre fonctionnera dans le but d'attraper des positions naissantes. Ou peut-être existe-t-il une option plus correcte ?

A mon avis, cette ligne

         if(trans.type != TRADE_TRANSACTION_ORDER_DELETE)

inutile. Et de manière générale, je suis en train de reconsidérer l'opération OnTradeTransaction pour la variante suivante

  if(trans.type == TRADE_TRANSACTION_HISTORY_ADD)

Au moment de l'ajout d'une transaction, nous ne disposons pas du ticket de la commande qui a généré la transaction. Mais si nous avons besoin d'un ticket pour l'ordre et ses propriétés, comme j'ai besoin maintenant que le prix d'ouverture de l'ordre ne désactive pas le pas de grille à cause du slippage, alors c'est la meilleure variante. imho.

En général, je suis partisan de l'écriture pour une tâche spécifique. En revanche, le SB présente une grande universalité nécessitant des variables supplémentaires qui sont parfois absolument inutiles.

 
Artyom Trishkin:

Eh bien, vous avez surligné en rouge ce que vous ne saviez pas. Quel était le problème ? Comment cela se manifestait-il ? Et quelle était la nouvelle méthode ?

Et à propos des messages d'erreur : "à tort ou à raison", mais si vous voulez le signaler, vous le ferez. Et si tu ne veux pas, tu ne veux pas. Et se renfermer sur soi-même comme "laisser les gens parler des leurs" est une excuse.

Quelque part sur mes vieux disques, j'ai encore les anciens terminaux. Si je peux les trouver, je vous montrerai l'ancienne bibliothèque et la nouvelle. Ensuite, nous aurons une conversation de fond. Sinon, je me souviens que vous ne le faites pas, alors qu'y a-t-il à dire ? Comment expliquer, montrer ce qui n'est pas là maintenant.
 
Alexey Viktorov:

A mon avis, cette ligne

inutile. En général, je suis en train de reconsidérer l'opération OnTradeTransaction pour la variante suivante

Au moment d'ajouter une transaction, il n'y a pas de ticket de l'ordre qui a généré la transaction. Mais si vous avez besoin d'un ticket de l'ordre et de ses propriétés, comme j'ai maintenant besoin du prix d'ouverture de l'ordre, afin que le pas de grille ne soit pas abaissé à cause du slippage, alors c'est la meilleure option. imho.

En général, je suis partisan du développement pour une tâche particulière. Et l'UB a fait entrer l'universalité, ce qui nécessite des variables supplémentaires, parfois absolument inutiles.

Je vous suis extrêmement reconnaissant de m'avoir indiqué la bonne direction. Je l'ai fait de cette façon (ci-dessous, semble fonctionner) :

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//---
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
      {
         if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN) // открылась позиция
            {
               int SizeArrayPosition = ArraySize(ArrayPosition);
               ArrayResize(ArrayPosition,SizeArrayPosition+1);
               
               if(PositionSelectByTicket(trans.position)){
               ArrayPosition[SizeArrayPosition].ticket_pos = trans.position;
               ArrayPosition[SizeArrayPosition].open_price = trans.price;
               ArrayPosition[SizeArrayPosition].open_tyme  = (datetime)PositionGetInteger(POSITION_TIME);
               ArrayPosition[SizeArrayPosition].type       = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
               ArrayPosition[SizeArrayPosition].kod_clana  = 0;
               
               Print("\n"
               "Открылась новая позиция: ticket = ",ArrayPosition[SizeArrayPosition].ticket_pos);}}}
  }

Maintenant, je me demande comment attraper les téléscripteurs des positions qui ont été clôturées par un Take Profit ou par un ordre direct. Nous n'avons besoin que des ticks de ces positions pour les retirer du tableau principal des positions.

 
Sergey Voytsekhovsky:

Je vous suis extrêmement reconnaissant de m'avoir guidé dans la bonne direction. Je l'ai fait (ci-dessous, semble fonctionner) :

Maintenant, je me demande comment attraper les ticks des positions qui ont été fermées au takeprofit ou par ordre direct. Nous n'avons besoin que de ticks de leur part pour retirer ces positions du tableau principal des positions.

J'ajouterais un chèque pour le symbole et le magicien.

    if(PositionSelectByTicket(trans.position) && PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == magick)
     {
      if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN)

Voici un fragment de mon code où la fermeture de la position est détectée.

    if(!PositionSelectByTicket(trans.position))
     {
      HistorySelectByPosition(trans.position);
      ulong ordTicket = HistoryOrderGetTicket(0);
      if(HistoryOrderGetInteger(ordTicket, ORDER_MAGIC) == magick && HistoryOrderGetString(ordTicket, ORDER_SYMBOL) == _Symbol)
       {

Nous pouvons également diviser par les raisons de la fermeture à partir de l'énumération ENUM_DEAL_REASON.

Dans un autre conseiller expert

    if(!PositionSelectByTicket(trans.position))
     {
      if(trans.symbol == _Symbol && HistorySelectByPosition(HistoryDealGetInteger(trans.deal, DEAL_POSITION_ID)))
       {
        int dealTotal = HistoryDealsTotal();
        long posMagic = 0;
        ulong dealTicketIN = HistoryDealGetTicket(0);
        if(HistoryDealGetInteger(dealTicketIN, DEAL_ENTRY) == DEAL_ENTRY_IN)
          posMagic = HistoryDealGetInteger(dealTicketIN, DEAL_MAGIC);
        if(posMagic == magick)
         {
          ulong dealTicketOUT = HistoryDealGetTicket(1);
          if(HistoryDealGetInteger(dealTicketOUT, DEAL_ENTRY) == DEAL_ENTRY_OUT)
           {

Dans le premier cas, j'ai besoin d'une commande, dans le second cas, un accord suffit. En général, quand j'ai besoin de quelque chose, je l'écris.

 
Alexey Viktorov:

J'ajouterais aussi une vérification pour le symbole et la magie.

Voici un fragment de mon code où la fermeture de la position est détectée.

Nous pouvons également diviser par les raisons de la fermeture à partir de l'énumération ENUM_DEAL_REASON.

Ici, dans un autre conseiller expert

Dans le premier cas, j'ai besoin d'une commande, dans le second cas, le commerce suffit. En général, je l'écris quand j'en ai besoin.

Bonsoir. Votre réactivité et votre considération m'honorent. Merci beaucoup. Comme disent les jeunes - respect et respect.

Merci pour vos bons conseils. D'une part, ils ne sont pas très nécessaires pour le moment, mon Expert Advisor n'a pas et n'aura probablement pas de concurrents car il est à haute fréquence, beaucoup de petites positions. Il étouffe tout seul, où peut-il se mesurer aux autres ? Bien sûr, si on en arrive là, il en aura un dans le terminal et dans le compte. Le second est probablement tiré par les cheveux, je n'en sais pas encore beaucoup, mais il permettra peut-être d'économiser un peu de ressources.

Vos exemples sont bons, je vais certainement les sauvegarder, mais je n'ai pas de ticket, pas d'ordre, pas d'accord. Plus précisément, j'en ai des centaines et je ne sais pas laquelle va fermer maintenant. Vous m'avez suggéré de penser que le fait de fermer une position peut être retiré de mes calculs et je vais essayer de le faire maintenant.

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)

Je vais essayer d'imprimer tout ce qu'il imprime dans le flux. Mon conseiller expert sera un générateur de positions et il sait comment ouvrir activement des positions et les fermer en même temps. La seule chose à faire est de trouver cette position (le ticket de position) dans le tableau/structure et de la supprimer. C'est donc comme ça.

Et comme la machine à écrire, je vais essayer d'utiliser un exemple de code de la référence, dans la section sur cette fonction, elle est appelée là :

//|OnTradeTransaction_Sample.mq5 |
//| Copyright 2018, MetaQuotes Software Corp.
//|https ://www.mql5.com ||
//+------------------------------------------------------------------+
#property copyright"Copyright 2018, MetaQuotes Software Corp."
#lien de propriété"https://www.mql5.com"
#propriété version"1.00"
#property description"Exemple d'écouteur d'événement de TradeTransaction".

 
Sergey Voytsekhovsky:

Bonsoir. Votre réactivité et votre attention me font honneur. Merci beaucoup. Comme disent les jeunes, bravo et respect.

Merci pour vos sages conseils. Je n'active pas Magik et le symbole parce que, premièrement, ils ne sont pas très nécessaires en ce moment, mon Expert Advisor n'a pas et n'aura probablement pas de concurrents, parce qu'il a une fréquence élevée, un nombre énorme de positions minimales. Il étouffe tout seul, où peut-il se mesurer aux autres ? Bien sûr, si on en arrive là, il en aura un dans le terminal et dans le compte. Le second est probablement tiré par les cheveux, je n'en sais pas encore beaucoup, mais il permettra peut-être d'économiser un peu de ressources.

Vos exemples sont bons, je vais certainement les sauvegarder, mais je n'ai pas de ticket, pas d'ordre, pas d'accord. Plus précisément, j'en ai des centaines et je ne sais pas laquelle va fermer maintenant. Vous m'avez suggéré de penser que le fait de fermer une position peut être retiré de mes calculs et je vais essayer de le faire maintenant.

Je vais essayer d'imprimer tout ce qu'il imprime dans le flux. Mon conseiller expert sera un générateur de positions et il sait comment ouvrir activement des positions et les fermer en même temps. La seule chose à faire est de trouver cette position (le ticket de position) dans le tableau/structure et de la supprimer. C'est donc comme ça.

Et comme une machine à écrire, je vais essayer d'utiliser le code d'exemple de la référence, dans la section sur cette fonction, elle est appelée là :

C'est toujours agréable de partager mes petites connaissances avec quelqu'un qui est en train de comprendre quelque chose par lui-même à partir de la documentation sur la base de ces conseils. © I.A. Krylov. Le coucou loue le coq pour avoir loué le coucou. )))

Si vous écrivez une EA uniquement pour vous-même, vous pouvez bien sûr prendre certaines libertés. Si vous ne pensez pas qu'il est nécessaire de vérifier le symbole et le magicien, alors ne le faites pas.

A propos du surligné :

Il y a tout, le ticket de position, le ticket de commande et le ticket de transaction. Et il n'est même pas difficile de tirer un trade et / ou un ordre d'ouverture de position. Tout se trouve dans la structure de MqlTradeTransaction.


    if(!PositionSelectByTicket(trans.position)) // Если позицию выбрать не получилось, значит она закрыта
     {
      HistorySelectByPosition(trans.position); // Получим список ордеров и сделок относящихся к этой, конкретной позиции
      ulong ordTicket = HistoryOrderGetTicket(0); // Получили тикет ордера который породил сделку и позицию.
      if(HistoryOrderGetInteger(ordTicket, ORDER_MAGIC) == magick && HistoryOrderGetString(ordTicket, ORDER_SYMBOL) == _Symbol)
       {
 
Если позицию выбрать не получилось, значит она закрыта 
Ой-ли? 
 
Алексей Тарабанов:

Alexey, tout cela se réfère uniquement à la gestion de l'événement OnTradeTransaction.

Un événement s'est produit, une transaction qui ferme une position a été exécutée. La position est déjà perdue à ce moment-là. Ceci peut être confirmé en sélectionnant la liste des commandes et des offres (non présente dans le code) et en lisant

          ulong dealTicketOUT = HistoryDealGetTicket(1);
          if(HistoryDealGetInteger(dealTicketOUT, DEAL_ENTRY) == DEAL_ENTRY_OUT)
Et notez que nous parlons d'un compte hadge où la position ne comporte généralement que deux ordres et deux transactions.