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

 
Valeriy Yastremskiy #:

Fügen Sie den Code korrekt ein, Alt S oder über das Symbol, Hinweis Code.

Warum brauchen Sie einSaveTick-Array?

Sie verwenden nur 2 Elemente des Arrays. Ersetzen Sie sie durch globale oder statische Variablen, wenn Sie sie in einer Funktion deklarieren.

Es ist nicht sinnvoll, ein Array für 2 Variablen zu verwenden.

Und Sie scheinen Arrays aufzurufen, bevor die FunktionFindTick() aufgerufen wird, bei der die Größe des SaveTick-Arrays festgelegt wird. Und es gibt eine Überschreitung des Feldes.

Ich danke Ihnen. Ich hab's.
Können Sie mir sagen, was der Fehler ist, es scheint mir, dass die Funktion nicht richtig gezählt wird


***
 
makssub #:

Ich danke Ihnen. Ich hab's.
Können Sie mir sagen, was der Fehler ist, es scheint mir, dass die Funktion nicht richtig gezählt wird


Fügen Sie den Code korrekt ein, es ist das 13. Kästchen oben im Antwortfenster.

Und Sie können in Worten schreiben, was die Funktion Zeile für Zeile tut.

Es sieht auf jeden Fall nicht korrekt aus.

Ich verstehe nicht, wo und wie die Variable Tick dem Auftragsticket zugewiesen wird. Und es ist nicht nötig, die magische Zahl und den Auftragstyp gemäß der folgenden Bedingung zu überprüfen
_magic < 0 || OrderMagicNumber() == _magic
Wenn die Funktion mit einer magischen Zahl kleiner als Null aufgerufen wird oder die magische Zahl gleich der Nummer des ausgewählten Auftrags ist, fragen wir die Punktgröße ab, und wenn sie gleich Null ist, suchen wir nach einem leeren Wert im Auftragssymbol... und so weiter.

Oh, und denken Sie daran, der Order Select füllt die Datenstruktur des Auftrags aus und speichert sie. Und erst bei der nächsten Auftragsauswahl mit einer anderen Auftragsnummer oder einem anderen Ticket werden sich die Daten in dieser Struktur ändern.

D.h. OrderSend füllt nicht die Auftragsdatenstruktur, sondern gibt das Auftragsticket oder minus 1 zurück. Und die Auftragsstruktur wird nur von OrderSelect ausgefüllt. Aus dieser Struktur lassen sich dann die Daten dieser Ordnung gewinnen.

 
Valeriy Yastremskiy #:

Fügen Sie den Code korrekt ein, es ist das 13. Feld oben im Antwortfenster.

Und Sie können in Worten schreiben, was die Funktion Zeile für Zeile tut.

Das scheint natürlich falsch zu sein.

Und es ist nicht klar, wo und wie die Variable Tick dem Auftragsticket zugewiesen wird. Und es ist nicht nötig, die magische Zahl und den Auftragstyp gemäß der folgenden Bedingung zu überprüfen
_magic < 0 || OrderMagicNumber() == _magic
Wenn die Funktion mit einer magischen Zahl kleiner als Null aufgerufen wird oder die magische Zahl gleich der Nummer des ausgewählten Auftrags ist, fragen wir die Punktgröße ab, und wenn sie gleich Null ist, suchen wir nach einem leeren Wert im Auftragssymbol... und so weiter.

Oh, und denken Sie daran, der Order Select füllt die Datenstruktur des Auftrags aus und speichert sie. Und erst bei der nächsten Auftragsauswahl mit einer anderen Auftragsnummer oder einem anderen Ticket werden sich die Daten in dieser Struktur ändern.

D.h. OrderSend füllt nicht die Auftragsdatenstruktur, sondern gibt das Auftragsticket oder minus 1 zurück. Und die Auftragsstruktur wird nur von OrderSelect ausgefüllt. Und aus dieser Struktur können wir dann die Daten dieser Bestellung abrufen.

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

In der ersten Funktion wird das gewünschte Auftragsticket ermittelt, und die zweite Funktion soll den Gewinn aller nach diesem Ticket geschlossenen Aufträge berechnen. Der Gewinn der Aufträge, die davor lagen, ist für mich nicht von Interesse. 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)

 
makssub #:

