Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 250

 

Wenn es einfach ist, schnell zu überprüfen, ist es in etwa so:

   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;
                    }                  
                 }
              }
           }
        }
     }

Die Aufträge folgen in der Regel zeitlich aufeinander, dies ist jedoch nicht garantiert. Daher sollte die Chronologie überprüft werden. Aber für Experimente ist das ausreichend.

 
Aleksei Stepanenko #:

Wenn es einfach ist, schnell zu überprüfen, ist es in etwa so:

Die Aufträge folgen in der Regel zeitlich aufeinander, dies ist jedoch nicht garantiert. Daher sollte die Chronologie überprüft werden. Aber für Experimente ist das ausreichend.

Ich stimme zu, dass der Zeitpunkt nicht garantiert ist. Deshalb möchte ich alle abgeschlossenen Aufträge bis zum Ticket durchgehen. Ich kenne den Bestellschein und versuche, damit zu rechnen, aber irgendetwas ist schief gelaufen) Was wäre der richtige Weg?

 
Aleksei Stepanenko #:

Wenn es einfach ist, schnell zu überprüfen, ist es in etwa so:

Die Aufträge folgen in der Regel zeitlich aufeinander, dies ist jedoch nicht garantiert. Daher sollte die Chronologie überprüft werden. Aber für Experimente ist das ausreichend.

Wenn wir uns die Historie ansehen, wäre es besser, die Aufträge von den kleineren zu den größeren durchzusehen, die zum Zeitpunkt der Neuberechnung geschlossen werden, da die Marktaufträge von den größeren zu den kleineren betrachtet werden, so dass wir die zum selben Tick geöffneten und geschlossenen Aufträge korrekt berücksichtigen können. Ich denke schon)

Aleksei Stepanenko #:

Wenn es einfach ist, schnell zu überprüfen, dann ist es etwa so:

Als Faustregel gilt, dass die Aufträge zeitlich aufeinander folgen, aber das ist nicht garantiert. Daher ist es sinnvoll, die Chronologie zu überprüfen. Aber für Experimente ist es ausreichend.

Ist der Code von Alexey nicht auch richtig?

 
Valeriy Yastremskiy #:

In der Historie ist es besser, von weniger zu mehr Aufträgen zu gehen, um diejenigen zu berücksichtigen, die zum Zeitpunkt der Neuberechnung geschlossen werden, es sind die Marktaufträge, die wir von mehr zu weniger zählen, um offene und geschlossene Aufträge zum selben Tick korrekt zu berücksichtigen. Ich denke schon)

Rechnen die Codes von Alexey auch falsch?

Ich habe es nicht ausprobiert. Ich werde es jetzt versuchen. Ich werde Ihnen Bescheid geben.

 
Aleksei Stepanenko #:

Wenn es einfach ist, schnell zu überprüfen, ist es in etwa so:

Die Aufträge folgen in der Regel zeitlich aufeinander, dies ist jedoch nicht garantiert. Daher sollte die Chronologie überprüft werden. Aber für Experimente ist es ausreichend.

Ich habe es überprüft und viele Fehler während der Kompilierung erhalten, ich habe sie alle behoben, außer :

if(profit>max)

Diese Zeile verstehe ich nicht ganz. Können Sie das erklären?

 
makssub #:
Die Idee ist, das Ticket zu ändern, wenn Sie einen bestimmten Gewinn erreicht haben

Der Maximalwert ist die Grenze des Gewinns, ab der das Ticket wechselt. Der Wert wird von Ihnen festgelegt.

 
Aleksei Stepanenko #:

Der Maximalwert ist die Grenze des Gewinns, ab der das Ticket wechselt. Sein Wert wird von Ihnen festgelegt.

Das Problem ist ein anderes, wenn ich es richtig verstehe. Es gibt 1, 2 und 3 Aufträge. Ich weiß nicht, wie die offenen Preise gebildet werden. Auftrag 3 ist abgeschlossen, der Gesamtgewinn ist gleich dem Gewinn von Auftrag 3. D.h. wir müssen das Ticket für den Auftrag berechnen, der vor Auftrag 3 eröffnet wurde. Dann ist die Ordnung 2 geschlossen. Wir sollten das Ticket der Bestellung finden, die vor Bestellung 2 geöffnet wurde. Der Gesamtgewinn ist gleich dem Gewinn der Aufträge 2 und 3.

Ich verstehe nicht, warum, aber es scheint die Logik zu sein).

 
Valery, ich verstehe die Logik dieser beiden Sätze nicht ganz.
 
Aleksei Stepanenko #:
Valery, ich habe die Logik in diesen beiden Sätzen nicht ganz verstanden.

Forum für Handel, automatisierte Handelssysteme und Strategietests

FAQ von Anfängern 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);
}

Ich sollte die erste Funktion verwenden, um das gewünschte Orderticket zu finden, und die zweite Funktion sollte alle Gewinne aller geschlossenen Orders nach diesem Ticket berechnen. Ich bin nicht an den Gewinnen der vorhergehenden Jahre interessiert. Aber der zweite berechnet sie nicht korrekt. Wenn ein Auftrag eröffnet wird, werden diese 2 Funktionen aufgerufen und daher sollte der Wert gleich 0 sein, ist es aber nicht.
PS hat Ihren Rat befolgt, Arrays aufgegeben)
12. Kasten oben)


 

Ich habe an alles gedacht und es auf der Grundlage Ihrer Tipps zu meinem eigenen gemacht)

Die Aufgabe bestand darin, einen Verlustauftrag durch andere Aufträge mit Gewinn zu decken.

Wir haben es umgesetzt. Wir haben uns das Ticket des Auftrags, der nach dem verlorenen Auftrag geöffnet wurde, gemerkt; dies war unser Berichtspunkt. Ab diesem Zeitpunkt beginnen wir mit der Berechnung des Gewinns des verlustbringenden Auftrags und des Gewinns der danach geschlossenen Aufträge. Ich möchte Sie daran erinnern, dass der erste Auftrag offen ist und wir ihn schließen, wenn er einen Gewinn erzielt.

wenn ((CalculateProfitHistory() + FirstProfit() >= Gewinn)

{

CloseFirst();

Print ("Schließen Sie den ersten Verlustauftrag");

}


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);
}