OnTradeTransaction-Verarbeitung - Seite 5

 
fxsaber:

Kretin.

Ich dachte, du meinst dich.

Was ist aus"Er wird es herausfinden, wenn er es will."?

 
fxsaber:

Es ist einfacher für mich, in einem Beitrag zu antworten, als Dutzende von "Empfehlungen" abzugeben.

Wenn er es will, wird er es herausfinden.

Früher wollte ich... Aber Ihr Code ist etwas anderes.
 
Alexey Viktorov:
Es war einmal eine Zeit, da wollte ich... Aber Ihr Code ist nicht von dieser Welt.

In diesem Fall brauchen Sie nur ein wenig Wissen über MT4/5.

 
fxsaber:

In diesem Fall brauchen Sie nur ein wenig Wissen über MT4/5.

Leider weiß ich ein wenig mehr als nur ein wenig.

Ich habe Ihnen schon einmal gesagt, dass Sie Ihren Code wie einen Stöpsel in jedes Fass rein- und rausstecken. Diejenigen, die es brauchen, benutzen es schon lange und manche werben sogar damit. Aber sie dort aufzuerlegen, wo sie nicht unbedingt notwendig ist, ist einfach unanständig. Vor allem, wenn man die Programmierung in mql5 verstehen und einsteigen will, nicht durch Tricks.

 
Alexey Viktorov:

Leider weiß ich nur wenig mehr als ein wenig.

Ich habe Ihnen schon einmal gesagt, dass Sie Ihren Code aus geschäftlichen Gründen und ohne jeden Grund in jedes Fass stecken. Diejenigen, die es brauchen, benutzen es schon lange und manche werben sogar damit. Aber sie dort aufzuerlegen, wo sie nicht unbedingt notwendig ist, ist einfach unanständig. Vor allem, wenn man die Programmierung in mql5 verstehen und einsteigen will, nicht durch Tricks.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

OnTradeTransaction-Verarbeitung

fxsaber, 2019.02.08 13:24

Zeigen Sie mir die Lösung für das Problem des Verfassers des Zweigs.

Sie sehen, wenn Sie Behauptungen aufstellen, ist es keine schlechte Idee, sie in der Praxis irgendwie zu untermauern. Auf einigen Seiten ist keine OnTradeTransaction-Lösung erschienen. Und wenn dies der Fall ist, wird schnell klar, warum die gegebene Lösung so ist, wie sie ist, und nicht andersherum. Die Lösung sollte die Logik zeigen, nicht die Hölle aus ihr heraus. Wenn ich das Plug-in entferne, verliert der Quellcode kein bisschen von seiner Logik. Und Sie müssen nur die Logik (Idee) verstehen, mehr nicht.

Ich stimme mit dieser Aussage überein. Sobald die Logik verstanden ist, werden alle Includes verworfen und eigene erstellt. Das ist genau die Art und Weise, wie es vorgeschlagen wird: nicht ein Inlude zu beherrschen, sondern durch Code zu zeigen und nicht abzuschrecken, wie die Aufgabe, deren Lösung verlangt wird, funktionieren kann.

 

Hier komme ich auf die Ursache des Problems zurück. Und es stellen sich Fragen:

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

OnTradeTransaction-Verarbeitung

Ilja Kind, 2019.02.07 20:08

Guten Abend.

Leute, bitte helft mir, das zu klären. Das Problem ist wahrscheinlich nicht neu, aber ich habe keine eindeutige Lösung gefunden (weder in der Praxis noch in Foren).

Ich lasse 2 verschiedene Roboter im Terminal auf 2 verschiedenen Instrumenten laufen. Die Magie ist überall anders. Der Roboter setzt Pending-Limits und die Prozedur OnTradeTransaction erlaubt es mir, eine Transaktion zu erkennen und Pending-Stop-Orders mit dieser Transaktion zu platzieren.

Im Folgenden finden Sie den Code für das Handelsgeschäft

case TRADE_TRANSACTION_DEAL_ADD:
        {
         drop_info2("TRADE_TRANSACTION_DEAL_ADD\r\n"+TransactionDescription(trans));
         if((trans.deal_type==DEAL_TYPE_BUY || trans.deal_type==DEAL_TYPE_SELL) && trans.order!=0)
           {
            if(getIsDealOfExpert(trans.deal)) //функция проверки принадлежности сделки к роботу
              {
               drop_info2("Сделка наша");
               analyzeFilledOrder(trans.order,trans.volume); //процедура по выставлению отложенных стоп ордеров
              }
           }
        }
      break;

Dies ist der Code der Funktion, die prüft, ob das Geschäft zu einem Roboter gehört

bool getIsDealOfExpert(ulong dealTicket)
     {
      if(HistoryDealSelect(dealTicket) && HistoryDealGetInteger(dealTicket,DEAL_MAGIC)==magic_number && HistoryDealGetString(dealTicket,DEAL_SYMBOL)==symbol)
         return true;
      else
         return false;
     }

Dies ist der Code des Verfahrens für schwebende Stop-Aufträge

void analyzeFilledOrder(ulong orderTicket,double volume)
  {
   bool isFindOrder=false;
   string fullComment;
   ENUM_ORDER_TYPE orderType;
   if(getIsOrderOfExpert(orderTicket,true)) //Если ордер из сделки уже в истории
     {
      fullComment=HistoryOrderGetString(orderTicket,ORDER_COMMENT);
      orderType=ENUM_ORDER_TYPE(HistoryOrderGetInteger(orderTicket,ORDER_TYPE));
      isFindOrder=true; //локальная переменная, если нашли в истории
     }
   if(!isFindOrder && getIsOrderOfExpert(orderTicket,false)) //Если не нашли ордер в истории и ордер есть не в истории
     {
      fullComment=OrderGetString(ORDER_COMMENT); 
      orderType=ENUM_ORDER_TYPE(OrderGetInteger(ORDER_TYPE));
      isFindOrder=true; //локальная переменная, если нашли не в истории
     }
   if(isFindOrder) //если хоть где-то нашли, то выставляем отложенные стоп ордера
     {
     //выставляем стоп ордера

Dies ist der Code der Funktion für die Suche nach einem Auftrag in der Historie und aus der Historie

bool getIsOrderOfExpert(ulong OrderTicket,bool isHistory)
     {
      bool is_expert=false;
      //если ордер находится в истории
      if(isHistory)
        {
         if(HistoryOrderSelect(OrderTicket) && HistoryOrderGetInteger(OrderTicket,ORDER_MAGIC)==magic_number && HistoryOrderGetString(OrderTicket,ORDER_SYMBOL)==symbol)
            is_expert=true;
        }
      else
        {
         if(OrderSelect(OrderTicket) && OrderGetInteger(ORDER_MAGIC)==magic_number && OrderGetString(ORDER_SYMBOL)==symbol)
            is_expert=true;
        }
      return is_expert;
     }

Ich würde die Informationen über die eingehenden Transaktionen in den Protokolldateien in der Reihenfolge ausgeben, in der sie im Terminal empfangen werden. Jetzt habe ich ein Problem, das ich beim Handel mit einem Demokonto hatte:

Manchmal kommen Transaktionen in der folgenden Reihenfolge: TRADE_TRANSACTION_ORDER_DELETE, dann TRADE_TRANSACTION_DEAL_ADD, dann TRADE_TRANSACTION_HISTORY_ADD. In diesem Fall werden Stop-Aufträge oft nicht nach der Ausführung eines Geschäfts erteilt. Ich vermute, dass dies daran liegt, dass der Auftrag bereits gelöscht wurde, aber noch nicht in die Historie aufgenommen wurde. Das bedeutet, dass wir die Bestellung aus dem Geschäft weder in der Historie noch im Terminal finden können. Es ist zwar zweifelhaft, aber Tatsache ist, dass keine Stop-Order platziert wird, weil der Roboter sie nicht findet, nachdem er in allen Dimensionen nach der Order gesucht hat(isFindOrder=false). Die Reihenfolge der Transaktionen kann korrekt sein, aber der Auftrag ist trotzdem nicht zu finden. In allen Fällen erkennt der Roboter die Transaktion korrekt, kommt aber nicht dazu, Aufträge zu erteilen. Esgibt aber auch Fälle, in denen er korrekt arbeitet und Aufträge erteilt werden.

Ich habe verschiedene Ansätze ausprobiert, nichts funktioniert. Ich denke nun daran, zu Beginn der anstehenden Auftragserteilung ein 1-Sekunden-Intervall einzufügen. Ich weiß nicht, wo ich sonst noch graben soll.

Bitte teilen Sie uns Ihre Erfahrungen und Ideen mit.

Wie kann ich das hervorgehobene mit dem folgenden Satz in Einklang bringen?

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

OnTradeTransaction-Verarbeitung

Ilja Kind, 2019.02.07 20:20

Ich habe vergessen, hinzuzufügen, dass der Modus Netting ist. Die Position ist bei allen Robotern die gleiche. Das heißt, ein Roboter kaufte eine Position, der zweite kaufte sie, die TRADE_TRANSACTION_DEAL_ADD-Ereignisse kamen in umgekehrter Reihenfolge und schließlich sah der erste Roboter sie nicht.

Ja, und ich muss logischerweise einen Kommentar zum Auftrag vom Handel erhalten, die Position ist hier nicht sehr hilfreich.

Achten wir nicht auf den Tippfehler, der eine kaufte der andere kaufte... Die Hauptsache ist, dass es scheint, dass zwei EAs auf ein Symbol mit Kontotyp Netting arbeiten... Oder verstehe ich vielleicht etwas nicht?

 
Alexey Viktorov:

Achten wir nicht auf den Tippfehler, der eine kaufte der andere kaufte... Die Hauptsache ist, dass es aussieht, als ob zwei EAs auf dem gleichen Instrument mit dem Kontotyp Netting arbeiten... Oder verstehe ich vielleicht etwas nicht?

Es ist normal, mehrere EAs auf einem Netting-Symbol zu haben. Zum Beispiel die Netze. Es ist also durchaus möglich, dass die Netting-Position Null ist, es aber zwei SL und zwei TP gibt. Das Problem ist oben klar formuliert.

 
fxsaber:

Mehrere EAs sind die Norm für ein einziges Netting-Symbol. Zum Beispiel die Aufrechnung von Positionen. Es ist also durchaus möglich, dass die Netting-Position Null ist, es aber zwei SLs und zwei TPs gibt. Das Problem ist oben klar formuliert.

Wir können raten, was wir wollen. Ich würde gerne den "Transport Chief" hören. Immerhin habe ich seine Beiträge zitiert.

 
Alexey Viktorov:

Wir können uns ausdenken, was wir wollen. Ich möchte mit dem Transportleiter sprechen. Ich habe ihn zitiert.

Ich glaube, der Chef war so "eingeschüchtert", dass er nicht mehr auftauchen wird :)

 
Илья Ребенок:

Ich kann Ihnen nicht ganz folgen. Hier ist meine Transaktionsverarbeitung

Über den Status der Bestellung in der Transaktion. Sie wissen schon, dass ich mir das nicht selbst ausdenke. Alle deal_add-Transaktionen haben diesen Auftragsstatus. Bitte beachten Sie, dass es sich um einen Marktauftrag handelt, der vorher ein schwebender Auftrag war.

Jetzt haben wir einen weiteren Teil der Verwirrung. Eine deal_add-Transaktion flog herein und die Position erschien nicht, und die Pending-Position wurde auf die nicht existierende Position gesetzt.

Hinzugefügt.

Die Transaktion Deal_add wird gesendet, aber die Position wurde nicht platziert, und es wurde ein schwebender Auftrag für die nicht existierende Position platziert. Die Geschäftsart ist Verkaufen, die Auftragsart ist Kaufen. Obwohl das Limit ursprünglich Sell_limit war

Offensichtlich werden entweder die alten Daten nicht gelöscht oder es werden nicht initialisierte Daten übernommen.

Wenn ich einen deal_add habe, ist die Bestellung in der Regel bereits in der Historie, oder sie wurde bereits gelöscht, ist aber noch nicht in der Historie erschienen.

Es kann aber auch vorkommen, dass der Auftrag noch da ist und sich dann im Zustand der Bestellung befindet.

Aber das kann es zu diesem Zeitpunkt kaum sein.

Prüfen Sie bei der Auswahl eines Auftrags oder einer Geschichte, ob diese auch wirklich ausgewählt sind.