Einteilung der offenen Stellen in Gruppen - Seite 9

 
Sergey Voytsekhovsky:

Wenn ich Sie richtig verstehe, ist dies der richtige Weg. Als erfahrener Genosse können Sie mir bitte sagen, ob ein solcher Filter für die Erfassung von Neugeborenenpositionen geeignet ist? Oder gibt es vielleicht eine bessere Option?

Dies ist für Alexey - ich arbeite nicht mit OnTradeTransaction() aus irgendeinem Grund.

 
Alexey Viktorov:

Schlagen Sie also vor, dass die anderen Stellen zurückgestellt werden? Sollen sie unerwähnt bleiben? Das ist nicht richtig.

Meiner Meinung nach ist es besser, einen separaten Bereich des Forums zu definieren, in dem jedes Problem ein eigenes Thema ist. Die Anzahl der Themen ist viel geringer als die Anzahl der Beiträge pro Thema. Trotz der beträchtlichen Anzahl von Themen werden sie also nicht so weit zurückgestellt, wie es jetzt bei einzelnen Problemen und Fehlerberichten der Fall ist.

Nun, Sie haben in Rot hervorgehoben, dass Sie es nicht wissen. Was war das Problem? Wie hat sie sich manifestiert? Und was ist die neue Methode?

Was die Meldung von Fehlern angeht: "richtig oder falsch", aber wenn Sie sie melden wollen, werden Sie es tun. Und wenn Sie nicht wollen, dann wollen Sie nicht. Und sich abzuschotten, als ob man "die Leute über ihre eigenen Erfahrungen sprechen lässt", ist eine Ausrede.

 
Sergey Voytsekhovsky:

Wenn ich Sie richtig verstehe, ist dies der richtige Weg. Als erfahrener Genosse können Sie mir bitte sagen, ob ein solcher Filter für die Erfassung von Neugeborenenpositionen geeignet ist? Oder gibt es vielleicht eine korrektere Option?

Meiner Meinung nach ist diese Linie

         if(trans.type != TRADE_TRANSACTION_ORDER_DELETE)

unnötig. Und generell bin ich gerade dabei, die OnTradeTransaction-Operation für folgende Variante zu überdenken

  if(trans.type == TRADE_TRANSACTION_HISTORY_ADD)

Zum Zeitpunkt des Hinzufügens eines Geschäfts haben wir kein Ticket für die Bestellung, die das Geschäft erstellt hat. Aber wenn wir ein Ticket für den Auftrag und seine Eigenschaften benötigen, wie ich jetzt den Eröffnungskurs des Auftrags nicht deaktivieren Grid Step wegen Slippage, dann ist es die beste Variante. imho.

Im Allgemeinen bin ich ein Befürworter des Schreibens für eine bestimmte Aufgabe. Im Gegensatz dazu hat SB einen hohen Grad an Universalität und erfordert zusätzliche Variablen, die manchmal absolut unnötig sind.

 
Artyom Trishkin:

Nun, Sie haben in Rot hervorgehoben, was Sie nicht wussten. Was war das Problem? Wie hat sie sich manifestiert? Und was war die neue Methode?

Und zu den Fehlermeldungen: "richtig oder falsch", aber wenn Sie es melden wollen, dann tun Sie es. Und wenn Sie nicht wollen, dann wollen Sie nicht. Und sich abzuschotten, als wäre es eine Ausrede, "die Leute über sich selbst reden zu lassen".

Irgendwo auf meinen alten Festplatten habe ich noch die alten Terminals. Wenn ich sie finde, werde ich Ihnen die alte und die neue Bibliothek zeigen. Dann werden wir ein sachliches Gespräch führen. Ansonsten weiß ich, dass Sie das nicht tun, also was gibt es da zu reden? Wie kann man erklären, wie kann man zeigen, was jetzt nicht da ist.
 
Alexey Viktorov:

Meiner Meinung nach ist diese Linie

unnötig. Generell überdenke ich derzeit die Operation OnTradeTransaction für die folgende Variante

Zum Zeitpunkt des Hinzufügens eines Geschäfts gibt es kein Ticket für den Auftrag, der das Geschäft ausgelöst hat. Aber wenn Sie ein Ticket für den Auftrag und seine Eigenschaften benötigen, so wie ich jetzt den Eröffnungskurs des Auftrags benötige, damit der Rasterschritt nicht aufgrund von Slippage umgeworfen wird, dann ist dies imho die beste Option.

Generell bin ich ein Befürworter der Entwicklung für eine bestimmte Aufgabe. Und die UB hat Universalität hineingepackt, was zusätzliche, manchmal völlig unnötige Variablen erfordert.

Vielen Dank für den Hinweis auf die richtige Richtung. Habe es so gemacht (unten, scheint zu funktionieren):

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//---
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
      {
         if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN) // открылась позиция
            {
               int SizeArrayPosition = ArraySize(ArrayPosition);
               ArrayResize(ArrayPosition,SizeArrayPosition+1);
               
               if(PositionSelectByTicket(trans.position)){
               ArrayPosition[SizeArrayPosition].ticket_pos = trans.position;
               ArrayPosition[SizeArrayPosition].open_price = trans.price;
               ArrayPosition[SizeArrayPosition].open_tyme  = (datetime)PositionGetInteger(POSITION_TIME);
               ArrayPosition[SizeArrayPosition].type       = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
               ArrayPosition[SizeArrayPosition].kod_clana  = 0;
               
               Print("\n"
               "Открылась новая позиция: ticket = ",ArrayPosition[SizeArrayPosition].ticket_pos);}}}
  }

Jetzt rätsele ich, wie ich die Ticker von Positionen erfassen kann, die mit Take Profit oder durch einen direkten Auftrag geschlossen wurden. Wir brauchen nur Ticks von ihnen, um diese Positionen aus dem Hauptfeld der Positionen zu entfernen.

 
Sergey Voytsekhovsky:

Ich bin sehr dankbar für den Hinweis auf die richtige Richtung. Ich habe dies getan (siehe unten, scheint zu funktionieren):

Jetzt frage ich mich, wie ich die Ticks von Positionen, die mit Take-Profit oder durch direkte Order geschlossen wurden, einfangen kann. Wir brauchen nur Ticks von ihnen, um diese Positionen aus dem Hauptpositionsfeld zu entfernen.

Ich würde einen Scheck für das Symbol und den Magier hinzufügen.

    if(PositionSelectByTicket(trans.position) && PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == magick)
     {
      if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN)

Hier ist ein Fragment meines Codes, in dem das Schließen der Position erkannt wird.

    if(!PositionSelectByTicket(trans.position))
     {
      HistorySelectByPosition(trans.position);
      ulong ordTicket = HistoryOrderGetTicket(0);
      if(HistoryOrderGetInteger(ordTicket, ORDER_MAGIC) == magick && HistoryOrderGetString(ordTicket, ORDER_SYMBOL) == _Symbol)
       {

Wir können auch nach den Gründen für die Schließung aus der Aufzählung ENUM_DEAL_REASON unterteilen

In einem anderen Expert Advisor

    if(!PositionSelectByTicket(trans.position))
     {
      if(trans.symbol == _Symbol && HistorySelectByPosition(HistoryDealGetInteger(trans.deal, DEAL_POSITION_ID)))
       {
        int dealTotal = HistoryDealsTotal();
        long posMagic = 0;
        ulong dealTicketIN = HistoryDealGetTicket(0);
        if(HistoryDealGetInteger(dealTicketIN, DEAL_ENTRY) == DEAL_ENTRY_IN)
          posMagic = HistoryDealGetInteger(dealTicketIN, DEAL_MAGIC);
        if(posMagic == magick)
         {
          ulong dealTicketOUT = HistoryDealGetTicket(1);
          if(HistoryDealGetInteger(dealTicketOUT, DEAL_ENTRY) == DEAL_ENTRY_OUT)
           {

Im ersten Fall brauche ich einen Auftrag, im zweiten Fall reicht ein Geschäft. Wenn ich etwas benötige, schreibe ich es im Allgemeinen.

 
Alexey Viktorov:

Ich würde auch eine Prüfung für Symbol und Magie hinzufügen

Hier ist ein Fragment meines Codes, in dem das Schließen der Position erkannt wird.

Wir können auch nach den Gründen für die Schließung aus der Aufzählung ENUM_DEAL_REASON unterteilen

Hier in einem anderen Expert Advisor

Im ersten Fall brauche ich einen Auftrag, im zweiten Fall reicht der Handel. Im Allgemeinen schreibe ich sie, wenn ich sie brauche.

Guten Abend. Ihr Entgegenkommen und Ihre Rücksichtnahme machen mir große Ehre. Vielen Dank. Wie die Jugendlichen sagen - Respekt und Respekt.

Ich danke Ihnen für Ihren guten Rat. Zum einen sind sie nicht sehr viel im Moment benötigt, ist mein Expert Advisor nicht und wird wahrscheinlich nicht alle Konkurrenten, weil es Hochfrequenz ist, eine Menge von kleinen Positionen. Er erstickt an sich selbst, wo sonst kann er sich mit anderen messen? Natürlich, wenn es dazu kommt, wird es einen im Terminal und auf dem Konto haben. Das zweite ist wahrscheinlich weit hergeholt, ich weiß nur noch nicht viel, aber vielleicht spart es ein wenig Ressourcen.

Ihre Beispiele sind gut, ich werde sie auf jeden Fall abspeichern, aber ich habe kein Ticket, keine Bestellung, kein Geschäft. Genauer gesagt, ich habe Hunderte von ihnen und weiß nicht, welche ich jetzt schließen werde. Sie haben mich darauf hingewiesen, dass die Tatsache, eine Position zu schließen, aus meinen Berechnungen herausgenommen werden kann, und ich werde es jetzt versuchen.

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)

Ich werde versuchen, alles auszudrucken, was im Fluss gedruckt wird. Mein Expert Advisor wird ein Positionsgenerator sein und weiß, wie man aktiv Positionen öffnet und gleichzeitig schließt. Das Einzige, was man tun muss, ist, diese Position (das Positionsticket) im Array/der Struktur zu finden und sie zu entfernen. Es ist also folgendermaßen.

Und wie die Schreibmaschine, werde ich versuchen, ein Beispiel-Code aus der Referenz zu verwenden, in dem Abschnitt über diese Funktion, ist es dort aufgerufen:

//|OnTradeTransaction_Sample.mq5 |
//| Copyright 2018, MetaQuotes Software Corp.
//|https://www.mql5.com ||
//+------------------------------------------------------------------+
#property copyright"Copyright 2018, MetaQuotes Software Corp."
#property link"https://www.mql5.com"
#Eigenschaft Version"1.00"
#property description"TradeTransaction event listener example"

 
Sergey Voytsekhovsky:

Guten Abend. Ihr Entgegenkommen und Ihre Rücksichtnahme machen mir Ehre. Vielen Dank. Wie die jungen Leute sagen: Respekt und Respekt.

Ich danke Ihnen für Ihren klugen Rat. Ich schalte Magik und das Symbol fast bewusst nicht ein, erstens, weil sie im Moment nicht so sehr gebraucht werden, mein Expert Advisor hat keine Konkurrenten und wird wahrscheinlich auch keine haben, denn er hat eine hohe Frequenz, eine riesige Anzahl von Mindestpositionen. Er erstickt an sich selbst, wo sonst kann er sich mit anderen messen? Natürlich, wenn es dazu kommt, wird es einen im Terminal und auf dem Konto haben. Das zweite ist wahrscheinlich weit hergeholt, ich weiß nur noch nicht sehr viel, aber vielleicht spart es ein wenig Ressourcen.

Ihre Beispiele sind gut, ich werde sie auf jeden Fall abspeichern, aber ich habe kein Ticket, keine Bestellung, kein Geschäft. Genauer gesagt, ich habe Hunderte von ihnen und weiß nicht, welche ich jetzt schließen werde. Sie haben mir zu verstehen gegeben, dass die Tatsache, eine Position zu schließen, aus dem System herausgenommen und von meinen Berechnungen abgezogen werden kann.

Ich werde versuchen, alles auszudrucken, was im Fluss gedruckt wird. Mein Expert Advisor wird ein Positionsgenerator sein und weiß, wie man aktiv Positionen öffnet und gleichzeitig schließt. Das Einzige, was man tun muss, ist, diese Position (das Positionsticket) im Array/der Struktur zu finden und sie zu entfernen. Es ist also folgendermaßen.

Und als Schreibmaschine werde ich versuchen, den Beispielcode aus der Referenz zu verwenden, im Abschnitt über diese Funktion, sie wird dort aufgerufen:

Es ist immer schön, mein kleines Wissen mit jemandem zu teilen, der auf der Grundlage dieser Tipps selbst etwas aus der Dokumentation herausfindet. I.A. Krylov. Der Kuckuck lobt den Hahn, weil er den Kuckuck lobt. )))

Wenn Sie einen EA nur für sich selbst schreiben, können Sie sich natürlich einige Freiheiten herausnehmen. Wenn Sie es nicht für nötig halten, das Symbol und den Magier zu überprüfen, dann lassen Sie es.

Über den Hervorgehobenen:

Es gibt alles: das Positionsticket, das Auftragsticket und das Transaktionsticket. Und es ist nicht einmal schwierig, eine Handels- und / oder Auftragseröffnungsposition zu ziehen. Es ist alles in der MqlTradeTransaction Struktur


    if(!PositionSelectByTicket(trans.position)) // Если позицию выбрать не получилось, значит она закрыта
     {
      HistorySelectByPosition(trans.position); // Получим список ордеров и сделок относящихся к этой, конкретной позиции
      ulong ordTicket = HistoryOrderGetTicket(0); // Получили тикет ордера который породил сделку и позицию.
      if(HistoryOrderGetInteger(ordTicket, ORDER_MAGIC) == magick && HistoryOrderGetString(ordTicket, ORDER_SYMBOL) == _Symbol)
       {
 
Если позицию выбрать не получилось, значит она закрыта 
Ой-ли? 
 
Алексей Тарабанов:

Alexey, es bezieht sich alles nur auf die Behandlung des OnTradeTransaction-Ereignisses

Ein Ereignis ist eingetreten, ein Handel, der eine Position schließt, wurde ausgeführt. Die Stelle ist in diesem Moment bereits vergeben. Dies kann bestätigt werden , indem Sie die Liste der Aufträge und Geschäfte (die nicht im Code enthalten sind) auswählen und lesen

          ulong dealTicketOUT = HistoryDealGetTicket(1);
          if(HistoryDealGetInteger(dealTicketOUT, DEAL_ENTRY) == DEAL_ENTRY_OUT)
Dabei ist zu beachten, dass es sich um ein kleines Konto handelt, bei dem die Position in der Regel nur zwei Aufträge und zwei Trades umfasst.
Grund der Beschwerde: