Questions des débutants MQL5 MT5 MetaTrader 5 - page 1206

 
Artyom Trishkin:

Redimensionne le tableau nnc_arr_in de 1 de plus que sa taille dans la cellule 0 du tableau des structures :

Merci.

 

Question mql5

Il y a deux positions ouvertes et un signal(Flag==true)

une seule position doit être fermée par ce signal, c'est-à-dire celle avec le plus grand profit.

Comment ne fermer que celui dont le bénéfice est le plus élevé ?

Quelle est la meilleure façon de gérer cet événement ?

J'essaie de le faire de cette façon :

if (invertStart == true) // получил событие, о том что есть две позиции и одну можно закрыть.
   {     
   int npos_L1=0;   NPos_L1(npos_L1);
   if(npos_L1==1)
   {
   int positions=PositionsTotal();
   for(int i=0;i<=positions;i++)
   {
   ulong ticket=PositionGetTicket(i);
   if(ticket!=0 && PositionGetInteger(POSITION_TYPE)== POSITION_TYPE_SELL && POSITION_PROFIT>=50) //  50  допустим...
   {
   m_trade.PositionClose(ticket); 
   i--;
   invertStart = false;
   return;  
   }
   }
   }
   }  

La dernière position ouverte sera fermée en conséquence.

J'ai lu des livres de référence et des abécédaires, mais je ne comprends pas toujours les subtilités.

 
Vladpedro:

Question mql5

Il y a deux positions ouvertes et un signal(Flag==true)

une seule position doit être fermée par ce signal, c'est-à-dire celle avec le plus grand profit.

Comment ne fermer que celui dont le bénéfice est le plus élevé ?

Quelle est la meilleure façon de gérer cet événement ?

J'essaie de le faire de cette façon :

La dernière position ouverte sera fermée en conséquence.

J'ai lu des livres de référence mais je ne comprends pas toujours les détails.

Code :

   ulong ticket=ULONG_MAX;
   double profit=DBL_MIN;
   if(invertStart == true)  // получил событие, о том что есть две позиции и одну можно закрыть.
     {
      int positions=PositionsTotal();
      for(int i=PositionsTotal()-1; i>=0; i--)
        {
         ulong tmp_ticket=PositionGetTicket(i);
         if(ticket!=0)
           {
            double tmp_profit=PositionGetDouble(POSITION_PROFIT);
            if(tmp_profit>profit)
              {
               ticket=tmp_ticket;
               profit=tmp_profit;
              }
           }
        }
      //---
      if(ticket!=ULONG_MAX)
         m_trade.PositionClose(ticket);
     }
 
Vladimir Karputov:

Code :

Merci beaucoup, cela semble fonctionner, mais il y a un problème avec le ticket, car il existe déjà une telle variable locale.

La déclaration de 'ticket' cache la variable locale Lim_Stop_03_Sell_pos_06.mq5 299 10

Certains de ces billets devront peut-être être cachés à l'intérieur.

 
Vladpedro:

Merci beaucoup, cela semble fonctionner, mais il y a un problème de ticket, car il existe déjà une telle variable locale.

La déclaration de 'ticket' cache la variable locale Lim_Stop_03_Sell_pos_06.mq5 299 10

Certains de ces billets devront peut-être être cachés à l'intérieur.

Renommer la variable

ulong ticket=ULONG_MAX;

в

ulong close_ticket=ULONG_MAX;

et bien sûr n'oubliez pas de le renommer dans votre code.

 
Vladimir Karputov:

Renommer la variable

в

et bien sûr, n'oubliez pas de le renommer dans le code également.

Oui, merci, j'ai déjà réglé le problème... je l'ai renommé.

 

Bonne journée !

Pouvez-vous me dire où je peux trouver un EA qui envoie un email ou une lettre de relance si le prix est au-dessus de la ligne supérieure ou en dessous de la ligne inférieure (la ligne est horizontale ou inclinée et peut être déplacée sur le graphique).

Peut-être que quelqu'un en a un, merci de le partager.

Seulement sur MT5

Merci !

 

si je connecte l'indicateur dans l'EA

int OnInit()
{
   ind_handle = iCustom(_Symbol, indperiod, "MyInd", indParam);
   return(INIT_SUCCEEDED);
}

puis j'obtiens des tampons d'indicateurs en utilisant CopyBuffer(ind_handle, 0, 1, 3, buffer1)


Dois-je lire chaque tick des tampons indicateurs?

J'ai besoin d'une réponse, et de préférence de la source - docs, articles :

1. l'indicateur se calcule toujours en parallèle

2. l'indicateur est calculé uniquement au moment de l'appel de CopyBuffer()

 
Igor Makanu:

si je connecte l'indicateur dans l'EA

puis j'obtiens des tampons d'indicateurs en utilisant CopyBuffer(ind_handle, 0, 1, 3, buffer1)


Dois-je lire chaque tick des tampons indicateurs?

J'ai besoin d'une réponse, et de préférence de la source - docs, articles :

1. l'indicateur se calcule toujours en parallèle

2. l'indicateur est calculé uniquement au moment de l'appel de CopyBuffer()

Igor, si l'indicateur est écrit correctement, seules les valeurs de la barre courante peuvent être modifiées. Par conséquent, si vous avez besoin de valeurs actuelles, vous devez utiliser le CopyBuffer juste avant d'utiliser ces nouvelles valeurs. Et si nous avons besoin des valeurs historiques, elles ne changent pas, et il n'y a aucune raison de les relire.

Il y a des informations quelque part sur le calcul de l'indicateur à chaque tick. Si je me souviens bien, par défaut, l'indicateur n'est recalculé que lorsqu'on y accède, mais il est possible de le faire recalculer à chaque tick. Pour savoir comment faire, vous devez consulter la documentation.

 
Alexey Viktorov:
Igor, si l'indicateur est écrit correctement, seules les valeurs de la barre actuelle peuvent être modifiées. Par conséquent, si vous avez besoin de valeurs actuelles, vous devez utiliser le CopyBuffer juste avant d'utiliser ces nouvelles valeurs. Et si nous avons besoin des valeurs historiques, elles ne changent pas, et il n'y a aucune raison de les relire.

Il y a des informations quelque part sur le calcul de l'indicateur à chaque tick. Autant que je me souvienne, par défaut l'indicateur est recalculé uniquement lorsqu'il est appelé, mais il est possible de le faire recalculer à chaque tick. La façon de procéder est indiquée dans la documentation.

OK, je vais devoir le tester de toute façon.

le problème se situe au niveau de la redéfinition de l'indicateur, je ne veux pas encore réécrire l'indicateur.