In der ersten Funktion suche ich das Ticket der gewünschten Order, und die zweite Funktion soll den Gewinn aller nach diesem Ticket geschlossenen Orders berechnen. Ich bin nicht an den Gewinnen der Vorgänger interessiert.
PS nahm Ihren Rat an, ich lehnte Arrays ab)
das 12. Quadrat von oben)

Die erste Funktion findet das Ticket mit der höchsten Nummer, wenn die Tickets mit den Nummern steigen))) Bei der nächsten Iteration der Schleife wird das Ticket des nächsthöheren Auftrags mit dem Ticket des vorherigen Auftrags verglichen. Die Auftragsauswahl füllt die Auftragsstruktur, und OrderTicket ruft den Ticketwert aus dieser Struktur ab.

Schreiben oder lesen Sie selbst, was die einzelnen Codezeilen bewirken.

In der zweiten Funktion füllt OrderSelect die Auftragsstruktur mit denselben Ticketdaten)

 
Valeriy Yastremskiy #:

Die erste Funktion findet das Ticket mit der höchsten Nummer, wenn die Tickets mit den Nummern steigen))) Bei der nächsten Iteration der Schleife wird das Ticket der nächsthöheren Nummer mit dem Ticket der vorherigen Bestellung verglichen. Die Auftragsauswahl füllt die Auftragsstruktur, und OrderTicket ruft den Ticketwert aus dieser Struktur ab.

Schreiben oder lesen Sie selbst, was die einzelnen Codezeilen bewirken.

In der zweiten Funktion füllt OrderSelect die Auftragsstruktur mit denselben Ticketdaten)

Ich habe es ausbuchstabiert, aber es scheint mit der Logik in dieser Sprache nicht zu stimmen. Können Sie mir sagen, wie ich das Ticket des letzten offenen Auftrags ermitteln kann?

Wie berechne ich den Gewinn aller geschlossenen Aufträge, die auf ihn folgen?

 
makssub #:

Ich habe es ausbuchstabiert, aber es scheint mit der Logik im Zusammenhang mit dieser Sprache nicht zu stimmen. Können Sie mir sagen, wie ich das Ticket des letzten offenen Auftrags ermitteln kann?

Wie berechne ich den Gewinn aller geschlossenen Aufträge, die auf ihn folgen?

Zum Zeitpunkt der Eröffnung einer Bestellung. Es sollte die größte sein.) Und wir sollten nicht die Bestellnummer verwenden. Oder wir müssen in unserer Datenbank die Auftragsnummern, Tickets, den Status der Aufträge und die Öffnungs-/Schließungszeit speichern.

 if(OrderSelect(Ticket, SELECT_BY_TICKET)==true) // Если выбор рыночного ордера произошел успешно
        {
         if(OrderCloseTime()==0)              // Если наш рыночный ордер не закрыт           {
            
            //           Alert("Наш рыночный ордер жив, Модифицируем его если нужно ");
            if(Tral_Stop!=0 || Tral_Profit!=0)
          {     ModifyTral(); }
            return;
           }
         if(OrderCloseTime()!=0)              // Если наш рыночный ордер закрылся
         {
Alert("Our market order has closed. The Adviser's work is completed ",
                  " Swap = ", OrderSwap(), " Commission = ", OrderCommission(),"Profit/loss = ",OrderProfit());
         // ..... // получаем профит и считаем общий профит например
         }

Und es ist besser, sich die Logik bis zum Ende zu merken. Dann ist es einfacher. Es ist besser, mit den notwendigen Daten zu beginnen, und es sollten genügend Daten für eine Entscheidung vorhanden sein.)

Wir haben offene Zeit der Aufträge (nicht anhängig). Wir haben ihre Tickets. Wir haben einen offenen Preis, SL und TP für jeden Marktauftrag. Und es gibt eine Zeit, in der die Bestellung abgeschlossen wird. Und nach Abschluss der Bestellung wird das Feld Gewinn ausgefüllt.

