Répartir les postes ouverts en groupes - page 6

 
Ajout d'une nouvelle fonction, maintenant le conseiller peut changer la caste d'un groupe de positions à une autre donnée.
//+------------------------------------------------------------------+
//Перевод отобранных по тикетам позиций в указанную касту
//array_base[][observations] основная база, в которой нужно провести изменения
//array_change[]             массив с тикетами позиций, касту которых нужно изменить
//array_change[]             номер касты, к которой нужно приписать позиции
//+------------------------------------------------------------------+
int Transfer_Positions_Specified_Caste_by_Tickets(int &array_base[][observations], 
                                                  int &array_change[], 
                                                  int new_caste){
int size_change = ArraySize (array_change);
int size_base   = ArrayRange(array_base,0);

   for(int i=0; i<size_change; i++){
      int ticket_change = array_change[i];
      for(int a=0; a<size_base; a++){
         if(array_base[a][0] == ticket_change ||
            array_base[a][1] == ticket_change){
            array_base[a][2]  = new_caste;
            break;}}}    
   ArrayFree(array_change);
       
return(size_change);
}
//+------------------------------------------------------------------+
 

Bonsoir. J'aimerais connaître l'avis des professionnels.

Veuillez indiquer quelles sont les fonctions les plus appropriées à utiliser lorsque la tâche suivante doit être effectuée :

J'ai besoin d'ouvrir plusieurs positions (depuis le marché, sans ordres) et de placer immédiatement leurs tickets dans un tableau.

La difficulté est d'obtenir ces tickets, je n'ai pas trouvé de fonctions qui ouvrent une position ET la renvoient avec un ticket (comme dans MT4).

Il suffit d'ouvrir des transactions dans la boucle, des paramètres, etc. - pas de questions, mais pour obtenir un ticket, il suffit d'ouvrir une position, PAS D'AVOIR !

Veuillez me conseiller.

En quelque sorte, ça se passe comme ça :

Ticket = Function.Open Position(Buy, 0.01, ......) ;

 
Sergey Voytsekhovsky:

ouvrir une position ET renvoyer un ticket (comme dans MT4).

.................... mais pour obtenir un ticket de poste qui vient d'être ouvert, j'ai BESOIN ! !!

Veuillez me conseiller.

Lorsque je me souviens, je ne peux demander qu'un ticket du dernier poste ouvert. Mais quelque part, cela me semble maladroit, trop ambigu, il n'y a pas de lien direct entre l'ordre en code et la position ouverte. Il existe certainement des méthodes plus correctes, mais si vous avez des idées ou une expérience suffisante, n'hésitez pas à les partager.

 
Sergey Voytsekhovsky:

La seule chose qui me vient à l'esprit est de demander un ticket pour la dernière position ouverte dans l'historique. Mais d'une certaine manière, cela me semble un peu désordonné, trop ambigu, il n'y a pas de connexion directe entre l'ordre dans le code et la position ouverte. Il y a certainement des méthodes plus correctes, qui a des idées ou qui a peut-être assez d'expérience, partagez s'il vous plaît ?

J'ai décrit tout cela dans des articles. Pour mql5 et mql4 tout est fait là. Vous pouvez prendre une idée et en faire une fonction.

Cependant. Vous avez une transaction dans laquelle l'identifiant de position est écrit. Pour en savoir plus sur les transactions et leurs propriétés, consultez la documentation.

 
Sergey Voytsekhovsky:

Bonsoir. J'aimerais connaître l'avis des professionnels.

Veuillez indiquer quelles sont les fonctions les plus appropriées à utiliser lorsque la tâche suivante doit être effectuée :

J'ai besoin d'ouvrir plusieurs positions (depuis le marché, sans ordres) et de placer immédiatement leurs tickets dans un tableau.

La difficulté est d'obtenir ces tickets, je n'ai pas trouvé de fonctions qui ouvrent une position ET la renvoient avec un ticket (comme dans MT4).

Il suffit d'ouvrir des transactions dans la boucle, des paramètres, etc. - pas de questions, mais pour obtenir un ticket, il suffit d'ouvrir une position, PAS D'AVOIR !

Veuillez me conseiller.

En quelque sorte, ça se passe comme ça :

Ticket = Function.Open Position(Buy, 0.01, ......) ;

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
 {
  if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
   {
    ulong ticket = trans.position; // тикет позиции
    if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN) // открылась позиция
      {
      }
    if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_OUT)// закрылась позиция
     {
      if(HistoryDealGetInteger(trans.deal, DEAL_REASON) == DEAL_REASON_SL)
      if(HistoryDealGetInteger(trans.deal, DEAL_REASON) == DEAL_REASON_TP)
     }
   }
 }
 
Artyom Trishkin:

J'ai décrit tout cela dans les articles. Pour mql5 et mql4 tout est fait là. Vous pouvez prendre l'idée et en faire une fonction.

Cependant. Vous avez un accord dans lequel un identifiant de position est écrit. Pour en savoir plus sur les transactions et leurs propriétés, consultez la documentation.

Merci beaucoup, je vais faire des recherches.

 
Alexey Viktorov:

Super, c'est quelque chose à faire maintenant :-). Je vais trouver une solution et je ne manquerai pas de poster le résultat, peut-être que cela aidera quelqu'un d'autre.

 
Sergey Voytsekhovsky:

Super, c'est quelque chose à faire maintenant :-). Je vais trouver une solution et je ne manquerai pas de poster le résultat, peut-être que cela aidera quelqu'un d'autre.

Il y a très peu de gens qui ne le savent pas. Et ceux qui ne le savent pas devraient être capables de le faire après avoir lu ce fil. S'ils ne peuvent pas, ce n'est pas l'affaire du roi... pour faire des recherches.

 
Artyom Trishkin:

J'ai décrit tout cela dans les articles. Pour mql5 et mql4 tout est fait là. Vous pouvez prendre l'idée et en faire une fonction.

Merci, dans lequel de vos articles exactement ? Vous en avez tellement.....

 

Bon après-midi.

Encore une fois, je fais appel aux gourous de ce forum.

J'ai écrit une petite fonction. Cela fonctionne, mais très lentement. Je comprends que l'algorithme est extrêmement inefficace. Je l'ai lu ici :

https://www.mql5.com/ru/articles/567

qu'il y aune fonction pour ajouter à la fin d'un tableau.

Je ne comprends pas comment l'utiliser, pouvez-vous m'aider à remettre mon imagination sur les rails, je vais donner un code de couleur à la zone qui m'intéresse.

//+------------------------------------------------------------------+
//| Заполняем структуру своих позиций
//+------------------------------------------------------------------+
int Fill_Position_Structure(int kodclana)
{
   int n = 0;
   if(!Refresh_Rates())return(false);
   int SizeTotalPosition = PositionsTotal();
   int SizeArrayPosition = ArraySize(ArrayPosition);
//---Запись новых позиций в структуру        
   for(int i=0; i < SizeTotalPosition; i++)
      {//---Из списка открытых позиций выбираю очередную, предполагаю что она НОВАЯ, определяю ее ВремяЖизни, 
       //----проверяю есть ли она в массиве позиций, если есть, значит СТАРАЯ, обновляю ВремяЖизни, считаю, выхожу. 
         bool  new_pos  = true;
         ulong ticket   = PositionGetTicket(i);
         int   lifetime = DatetimeToInteger(TimeCurrent() - m_position.Time());
         SizeArrayPosition = ArraySize(ArrayPosition);
         for(int y = 0; y < SizeArrayPosition; y++)
            {
               if(ArrayPosition[y].ticket_pos == ticket)
                  {
                     ArrayPosition[y].lifetime_candle = lifetime/60*_Period;
                     ArrayPosition[y].lifetime_sek    = lifetime;
                     ArrayPosition[y].profit          = m_position.Profit() + m_position.Commission() + m_position.Swap();    
                     new_pos = false;
                     n++;
                     break;
                  }
            }
         if(new_pos)
            {//---Если НОВАЯ, забиваю позицию в массив со всеми параметрами
               ArrayResize(ArrayPosition, SizeArrayPosition+1, 1);
               ArrayPosition[SizeArrayPosition].lifetime_candle = lifetime/60*_Period;
               ArrayPosition[SizeArrayPosition].lifetime_sek    = lifetime;
               ArrayPosition[SizeArrayPosition].ticket_pos      = ticket;
               ArrayPosition[SizeArrayPosition].kod_clana       = kodclana;
               ArrayPosition[SizeArrayPosition].profit          = m_position.Profit() + m_position.Commission() + m_position.Swap();    
               ArrayPosition[SizeArrayPosition].type            = m_position.PositionType();
               n++;
            }
      }   
//---Удаление закрытых позиций из структуры  
      SizeArrayPosition = ArraySize(ArrayPosition);
      SizeTotalPosition = PositionsTotal();
      
      for(int z = 0; z < SizeArrayPosition; z++)
         {
            ulong ticket_cl   = ArrayPosition[z].ticket_pos;
            bool  cl_position = true;
            
            for(int i = 0; i < SizeTotalPosition; i++)
               {
                  if(ticket_cl == PositionGetTicket(i))
                     {
                        cl_position = false;
                        n++;
                        break;
                     }
                }
            if(cl_position)
               {
               ArrayRemove(ArrayPosition,z,1);
               Sleep(SLEEPTIME*slp);
               SizeArrayPosition = ArraySize(ArrayPosition);
               }
         }
return(n);
}
Raison: