OnTradeTransaction-Verarbeitung - Seite 3

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

In diesem Fall muss ich das Ticket des Auftrags vom Anforderer noch irgendwo speichern, um es mit dem Ticket des Handels zu vergleichen. Und ich möchte einfach weg von der Speicherung aller lokalen Variablen und Informationen ausschließlich vom Markt/Terminal erhalten, um lokale Infrastrukturrisiken auszugleichen.

Sie sind ein bisschen naiv.

Der Magier ist für alle Gewerke dieses EA gleich!

Aber die Aufträge sind unterschiedlich (einzigartig)!

 
prostotrader:

Ich handele mit Openvashka auf real und teste auf demo, aber ich habe nicht mehrere Auslöser.

Posten Sie Ihr Stück Code fürTRADE_TRANSACTION_DEAL_ADD

Das ist mir gerade heute passiert. Oben wurde ein Ausschnitt aus dem Protokoll von 2 identischen Transaktionen für denselben Roboter veröffentlicht.

2019.02.08 10:55:29 [INFO]: ( PChBreak_RTS-3.19_22) TRADE_TRANSACTION_DEAL_ADD
HANDEL_TRANSAKTION_GESCHAEFT_HINZUFUEGEN
Symbol: RTS-3.19
Deal-Ticket: 12674810
Angebotsart: DEAL_TYPE_BUY
Bestellschein: 82646001
Auftragsart: ORDER_TYPE_BUY
Auftragsstatus: ORDER_STATE_STARTED
Art der Auftragszeit: ORDER_TIME_GTC
Ablauf der Bestellung: 1970.01.01 00:00
Preis: 119700
Preisauslöser: 0
Stopp-Loss: 0
Gewinnmitnahme: 0
Band: 1
Standpunkt: 82646001
Position von: 0

2019.02.08 10:55:32 [INFO]: ( PChBreak_RTS-3.19_22 ) TRADE_TRANSACTION_DEAL_ADD
HANDEL_TRANSAKTION_GESCHAEFT_HINZUFUEGEN
Symbol: RTS-3.19
Deal-Ticket: 12674810
Angebotsart: DEAL_TYPE_BUY
Bestellschein: 82646001
Auftragsart: ORDER_TYPE_BUY
Auftragsstatus: ORDER_STATE_STARTED
Art der Auftragszeit: ORDER_TIME_GTC
Ablauf der Bestellung: 1970.01.01 00:00
Preis: 119700
Preisauslöser: 0
Stopp-Loss: 0
Gewinnmitnahme: 0
Band: 1
Standpunkt: 82646001
Position von: 0

Code auf deal_add

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;

Nach einem Fehler mit zwei identischen Transaktionen habe ich eine Prüfung hinzugefügt, dass das Ticket der aktuellen Transaktion nicht mit der vorherigen identisch ist.

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

Das ist mir gerade heute passiert. Oben habe ich einen Ausschnitt aus dem Protokoll von 2 identischen Transaktionen für denselben Roboter veröffentlicht.

2019.02.08 10:55:29 [INFO]: ( PChBreak_RTS-3.19_22 ) TRADE_TRANSACTION_DEAL_ADD
HANDEL_TRANSAKTION_GESCHAEFT_HINZUFUEGEN
Symbol: RTS-3.19
Deal-Ticket: 12674810
Angebotsart: DEAL_TYPE_BUY
Bestellschein: 82646001
Auftragsart: ORDER_TYPE_BUY
Auftragsstatus: ORDER_STATE_STARTED
.........

Code für deal_add

Nach einem Fehler mit zwei identischen Transaktionen habe ich eine Prüfung hinzugefügt, dass das Ticket der aktuellen Transaktion nicht mit der vorherigen identisch ist.

Ich hab's.

Auftragsstatus: ORDER_STATE_STARTED - DIES KANN NICHT inTRADE_TRANSACTION_DEAL_ADD sein!

Hinzugefügt

Ich bin sicher, dass Sie das nicht wissen (undIlja Baranow auch nicht).

switch(trans.type)
  {
    case TRADE_TRANSACTION_DEAL_ADD:
    //Place you code here
    break;  
  }

Hinzugefügt

In diesem Forum gibt es einen Bereich "Börsenhandel", in dem Sie besser kommunizieren sollten...

 
prostotrader:

Ich verstehe.

Auftragsstatus: ORDER_STATE_STARTED - DIES KANN NICHT in TRADE_TRANSACTION_DEAL_ADDsein!

Hinzugefügt

Ich bin sicher, dass Sie das nicht tun.

Hinzugefügt

In diesem Forum gibt es einen Bereich "Börsenhandel", in dem Sie besser kommunizieren sollten...

Ich hätte es schon längst verschoben - aber@Ilya Child hat nie gesagt, ob er an der Börse handelt oder nur Netting Forex. Ich sitze hier und warte...

 
Vladimir Karputov:

Ich hätte es schon vor langer Zeit verschoben - aber@Ilya Child hat nie gesagt, ob er an der Börse handelt oder nur Netting Forex betreibt. Ich sitze hier und warte...

Symbol: RTS-3.19 ist FORTS

 
prostotrader:

Symbol: RTS-3.19 ist FORTS

Das verstehe ichnicht. Es gibt eine Börse, es gibt Devisen. Alles andere liegt außerhalb des Rahmens.

 
Vladimir Karputov:

Dasverstehe ich nicht. Es gibt eine Börse, es gibt Devisen. Alles andere kommt nicht in Frage.

FORTS ist RTS Futures and Options - die Terminmarktabteilung der Moskauer Börse:)

 
prostotrader:

Ich verstehe.

Auftragsstatus: ORDER_STATE_STARTED - DIES KANN NICHT inTRADE_TRANSACTION_DEAL_ADD sein!

Hinzugefügt

Ich bin sicher, dass Sie das nicht wissen (undIlja Baranow auch nicht).

Hinzugefügt

Es gibt einen Abschnitt "Exchange Trading" in diesem Forum, dort sollten Sie besser kommunizieren...

Ich kann Ihnen nicht ganz folgen. Hier habe ich die Verarbeitung der Transaktion.

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;

Bezüglich des Status des Auftrags in der Transaktion. Sie wissen schon, dass ich mir das nicht selbst ausdenke. Bei allen deal_add-Transaktionen ist dies der 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 kam herein, und es wurde keine Position angezeigt, und es wurde eine nicht existierende Position in der Schwebe gehalten.

Hinzugefügt.

Eine Deal_add-Transaktion kam an, aber die Position erschien nicht, und die schwebenden Aufträge für die nicht existierende Position wurden platziert. Die Transaktionsart ist Verkaufen, die Auftragsart ist Kaufen. Obwohl das Limit ursprünglich Sell_limit war

 
fxsaber:

Die Begrenzer selbst, die TP/SL erfordern, können teilweise ausgeführt werden. Der TP in Form von Begrenzern ist der gleiche. Zum Beispiel wird TP um ein Drittel des Volumens ausgeführt - SL muss um den gleichen Betrag reduziert werden.

Alles in allem eine ziemlich unangenehme Logik, um alle Tricks zu erkennen.


Die Aufgabe sollte in OnTrade implementiert werden. Die Umsetzung dürfte nicht allzu schwierig sein.

Aufgabe

Wir haben schwebende Aufträge auf Netting (kann unterschiedlich gerichtet sein und eine beliebige Anzahl von jeder Art). Jedes Mal, wenn der ursprüngliche schwebende Auftrag ausgelöst wird, müssen wir seinen SL/TP als schwebenden Stop/Limit-Auftrag festlegen. Dann sollten die SL/TP voneinander abhängig sein: Sobald der Auftrag ausgelöst wird, wird der zweite gelöscht. Die anfänglichen und SL/TP schwebenden Aufträge können teilweise ausgelöst werden. Der Expert Advisor kann jederzeit neu geladen werden, auch durch Übertragung auf ein anderes Terminal.


Lösung

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

input int inTP = 100;
input int inSL = 200;
sinput MAGIC_TYPE inMagicNumber = 0;
sinput string inStrKey = "SLTP";

int GetAmountDeals()
{
  return(HistorySelect(0, INT_MAX) ? HistoryDealsTotal() : 0);
}

bool IsMyString( const string Str, const string Key )
{
  return(StringSubstr(Str, 0, StringLen(Key)) == Key);
}

string ToMyString( const string Str, const string Key )
{
  return(Key + Str);
}

struct ORDER
{
  int Type;
  TICKET_TYPE Ticket;
  double Lots;
  double OpenPrice;
  MAGIC_TYPE Magic;
  string Comment;
  
  ORDER() : Type(OrderType()), Ticket(OrderTicket()), Lots(OrderLots()),
            OpenPrice(OrderOpenPrice()), Magic(OrderMagicNumber()), Comment(OrderComment())
  {
  }
};

#define _CS(A) ((!::IsStopped()) && (A))

bool GetPairOrder()
{
  bool Res = false;

  ORDER Order;
  Order.Type = 6 - Order.Type + ((Order.Type & 1) << 1);
  
  for (int i = OrdersTotal() - 1; _CS((i >= 0) && (!Res)); i--)
    Res = OrderSelect(i, SELECT_BY_POS) && (OrderType() == Order.Type) &&
          (OrderMagicNumber() == Order.Magic) && (OrderComment() == Order.Comment);
    
  return(Res);
}

void CheckSLTP( const string Symb, const MAGIC_TYPE Magic, const string Key, const int Slip = 100 )
{    
  for (int i = OrdersTotal() - 1; _CS(i >= 0); i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() > OP_SELL)  &&
        (OrderMagicNumber() == Magic) && (OrderSymbol() == Symb) && IsMyString(OrderComment(), Key))
    {
      const ORDER Order;      
      
      if (!_CS(GetPairOrder()))
      {
        OrderDelete(Order.Ticket);
        
        i = OrdersTotal();
      }
      else if (_CS(OrderLots() < Order.Lots))
      {
        if (OrderDelete(Order.Ticket))
          OrderSend(OrderSymbol(), Order.Type, OrderLots(), Order.OpenPrice, Slip, 0, 0, Order.Comment, Order.Magic);
          
        i = OrdersTotal();          
      }
    }
}

void CheckFill( const string Symb, const MAGIC_TYPE Magic, const string Key, const int SL, const int TP )
{    
  static int PrevDeals = GetAmountDeals();
  
  const double point = SymbolInfoDouble(Symb, SYMBOL_POINT);
  const int NewDeals = GetAmountDeals();
  
  while (_CS(PrevDeals < NewDeals))
  {
    const ulong Ticket = HistoryDealGetTicket(PrevDeals);
    
    if (Ticket && (HistoryDealGetInteger(Ticket, DEAL_MAGIC) == Magic) &&
                  (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symb) &&
                  !IsMyString(HistoryDealGetString(Ticket, DEAL_COMMENT), Key))
    {
      const double Lots = HistoryDealGetDouble(Ticket, DEAL_VOLUME);
      const double Price = HistoryDealGetDouble(Ticket, DEAL_PRICE);
      const int Type = 1 - (int)HistoryDealGetInteger(Ticket, DEAL_TYPE);
      const double Koef = Type ? -point : point;
      const string Comment = ToMyString((string)Ticket, Key);
      
      if (OrderSend(Symb, Type + OP_BUYLIMIT, Lots, Price - Koef * TP, 0, 0, 0, Comment))
        OrderSend(Symb, Type + OP_BUYSTOP, Lots, Price + Koef * SL, 0, 0, 0, Comment);
    }
    
    PrevDeals++;
  }
}

void System()
{
  CheckFill(_Symbol, inMagicNumber, inStrKey, inSL, inTP);
  CheckSLTP(_Symbol, inMagicNumber, inStrKey);
}

void OnTrade()
{
  System();
}

void OnInit()
{
  OnTrade();
}
 
Илья Ребенок:

Ich kann Ihnen nicht ganz folgen. Hier ist meine Transaktionsverarbeitung


Sie haben nicht switch(trans.type)

void OnTradeTransaction( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result )
{
  switch(trans.type) //<<---- ОТФИЛЬТРОВАТЬ ПО ТИПУ ТРАЗАКЦИИ!!!!!!!!!!!!!!!!!!!!!!
  {
   //А вот здесь уже TRADE_TRANSACTION_DEAL_ADD


  }
}