Frage zur Funktion OnTradeTransaction - Seite 5

 
papaklass:

OnTradeTransaction() ist der RUNNER eines Handelsereignisses. Es spielt keine Rolle, was das Ereignis ausgelöst hat, wichtig ist nur, dass das Ereignis eingetreten ist.

Hier ist ein Auszug aus der Dokumentation:

OrderSend() / OrderSendAsync() sind TRADE FUNCTIONS.

Für OnTradeTransaction() macht es keinen Unterschied, welche Funktion Sie zum Senden des Handelsauftrags OrderSend() oder OrderSendAsync() verwendet haben.

Ich habe es so viele Male gelesen, bevor ich das Thema ... Ich werde kein Wort sagen.

Dennoch komme ich zu dem Schluss, dass es wahrscheinlicher ist, eine Transaktion in einem Haufen zu verlieren als eine Transaktion in einer Sekunde, und vielleicht nicht einmal eine (Sekunde). Das ist genau das, was ich herauszufinden versuche. Ich versuche, Ihre Meinung dazu zu erfahren. Wie hoch ist die Wahrscheinlichkeit, eine Transaktion zu verlieren, wenn sie relativ selten und einmalig ist?

 
papaklass:
Was die Wahrscheinlichkeiten angeht, weiß ich es nicht.

Ich werde mich auf Michaels Einzelmeinung verlassen müssen, die auf seinen eigenen Erfahrungen beruht. Wenn er in einem halben Jahr aus einem Stapel von Aufträgen kein einziges Geschäft verloren hat, dann gehen wir davon aus, dass auch ein einziger Auftrag nicht verloren gehen wird.

Ich bekomme langsam den Dreh raus und versuche, die Logik nicht zu verletzen, aber manchmal kommt das eine dem anderen in die Quere...

 
AlexeyVik:

Wir werden uns auf Michaels Einzelmeinung verlassen müssen, die auf seinen eigenen Erfahrungen beruht. Wenn er in sechs Monaten keine einzige Transaktion aus einem Stapel von Aufträgen verloren hat, dann gehen wir davon aus, dass auch ein einziger Auftrag nicht verloren gehen wird.

Ich meistere sie langsam und versuche, die Logik nicht zu verletzen, aber manchmal stellt sich heraus, dass das eine das andere stört...

Alexej, stellen Sie sich eine einfache Frage:

Was ist besser, nach jedem Befehl in der Historie zu wühlen, oder 1 Mal, oder vielleicht nie, um den Auftrag zu überprüfen (OnTradeTransaction wurde nicht ausgelöst)?

Validierung ist nicht einfach zu implementieren (mein Beispiel ist übrigens fehlerhaft), aber das Hauptprinzip ist, dass JEDER Auftrag seine eigene Magie hat.

Und noch eine Sache. Ich habe bereits gesagt, dass es jedem freisteht, seinen eigenen Weg zu gehen....

 
Mikalas:

Alexey, stellen Sie sich eine einfache Frage:

Ist es besser, die Historie nach jedem Befehl zu durchforsten oder den Auftrag (OnTradeTransaction hat nicht funktioniert) einmal oder nie zu überprüfen?

Validierung ist nicht einfach zu implementieren (mein Beispiel ist übrigens fehlerhaft), aber das Hauptprinzip ist, dass JEDER Auftrag seine eigene Magie hat.

Und noch eine Sache. Ich habe bereits gesagt, dass es jedem freisteht, seinen eigenen Weg zu gehen....

Michael, es ist die einfache Antwort auf diese einfache Frage, die mich in diese ganze Diskussion gebracht hat. Und bis jetzt habe ich noch nicht vor, es aufzugeben. Aber ich kann immer noch nicht verstehen, ob der Transaktionsverlust nach dem OrderSend()-Befehl oder der Aktivierung der Pending Order oder während der Schließung der Position mit Stop/Stop möglich ist.

Aus Ihrer ersten Antwort habe ich verstanden, dass auch OrderSendAsync() Sie nicht verlieren Transaktion. Ich versuche, das zu verstehen, um zu entscheiden, ob es notwendig ist, solche eher seltenen Transaktionen zu überprüfen. Außerdem, wenn man berücksichtigt, was ich zugewiesen habe.

Rein logisch gesehen, kann die Transaktion nicht verloren gehen, wenn OrderSend() nicht beendet wird, bevor sie eine Antwort erhält. Aber die Aktivierung eines schwebenden Auftrags und das Schließen einer Position passen nicht in meine Logik. Wenn eine Transaktion in diesem Fall im MT5 ausgelöst wird, geht sie nicht verloren, aber wenn sie über einen Server... Ich weiß es nicht. (Aber ich nehme an, die Intuition sagt, dass der Server mir eine Antwort sendet und OnTradeTransaction() aktiviert.

 

Leute, hier ist das Problem:

Wenn ich eine Position eröffne, behandelt OnTradeTransaction nur TRADE_TRANSACTION_DEAL_ADD... Alles ist in Ordnung.

Wird z.B. ein SellStop gesetzt, wird nur TRADE_TRANSACTION_ORDER_ADD ausgelöst... Auch hier ist alles normal.

Aber wenn ich eine Position und einen schwebenden Auftrag setze, funktioniert TRADE_TRANSACTION_DEAL_ADD und TRADE_TRANSACTION_ORDER_ADD funktioniert zweimal

Warum ist das so?

#include <Trade\Trade.mqh>


double point, FirstOpenPrice, TakeProfit, SecondOpenPrice, MaxPrice , MinPrice, SecondTake;
bool  NewStart;
       
    CTrade Trade;
    MqlTradeResult v_res, v_result;
    MqlTradeTransaction v_Trans;

/*******************Expert initialization function*******************/
int OnInit()
{
 point = _Digits%2 == 0 ? _Point : _Point * 10;
  NewStart = true;
   return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
{
 if(NewStart)
  {
   Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, 0.1, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0.0, 0.0);
    Trade.SellStop(0.78, SymbolInfoDouble(_Symbol, SYMBOL_BID)-52*point, Symbol(), 0.0, 0.0, 0, 0);
   NewStart = false;
  }
}/*******************************************************************/

/*********************TradeTransaction function**********************/
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{

  ENUM_TRADE_TRANSACTION_TYPE type = (ENUM_TRADE_TRANSACTION_TYPE)trans.type;
   
   switch(type)
    {
     case TRADE_TRANSACTION_ORDER_ADD:
      {
       Print("order add    * Тикет ордера * ", trans.order);
        Print("order add    * Объём ордера * ", trans.volume);
       break;
      }
     case TRADE_TRANSACTION_DEAL_ADD:
      {
       Print("deal add    * Тикет сделки * ", trans.deal);
        Print("deal add    * Объём сделки * ", trans.volume);
       break;
      }
     default: break;
    }

}/*******************************************************************/
 
AlexeyVik:

Leute, hier ist das Problem:

Wenn ich eine Position eröffne, behandelt OnTradeTransaction nur TRADE_TRANSACTION_DEAL_ADD... Alles ist in Ordnung.

Wird z.B. ein SellStop gesetzt, wird nur TRADE_TRANSACTION_ORDER_ADD ausgelöst... Auch hier ist alles normal.

Aber wenn ich eine Position und einen schwebenden Auftrag setze, funktioniert TRADE_TRANSACTION_DEAL_ADD und TRADE_TRANSACTION_ORDER_ADD funktioniert zweimal

Warum ist das so?

Sie müssen sich irgendwo irren. In beiden Fällen muss es mindestens zwei Ereignisse geben: TRADE_TRANSACTION_ORDER_ADD und TRADE_TRANSACTION_DEAL_ADD. Warum Sie TRADE_TRANSACTION_ORDER_ADD nicht erhalten, ist unklar.

Versuchen Sie, den Schalter auszukommentieren und das vollständige Protokoll aller in OnTradeTransaction empfangenen Ereignisse zu drucken.

 
C-4:

Sie haben da etwas falsch verstanden. In beiden Fällen muss es mindestens zwei Ereignisse geben: TRADE_TRANSACTION_ORDER_ADD und TRADE_TRANSACTION_DEAL_ADD. Warum Sie TRADE_TRANSACTION_ORDER_ADD nicht erhalten, ist unklar.

Versuchen Sie, den Schalter auszukommentieren und das vollständige Protokoll aller in OnTradeTransaction empfangenen Ereignisse zu drucken.

Ja, ich habe es versucht. Print(EnumToString(type)) wurde vor switch(type) gedruckt; es wurde genau so gedruckt, wie ich es beschrieben habe.

Hier sind die wiederholten Versuche.




 

Ich habe Ihren Code selbst überprüft. - Alles funktioniert einwandfrei.

Option, ohneeinen Stopp-Auftrag zur Nachverfolgung zu senden:

2015.02.10 18:32:03.332 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_DEAL_ADD

2015.02.10 18:32:03.331 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_HISTORY_ADD

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_DELETE

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

Option zum Senden eines Stoppauftrags:

2015.02.10 18:35:59.633 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_UPDATE

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_DEAL_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_HISTORY_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_DELETE

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD


s.e., die Zeit für den vollen Zyklus war eine angenehme Überraschung: konstant 60-70 msec. Gut gemacht, Entwickler!
 
C-4:

Ich habe Ihren Code selbst überprüft. - Alles funktioniert einwandfrei.

Variante, ohne anschließendeinen Stoppauftrag zu senden:

Option mit der Übermittlung eines Stop-Auftrags:

s.e., die Zeit für den vollen Zyklus war angenehm überrascht: stabil 60-70 msec. Glückwunsch an die Entwickler, sie haben gute Arbeit geleistet!

Anscheinend ist dies der Verlust von Transaktionen... und, vor allem, (Auszug aus der Dokumentation)

Und die Reihenfolge, in der diese Transaktionen am Terminal ankommen, ist nicht garantiert

Vasily, ist dies ein Tester oder eine Demo? Ich habe eine Probe des Testers. Ich frage mich, ob es einen Unterschied zwischen der OnTradeTransaction-Operation im Testgerät und im Konto gibt. Ich werde es bei Gelegenheit überprüfen.


ps; Es stellt sich heraus, dass nach dem Verlust einer Transaktion diese plötzlich bei der nächsten OnTradeTransaction-Aktivierung erscheint.

 
AlexeyVik:

Anscheinend ist dies der Verlust von Transaktionen... und, vor allem, (Auszug aus der Dokumentation)

Vasily, ist dies ein Tester oder eine Demo? Ich habe Proben des Testers. Ich frage mich, ob es einen Unterschied zwischen der Auslösung von OnTradeTransaction im Testgerät und im Konto gibt. Ich werde es bei Gelegenheit überprüfen.


ps; Es stellt sich heraus, dass nach dem Verlust einer Transaktion diese plötzlich wieder erscheint, wenn OnTradeTransaction das nächste Mal aktiviert wird.

Nein, die Transaktionen gehen nicht verloren, sie können nur nicht in einer bestimmten Reihenfolge erfolgen.

Nur TRADE_TRANSACTION_REQUEST steht immer an erster Stelle, sonst würde man kein Ticket für den Auftrag bekommen.

Lesen Sie die Dokumentation VORSICHTIG durch.