La tâche de recherche des commandes - page 13

 
Vladimir Pastushak:
Oui, je pensais que quelqu'un le savait mieux que moi ....
   double Max1=0;
   double Max2=0; 
   
   int Ticket1=0;
   int Ticket2=0;

   int t=OrdersTotal();
   for(int i=0;i<t;i++){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol()){
            if(OrderType()==OP_BUY){
               if(OrderOpenPrice()>Max1){
                  Max2=Max1;
                  Ticket2=Ticket1;                  
                  Max1=OrderOpenPrice();
                  Ticket1=OrderTicket();
               }
               else if(OrderOpenPrice()>Max2){
                  Max2=OrderOpenPrice();
                  Ticket2=OrderTicket();                  
               }
            }
         }
      }
      else{
         return(false);
      }
   }

Il n'y a pas de moyen plus rapide. Si vous voulez être plus rapide, vous devez réfléchir à l'ensemble de l'algorithme de l'EA, peut-être pouvez-vous vous débarrasser de la nécessité de rechercher deux bas, deux hauts à chaque tick.
 
Dmitry Fedoseev:

Il n'y a pas de moyen plus rapide. Si vous voulez être plus rapide, vous devriez réfléchir à l'algorithme entier de l'EA, peut-être pouvez-vous vous débarrasser de la nécessité de rechercher deux baisses et deux hausses à chaque tick.

Dans votre variante, les données seront égales, c'est-à-dire que le premier et le deuxième ordre supérieur auront le même ticket.

Désolé pour ça...

 

J'ai fait ça

void OrdersInfo :: SearchTicketPriceType()
  {
   double   price_max=0,price_min=0,price_max2=0,price_min2=0,op=0;
   int      tc=-1;
   m_tick_upper  = 0;
   m_tick_upper_ = 0;
   m_tick_lower  = 0;
   m_tick_lower_ = 0;
   Counter=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==m_magic || m_magic==-1)
            if(OrderSymbol  ()==m_symbol || m_symbol==NULL)
               if(OrderType()==m_type_order)
                 {
                  Counter++;
                  op=OrderOpenPrice();
                  tc=OrderTicket   ();
                  //---
                  if(op>price_max) // Самый верхний ордер
                    {
                     price_max=op;
                     m_tick_upper=tc;
                    }
                  if(op<price_min || price_min==0) // Самый нижний ордер
                    {
                     price_min=op;
                     m_tick_lower=tc;
                    }
                  if(tc!=m_tick_upper) // Предпоследний верхний ордер
                     if(op>price_max2)
                       {
                        price_max2=op;
                        m_tick_upper_=tc;
                       }
                  if(tc!=m_tick_lower)
                     if(op<price_min2 || price_min2==0) // Предпоследний нижний ордер
                       {
                        price_min2=op;
                        m_tick_lower_=tc;
                       }
                  //---
                 }
  }
 
Dmitry Fedoseev:

Il est préférable d'assembler simplement des fonctions pour différentes tâches, spécifiquement affûtées pour ces tâches, plutôt que d'essayer de faire quelque chose d'universel.


100%

Si vous créez une solution portable, elle sera forcément redondante en partie lorsqu'elle sera appliquée à une tâche spécifique. Plus vous essayez de le rendre universel, plus la queue de la redondance sera longue. Cela vaut la peine de s'arrêter à temps pour que cette redondance ne vienne pas compliquer la vie du codeur et du produit.

 
Vladimir Pastushak:

J'ai fait ça

Est-ce qu'il fonctionne correctement, avez-vous vérifié ?
 
Dmitry Fedoseev:
Est-ce qu'il fonctionne correctement, avez-vous vérifié ?
Je pense que oui ...)) ...
 
Alexander Puzanov:


100%

Si vous créez une solution transférable, elle sera forcément redondante en partie lorsqu'elle sera appliquée à une tâche particulière. Plus vous essayez de le rendre universel, plus la queue de redondance sera longue. Cela vaut la peine de s'arrêter à temps pour que cette redondance ne vienne pas compliquer la vie du codeur et du produit

J'essaie de passer à la POO pour une raison quelconque. Il est écrit dans les louanges de la POO qu'elle permet de rassembler et de cataloguer beaucoup de fonctions, j'avais des fichiers avec beaucoup de fonctions avant... Je pensais tout classer, mais si pour un cas quelconque il est nécessaire d'avoir une variante séparée, alors le sens des catalogues de bibliothèques disparaît...

Il s'avère que pour éviter la redondance dans 99% des cas, nous devons encore écrire tout le code à la main... A partir de rien, je veux dire...

 
Vladimir Pastushak:
Je pense que oui ...)) ...
Ouais. Norm.
 
Dmitry Fedoseev:
Oui. D'accord.
C'est ce que je voulais quand j'ai créé ce fil, merci à tous !
 
Vladimir Pastushak:
C'est ce que je voulais obtenir en créant ce fil, merci à tous !

Je ne suis pas OTK :) Testez sur des ordres dans le testeur ou sur un compte de démonstration. Vous pouvez vous tromper à première vue.