Dies sind die Daten, die wir benötigen, um die Logik aus diesen Feldern zu erstellen.

Die Formulierung "geschlossene Aufträge nach dem letzten offenen Auftrag" ist überhaupt nicht definiert. Sie können nach Nummer, nach Ticket und nach Zeit gehen.

 
Valeriy Yastremskiy #:

Bis zum Zeitpunkt der Eröffnung der Bestellung. Es sollte die größte sein)

Du schreibst es richtig, aber der Code sieht ein bisschen kompliziert aus )))))

Ich würde es so machen, wie Sie es beschrieben haben:

int GetTicketLastOpenOrder()
{
   int ticket = -1;
   datetime t = 0;
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderType() <= OP_SELL && OrderOpenTime() > t)
      {
         ticket = OrderTicket();
         t = OrderOpenTime();
      }
   }
   return(ticket);
}


ZS: OrderSelect() nach Ticketnummer dauert viel länger als eine einfache Suche nach offenen Aufträgen

 
Igor Makanu #:

Du schreibst es richtig, aber der Code ist ein wenig verworren ))))

Schreiben Sie es einfach so, wie Sie wollen:


S : OrderSelect() nach Ticketnummer dauert viel länger als eine einfache Aufzählung der offenen Aufträge

Danke Igor, es ist nur so, wenn sie das Wesentliche nicht verstehen, vermittelt der richtige Code für etwas nicht das Wesentliche, also bitte ich darum, nicht komplizierte Algorithmen in Worte zu fassen))))

 
Valeriy Yastremskiy #:

Bis zum Zeitpunkt der Eröffnung der Bestellung. Es sollte die größte sein) Und nur nicht nach Bestellnummer, und oft ist auch das Ticketing nicht hilfreich. Oder speichern Sie Auftragsnummern, Tickets, Auftragsstatus und Öffnungs-/Schließungszeiten in Ihrer Datenbank.

Und es ist besser, sich die Logik bis zum Ende zu merken. Dann ist es einfacher. Es ist besser, mit den notwendigen Daten zu beginnen, und es sollten genügend Daten für eine Entscheidung vorhanden sein.)

Wir haben offene Zeit der Aufträge (nicht anhängig). Wir haben ihre Tickets. Wir haben einen offenen Preis, SL und TP für jeden Marktauftrag. Und es gibt eine Zeit, in der die Bestellung abgeschlossen wird. Und nach Abschluss der Bestellung wird das Feld Gewinn ausgefüllt.

Dies sind die Daten, die wir benötigen, um die Logik aus diesen Feldern zu erstellen.

Die Formulierung "geschlossene Aufträge nach dem letzten offenen Auftrag" ist überhaupt nicht definiert. Sie können nach Nummer, nach Ticket und nach Zeit gehen.

Herzlichen Dank für Ihre Antworten. Ich habe einige Ihrer Vorschläge umgesetzt.
Ich habe eine Funktion geschrieben, die das richtige Häkchen findet.
Ich habe eine Funktion geschrieben, die den Gewinn aller geschlossenen Aufträge nach dem gewünschten Auftragstick der gewählten Funktion zählt. Jetzt muss ich sie nur noch gemäß Ihren Empfehlungen korrigieren und eine Prüfung nach Zeit usw. hinzufügen.

tpl = NormalizeDouble(Bid - ProfitLock*Point, Digits);
            ticket = OrderSend (Symbol(), OP_SELL, lastlot, Bid, Slippage, 0, tpl, "",Magic, 0, Red);


double CalculateProfitHistory()
{
double order=0,op=0;
int cnt=0;
datetime time=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
      if(OrderSelect(Tick,SELECT_BY_TICKET,MODE_HISTORY))
      {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
         {
            
            
            op += OrderProfit();
            order +=op;
            cnt++;
            
         }
      }
      }
   return(order);
  }

Das Einzige, was mich jetzt verwirrt, ist, dass es nicht richtig berechnet wird. Wenn der Test einen TP von 0,02 ergibt, wird 0,1300 berechnet und in Comment geschrieben. Können Sie mir sagen, was damit nicht in Ordnung ist?

 
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2021.09.02
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
Grund der Beschwerde: