"Floating PositionSelect()-Fehler - Seite 4

 
prostotrader:

Noch einmal: für "Kandidaten", "Ärzte", "Professoren" und "Akademiker".

Jedes Ereignis, das zu OnTradeTransaction() kommt, kann verloren gehen

Deshalb halte ich es für einen Fehler, dass nach dem Empfang des sinnvollen EreignissesTRADE_TRANSACTION_HISTORY_ADD

werden die Daten im Terminal nicht aktualisiert!

In der Hilfe(https://www.mql5.com/ru/docs/basis/function/events#ontradetransaction):

Ein Handelsauftrag, der manuell vom Terminal oder über dieOrderSend()/OrderSendAsync()-Funktionen gesendet wird, kann auf dem Handelsserver mehrere aufeinanderfolgende Handelsgeschäfte erzeugen. Die Reihenfolge, in der diese Transaktionen im Terminal ankommen, ist nicht garantiert, so dass wir unseren Handelsalgorithmus nicht darauf aufbauen können, dass wir auf das Eintreffen einiger Transaktionen nach anderen warten. Außerdem können Transaktionen verloren gehen, wenn sie vom Server zum Terminal übertragen werden.

Es ist daher nicht klar, warum diese Funktion überhaupt benötigt wird. Sie sollten es nur nicht verwenden, das ist alles. Sie müssen die Geschichte der Aufträge und Geschäfte selbst analysieren.

 
Dmitry Fedoseev:

In der Hilfe(https://www.mql5.com/ru/docs/basis/function/events#ontradetransaction):

Es ist daher nicht klar, warum diese Funktion überhaupt benötigt wird. Sie sollten es nur nicht benutzen. Sie müssen die Historie der Aufträge und Abschlüsse selbst analysieren.

Danke. Außerdem müssen Sie auch nicht alle anderen Funktionen verwenden :) (nichts für ungut)
 

Wie bei Aufträgen, Positionen und Transaktionen.

Wie in der Hilfe beschrieben, ist die Reihenfolge der Transaktionen nicht garantiert - eine Transaktion der Auftragsübertragung in die Historie kann früher eingehen als eine Transaktion eines Geschäfts.
Die Änderung einer Position im Terminal ist ausschließlich das Ergebnis des Empfangs einer Handelstransaktion, so dass der Erhalt einer solchen Transaktion eine Garantie dafür ist, dass sich die Position geändert hat.
Die Einholung einer Transaktion zur Übertragung eines Auftrags in die Historie gewährleistet lediglich, dass der Auftrag nicht mehr aktiv (offen) ist und in die Auftragshistorie verschoben wurde.


Кроме того, транзакции могут потеряться при доставке от сервера к терминалу.

Was diesen Satz betrifft.

Sie scheint in der Dokumentation einer der ersten Versionen des Terminals mit asynchronem Handel geblieben zu sein. Sie wird in naher Zukunft entfernt werden. Die Schuldigen werden hingerichtet.

 
MQ Alexander:

Wie bei Aufträgen, Positionen und Transaktionen.

Wie in der Hilfe beschrieben, ist die Reihenfolge der Transaktionen nicht garantiert - eine Transaktion der Auftragsübertragung in die Historie kann früher eingehen als eine Transaktion eines Geschäfts.
Die Änderung einer Position im Terminal ist ausschließlich das Ergebnis des Empfangs einer Handelstransaktion, so dass der Erhalt dieser Transaktion eine Garantie dafür ist, dass sich die Position geändert hat.
Die Einholung einer Transaktion zur Übertragung eines Auftrags in die Historie gewährleistet lediglich, dass der Auftrag nicht mehr aktiv (offen) ist und in die Auftragshistorie verschoben wurde.


Was diesen Satz betrifft.

Sie scheint in der Dokumentation einer der ersten Versionen des Terminals mit asynchronem Handel geblieben zu sein. Sie wird in naher Zukunft entfernt werden. Die Schuldigen werden hingerichtet.

Herzlichen Dank!

Und ich ein Maschinengewehr (oder zumindest eine Pistole), um an der Schießerei teilzunehmen? :)

 

MQ Alexander!

Ich hätte gerne eine ausführlichere Erläuterung zu den Geschäften und Positionen.

Weil SIE geschrieben haben:

Изменение позиции в терминале происходит строго в результате получения сделочной транзакции, соответственно её получение является гарантией того что позиция поменялась.

Und in der Tat stellt sich folgendes heraus:

Test Expert Advisor build 1375 demo opening (wurde 2 mal ausgeführt)

//+------------------------------------------------------------------+
//|                                              Test_deff_order.mq5 |
//|                                                   Copyright 2016 |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016"
#property link      "https://www.mql5.com"
#property version   "1.00"
//
uint  order_req_id;
ulong order_ticket;
ulong magic=987142563;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   OrderPlace();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
    switch( trans.type )
    {
      case TRADE_TRANSACTION_REQUEST:
        if((order_req_id > 0) && (order_req_id==result.request_id))
        {
          if(result.retcode==TRADE_RETCODE_PLACED) order_ticket=result.order;
        }
      break;
      case TRADE_TRANSACTION_DEAL_ADD:
        if((order_ticket!=0) && (trans.order==order_ticket))
        {
         Print("Deal done. Ticket: ",trans.order);
        }
      break;
      case TRADE_TRANSACTION_HISTORY_ADD:
        if((order_ticket!=0) && (trans.order==order_ticket))
        {
         Print("History done. Ticket: ",order_ticket);
         if(HistoryOrderSelect(order_ticket))
         {
           double vol_cur = HistoryOrderGetDouble(order_ticket,ORDER_VOLUME_CURRENT);
           double vol_init = HistoryOrderGetDouble(order_ticket,ORDER_VOLUME_INITIAL);
           datetime time_setup=datetime(HistoryOrderGetInteger(order_ticket,ORDER_TIME_SETUP));
           double deals_vol = GetDealsVolume(Symbol(),order_ticket,time_setup);
           Print("Volume initial: ",vol_init," Volume current: ",vol_cur," Deals done: ",deals_vol);
           if(PositionSelect(Symbol()))
           {
            Print("Position exists.");
           }
           else
           {
            Print("Position NOT exists.");
           }
         }
        }
      break;
    }
  }
///----
double GetDealsVolume(const string a_symbol,const ulong a_ticket,const datetime start)
  {
   double volume=0;
   if(HistorySelect(start-180,TimeTradeServer()+180))
     {
      int deals=HistoryDealsTotal();
      if(deals>0)
        {
         for(int i=deals-1; i>=0; i--)
           {
            ulong deal_ticket=HistoryDealGetTicket(i);
            ulong ticket=ulong(HistoryDealGetInteger(deal_ticket,DEAL_ORDER));
            if(( ticket>0) && (ticket==a_ticket))
              {
               volume+=HistoryDealGetDouble(deal_ticket,DEAL_VOLUME);
              }
           }
        }
     }
   return( volume );
  } 
//---
//+------------------------------------------------------------------+
//| Place order                                                      |
//+------------------------------------------------------------------+
void OrderPlace()
{
  ResetLastError();
  MqlTradeRequest request={0};
  MqlTradeResult  result={0};
  order_ticket=0;
  order_req_id=0;
    
//--- Fill structure
  request.action=TRADE_ACTION_DEAL;//PENDING;
  request.magic=magic;
  request.symbol=Symbol();
  request.volume=1;
  double step=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE); 
  request.price=0;//SymbolInfoDouble(Symbol(), SYMBOL_ASK);//-step;
  request.type = ORDER_TYPE_BUY;//BUY_LIMIT;
  request.comment = "";      
  request.type_filling = ORDER_FILLING_IOC; ///
  request.type_time = ORDER_TIME_DAY;
  if(OrderSendAsync(request, result))
  {
    if(result.retcode==TRADE_RETCODE_PLACED) 
    {
      order_req_id=result.request_id;
    }
    else
    {
      Print( __FUNCTION__, ": Error! Retcode: ",GetLastError());
    }
  }
  else
  {
    Print( __FUNCTION__, ": Order not sent!");
  }
}   
//+------------------------------------------------------------------+

Und hier die Ergebnisse:

Beide Male stand TRADE_TRANSACTION_HISTORY_ADD an erster Stelle, aber

Im ersten Fall gab es keine Position, aber im zweiten Fall schon!

Wie soll ich das verstehen?

Ich habe vergessen, das Terminalprotokoll anzuhängen:

2016.08.15 15:37:14.935 Experts expert Test_deff_order (GAZR-9.16,M1) loaded successfully
2016.08.15 15:37:17.694 Trades  '1007932': exchange buy 1.00 GAZR-9.16 at market
2016.08.15 15:37:17.702 Trades  '1007932': exchange buy 1.00 GAZR-9.16 at market placed for execution in 8 ms
2016.08.15 15:37:17.721 Trades  '1007932': deal #7487011 buy 1.00 GAZR-9.16 at 13897 done (based on order #50942179)
2016.08.15 15:37:46.456 Trades  '1007932': exchange sell 1.00 GAZR-9.16 at market, close #50942179 buy 1.00 GAZR-9.16 13897
2016.08.15 15:37:46.463 Trades  '1007932': exchange sell 1.00 GAZR-9.16 at market, close #50942179 buy 1.00 GAZR-9.16 13897 placed for execution in 7 ms
2016.08.15 15:37:46.497 Trades  '1007932': deal #7487015 sell 1.00 GAZR-9.16 at 13892 done (based on order #50942187)
2016.08.15 15:37:50.348 Experts expert Test_deff_order (GAZR-9.16,M1) removed
2016.08.15 15:37:51.845 Experts expert Test_deff_order (GAZR-9.16,M1) loaded successfully
2016.08.15 15:37:53.776 Trades  '1007932': exchange buy 1.00 GAZR-9.16 at market
2016.08.15 15:37:53.786 Trades  '1007932': exchange buy 1.00 GAZR-9.16 at market placed for execution in 9 ms
2016.08.15 15:37:53.807 Trades  '1007932': deal #7487017 buy 1.00 GAZR-9.16 at 13898 done (based on order #50942195)
2016.08.15 15:37:58.632 Trades  '1007932': exchange sell 1.00 GAZR-9.16 at market, close #50942195 buy 1.00 GAZR-9.16 13898
2016.08.15 15:37:58.639 Trades  '1007932': exchange sell 1.00 GAZR-9.16 at market, close #50942195 buy 1.00 GAZR-9.16 13898 placed for execution in 7 ms
2016.08.15 15:37:58.664 Trades  '1007932': deal #7487020 sell 1.00 GAZR-9.16 at 13892 done (based on order #50942197)
2016.08.15 15:41:52.483 Experts expert Test_deff_order (GAZR-9.16,M1) removed
 

prostotrader, lassen Sie mich Ihnen eine intime Frage stellen. Warum sind Sie so versessen auf historische Aufträge und nicht auf den Handel? :-))

MQ Alexander sagte:

Что касается ордеров, позиций и сделок.

Wie in der Hilfe geschrieben - die Reihenfolge der eingehenden Transaktionen ist nicht garantiert - die Transaktion der Auftragsübertragung in die Historie kann vor der Transaktion empfangen werden.
Die Änderung einer Position im Terminal ist ausschließlich das Ergebnis des Empfangs einer Handelstransaktion, so dass der Erhalt dieser Transaktion eine Garantie dafür ist, dass sich die Position geändert hat.
Die Einholung einer Transaktion zur Übernahme des Auftrags in die Historie garantiert nur, dass der Auftrag nicht mehr aktiv (offen) ist und in die Auftragshistorie übernommen wurde.

Und in Ihrem Fall

case TRADE_TRANSACTION_DEAL_ADD


fast leer...

Und noch eine lyrische Bemerkung. Im Konzept von MT5 spiegelt das Vorhandensein eines historischen Auftrags die Tatsache wider, dass versucht wurde, einen Handel zu tätigen. Und es ist nicht die Tatsache, dass sie ausgeführt wurde. Und um das herauszufinden, müssen wir uns an den Handel wenden. Sie spiegelt bereits das Ergebnis der Handelsoperation wider. Dann ist es logischer, Transaktionen in Ihrem Code zu behandeln...

 
Dennis Kirichenko:

prostotrader, lassen Sie mich Ihnen eine intime Frage stellen. Warum sind Sie so versessen auf historische Aufträge und nicht auf den Handel? :-))

MQ Alexander sagte:

Und in Ihrem Fall


ist fast leer...

Ich antworte auf Ihre intime Frage.

Wahrscheinlich arbeiten Sie auf dem FOREX-Markt und handeln mit einem einzigen Auftrag,

Sie "lügen" also beharrlich in einem Bereich, den Sie nicht einmal verstehen.

Stellen Sie sich vor, es gäbe zwei Lenkräder in einem Auto und zwei Fahrer, die beide nur auf das Lenkrad schauen.

die Straße. Woher weiß der 1. Fahrer, dass der andere Fahrer lenkt (z. B. nach rechts)?

Schauen Sie auch genau hin:

Ihre gesamte primitive Logik basiert auf der Ausführung eines Marktauftrags, also,

Ich weise Sie darauf hin, dass es Limit- und Pending-Aufträge gibt

die nicht vollständig, sondern nur in Teilen ausgeführt werden können.

 
prostotrader:

Schauen Sie außerdem genau hin:

Und was soll ich dort sehen?!

Ist Ihnen bewusst, dass Sie im Fall TRADE_TRANSACTION_HISTORY_ADD versehentlich Positionsinformationen erhalten?

Und man hat Ihnen bereits gesagt, dass...
 

prostotrader:

Ihre gesamte primitive Logik basiert auf der Ausführung eines Marktauftrags, also,

Ich möchte Sie darauf aufmerksam machen, dass es Limit- und Pending-Aufträge gibt

die nicht vollständig, sondern in Teilen ausgeführt werden können.

Baby, es steht dir nicht zu, meine primitive Logik zu beurteilen...
 
Dennis Kirichenko:
Du bist nicht derjenige, der über meine primitive Logik urteilt...

Und wer soll das beurteilen?

Ich beurteile Ihre Fähigkeiten nach Ihren Aussagen!

Das Bild ist eindeutig nicht schön :(

Ergibt das mehr Sinn, "Professor"?

Und ich kann mich nicht erinnern, dassMQ Alexander Sie beauftragt hat, für ihn zu antworten.