Questions des débutants MQL4 MT4 MetaTrader 4 - page 250

 

Si c'est simple, pour vérifier rapidement, c'est quelque chose comme ça :

   double profit = 0;
   int cnt=LockTicket, i , ototal = OrdersHistoryTotal();

   for(i = ototal-1; i >=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol() == Symbol() && OrderCloseTime() > 0)
           {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
              {
               if(OrderMagicNumber() == Magic )
                 {
                  profit += OrderProfit()+OrderCommission()+OrderSwap();
                  if(profit>max)
                    { 
                    cnt=OrdersTicket();
                    break;
                    }                  
                 }
              }
           }
        }
     }

Les commandes se suivent généralement dans le temps, mais ce n'est pas garanti. Il convient donc de vérifier la chronologie. Mais pour les expériences, cela fera l'affaire.

 
Aleksei Stepanenko #:

Si c'est simple, pour vérifier rapidement, c'est quelque chose comme ça :

Les commandes se suivent généralement dans le temps, mais ce n'est pas garanti. Il convient donc de vérifier la chronologie. Mais cela fera l'affaire pour les expériences.

Je suis d'accord, le timing n'est pas garanti. C'est pourquoi je veux passer en revue toutes les commandes fermées jusqu'au ticket. Je connais le billet d'ordre et j'essaie de compter à partir de celui-ci, mais quelque chose a mal tourné.

 
Aleksei Stepanenko #:

Si c'est simple, pour vérifier rapidement, c'est quelque chose comme ça :

Les commandes se suivent généralement dans le temps, mais ce n'est pas garanti. Il convient donc de vérifier la chronologie. Mais cela fera l'affaire pour les expériences.

Si nous examinons l'historique, il serait préférable d'examiner les ordres de plus petit à plus grand qui se ferment au moment du recalcul, car les ordres de marché sont considérés de plus grand à plus petit, afin que nous puissions considérer correctement ceux qui sont ouverts et fermés au même tick. Je pense que oui)

Aleksei Stepanenko #:

S'il est simple à vérifier rapidement, alors c'est quelque chose comme ceci :

En règle générale, les ordres se suivent dans le temps, mais ce n'est pas garanti. Il convient donc de vérifier la chronologie dans le bon sens du terme. Mais ça fera l'affaire pour les expériences.

Le code d'Alexey ne le fait-il pas aussi bien ?

 
Valeriy Yastremskiy #:

Dans l'historique il vaut mieux passer de moins en plus d'ordres pour prendre en compte ceux qui vont se fermer au moment du recalcul, ce sont les ordres au marché que l'on compte de plus en moins pour comptabiliser correctement les ouverts et fermés sur le même tick. Je pense que oui)

Le code d'Alexey calcule-t-il également de manière incorrecte ?

Je ne l'ai pas essayé. Je vais l'essayer maintenant. Je vous le ferai savoir.

 
Aleksei Stepanenko #:

Si c'est simple, pour vérifier rapidement, c'est quelque chose comme ça :

Les commandes se suivent généralement dans le temps, mais ce n'est pas garanti. Il convient donc de vérifier la chronologie. Mais ça fera l'affaire pour les expériences.

Je l'ai vérifié et j'ai obtenu beaucoup d'erreurs pendant la compilation, je les ai toutes corrigées, sauf pour :

if(profit>max)

Cette ligne, je ne la comprends pas bien. Pouvez-vous l'expliquer ?

 
makssub #:
L'idée est de changer le ticket après avoir atteint un certain profit.

Le max est la limite du bénéfice après laquelle le ticket change. La valeur est fixée par vous.

 
Aleksei Stepanenko #:

Le max est la limite du bénéfice après laquelle le ticket change. Sa valeur est fixée par vous.

Le problème est différent, si je comprends bien. Il existe des commandes 1, 2 et 3. Je ne sais pas comment les prix ouverts sont formés. L'ordre 3 est fermé, le bénéfice total est égal au bénéfice de l'ordre 3. C'est-à-dire que nous devons calculer le ticket pour l'ordre ouvert avant l'ordre 3 . Alors l'ordre 2 est fermé. Nous devrions trouver le ticket de l'ordre ouvert avant l'ordre 2. Le bénéfice total est égal au bénéfice des commandes 2 et 3.

Je ne comprends pas pourquoi, mais cela semble être la logique).

 
Valery, je ne comprends pas bien la logique de ces deux phrases.
 
Aleksei Stepanenko #:
Valery, je n'ai pas bien compris la logique de ces deux phrases.

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

FAQ des débutants MQL4 MT4 MetaTrader 4

makssub, 2021.09.01 16:38

int FindTicket()
   {
   int oldticket;
   int tick=0;
   ticket=0;
   
   
   for(int cnt = OrdersTotal ()-1; cnt>=0; cnt--)
      {
      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
         {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            {
            oldticket = OrderTicket();
            if (oldticket > ticket)
               {
               ticket = oldticket;
               tick = OrderTicket();
               }
            }
         }
      }
   return(tick); 
   }              
int TickF = FindTicket();
int CalculateProfitHistory() 
{
  double _point;
  int    i, _ototal = OrdersHistoryTotal(), _profit=0;
  for   (i = 0; i < OrdersHistoryTotal(); i++) 
  {
    if (OrderSelect(TickF, SELECT_BY_TICKET, MODE_HISTORY)) 
    {
      if (OrderSymbol() == Symbol())
      {
        if (OrderMagicNumber() == Magic) 
        {
           _point = MarketInfo(OrderSymbol(), MODE_POINT);
           if (_point == 0) 
           {
              if (StringFind(OrderSymbol(), "") < 0) 
                 _point = 0.0001; 
              else _point = 0.01;
           }   
           if (OrderType() == OP_BUY) 
           {
              _profit += int((MarketInfo(OrderSymbol(), MODE_BID) - OrderOpenPrice())/_point);
           }
           if (OrderType()==OP_SELL) 
           {
              _profit += int((OrderOpenPrice() - MarketInfo(OrderSymbol(), MODE_ASK))/_point);
           }
         }
      }
    }
  }
  return(_profit);
}

Je dois utiliser la première fonction pour trouver le ticket d'ordre requis et la seconde fonction doit calculer le profit de tous les ordres fermés suivant ce ticket. Je ne suis pas intéressé par le profit de celles qui précèdent. Mais le second ne le calcule pas correctement. Lorsqu'un ordre est ouvert, ces 2 fonctions sont appelées et donc il devrait être égal à 0, mais il ne l'est pas.
PS a suivi votre conseil, a abandonné les tableaux)
12ème boîte ci-dessus)


 

J'ai pensé à tout et je l'ai adapté en me basant sur vos conseils).

La tâche consistait à couvrir un ordre perdant avec d'autres ordres à profit.

Nous l'avons mis en œuvre. Nous avons mémorisé le ticket de l'ordre ouvert après l'ordre perdant ; c'était notre point de rapport. Après ce point, nous commençons à calculer le bénéfice de l'ordre déficitaire et le bénéfice des ordres fermés après lui. Je vous rappelle que le premier ordre est ouvert et que nous le fermons lorsqu'il atteint un profit.

si ( (CalculateProfitHistory() + FirstProfit() >= Profit)

{

CloseFirst() ;

Print ("Fermer le premier ordre perdant") ;

}


double CalculateProfitHistory() 
{
   double profit = 0;
   int cnt=Ticket, i , ototal = OrdersHistoryTotal();

   for(i = ototal-1; i >=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      {
         if(OrderSymbol() == Symbol() && OrderCloseTime() > 0)
         {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
               if(OrderMagicNumber() == Magic )
               {
                  if (Ticket !=0)
                  {
                     if (OrderTicket() >= Ticket)
                     {
                        profit += OrderProfit()+OrderCommission()+OrderSwap();
                     }                  
                  }
               }
            }
         }
      }
   }
   return(profit);
}
Raison: