Fehler, Irrtümer, Fragen - Seite 2744

 
Aliaksandr Hryshyn:

Fehler:


Vielen Dank für Ihre Nachricht.
Korrigiert.

 
Ilyas:

Frage der Optimierung. Im Prüfgerät muss ich bei jedem Häkchen ein Häkchen für die weitere Arbeit bekommen. Ich mache es so.

void OnTick()
{
  static MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
    // ...
}


Es ist klar, dass diese Variante langsamer sein wird:

void OnTick()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(Symbol(), Tick))
    // ...
}


Aber SymbolInfoTick ist auch langsamer, weil sein String-Parameter nicht per Referenz übergeben wird.


Ist es möglich, reguläre SymbolInfo* Überladungen zu haben, wo String durch Referenz übergeben wird?


Es ist besser, eine

const MqlTick _Tick; // Текущий _Symbol-тик.


In Optimizer werden diese Funktionen zig-Milliarden Mal aufgerufen.

 
Ilyas:
Schlagen Sie vor, die Funktion GetNextEvent hinzuzufügen?

Nicht wirklich, ich würde eher diese Funktion als HandleNextEvent, eine mögliche Signatur aufrufen:

bool HandleNextEvent (ENUM_EVENT_TYPE);


Beim Aufruf wird, ähnlich wie bei GetNextEvent, geprüft, ob der angegebene ENUM_EVENT_TYPE in der Warteschlange vorhanden ist,
, und wenn dieses Ereignis vorhanden ist, wird die Kontrolle automatisch an den Benutzercode des entsprechenden Handlers (OnChartEvent, OnTrade, OnTradeTransaction, ...) übergeben. (Dankan fxsaber für die Ergänzung)).
Gibt true zurück, wenn sich ein Ereignis in der Warteschlange befand, andernfalls false.


Möglicher Anwendungsfall:

//....
for(int i = 0; i < 10^6; ++i){
   // .... Data Calculations

   if((i % 10^3) == 0){
       while(HandleNextEvent(EVENT_TYPE_ALL));
   }
}
//....
 
fxsaber:

Frage der Optimierung. Im Prüfgerät muss ich bei jedem Häkchen ein Häkchen für die weitere Arbeit bekommen. Ich mache es so.
Es ist klar, dass diese Variante langsamer sein wird.

Haben Sie diese Aussage in der Praxis überprüft? Es mag den Anschein haben, dass es genau das Gegenteil ist.

MqlTick besteht aus primitiven Datentypen, die nicht initialisiert sind.
Dementsprechend wird keine Zeit für die Auswahl verschwendet, da es sich um denselben "sub esp"-Vorgang handelt, nur in einem anderen Umfang.
Daher kann der Engpass beim Lesen eines Wertes aus dem Speicher auf der Seite des Cache des Prozessors liegen.

Wie auch immer, wir sollten es testen )).

 
Sergey Dzyublik:

wenn dieses Ereignis eintritt, wird die Kontrolle automatisch an den Benutzercode des entsprechenden Handlers übergeben

Möglicher Anwendungsfall:

Eine sehr schöne und nützliche Lösung!

 
Sergey Dzyublik:

Haben Sie diese Aussage in der Praxis getestet? Es könnte aber auch das Gegenteil der Fall sein.

Hier wird theoretisiert. Ich habe es nicht überprüft. Aber die Übertragung auf den String Link scheint angemessen.

 
Sergey Dzyublik:

Ein möglicher Anwendungsfall:

Das ergibt keinen Sinn.

Gemäß der Signatur und Ihrer Beschreibung sollte das Terminal eine Funktion aufrufen, um das nächste Ereignis zu verarbeiten und dann die Kontrolle an das Programm an der Stelle zurückzugeben, an der das handlenextevent aufgerufen wird?

Was passiert, wenn das handlenextevent während der Verarbeitung erneut aufgerufen wird?

Was geschieht mit Ereignissen, die den Filter in den Parametern nicht passieren? Werden sie übersprungen?

Skripte haben überhaupt keine Ereignis-Warteschlange, warum sie auf Krücken hinzufügen, wenn es Expert Advisors und Indikatoren gibt?

 
TheXpert:

1) Sie suggerieren irgendeinen Unsinn.
2) Nach der Signatur und Ihrer Beschreibung sollte das Terminal die nächste Ereignisverarbeitung per Funktion aufrufen und dann die Kontrolle an das Programm an den Punkt des Handlenextevent-Aufrufs zurückgeben?
3) Was geschieht, wenn das Handlenextevent während der Verarbeitung erneut aufgerufen wird?
4) Und was passiert mit Ereignissen, die nicht unter den Filter in den Parametern fallen? Werden sie übersprungen? ändern sie die Reihenfolge?


1) Meine Aufgabe ist es, Angebote zu machen, aber ob es etwas Verrücktes ist oder nicht - das liegt bei den Entwicklern, nicht bei Ihnen, die wissen es besser...
2) In Ordnung. Wenn ich an der Verarbeitung eines bestimmten Ereignisses interessiert bin und nicht an allen Ereignissen im System, wäre es schön, wenn ich nur diese Art von Ereignis verarbeiten könnte, während die Verarbeitung der anderen Ereignisse normal weiterläuft.
3) Wenn HandleNextEvent während der Verarbeitung erneut aufgerufen wird - aufrufen und verarbeiten. Das einzige, was passieren kann, ist ein Stapelüberlauf, aber das ist das Problem des Benutzers und des Codes, nicht das des Entwicklers.
4) Ereignisse, die nicht unter den Filter fallen, bleiben in der gleichen Reihenfolge und werden aufgerufen, wenn der Benutzer die Kontrolle über das System wie üblich zurückgibt.


 
TheXpert:

Skripte haben überhaupt keine Ereignis-Warteschlange, warum sie auf Krücken hinzufügen, wenn es EAs und Indikatoren gibt?

Hier ist ein Beispiel für ein Skript, das seine Positionen/Order asynchron öffnet und schließt.

// Максимально быстро все закрывает. Возврат, когда действие подтверждено.
bool CloseAll()
{
  uint RequestID[];
  
  for (int i = ArrayResize(RequestID, OrdersTotal()) - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
      // Отправили асинхронный приказ
      RequestID[i] = (OrderType() <= OP_SELL) ? OrderCloseAsync(OrderTicket(), OrderLots(), OrderClosePrice(), 100) : OrderDeleteAsync(OrderTicket());
  
  return(Transactions.Waiting(RequestID)); // Дождались ответа от сервера на все асинхронные приказы
}
TradeTransactions
TradeTransactions
  • www.mql5.com
Асинхронные торговые приказы обладают огромным преимуществом - высокая скорость при массовой отправке. Однако, распространению таких приказов мешает некоторое неудобство - данные о результате приказа возможно увидеть только в OnTradeTransaction. Такое обстоятельство заставляет обывателя строить событийную модель своей ТС, если хочется...
 
Sergey Dzyublik:

1) Es ist meine Aufgabe, Vorschläge zu machen, und ob es ein Dilemma ist oder nicht, haben nicht Sie zu entscheiden, sondern die Entwickler, sie wissen es besser...

Wenn Sie etwas vorschlagen, das leichter umzusetzen ist, ist die Chance größer, dass es auch umgesetzt wird. Ihre Option wurde gestrichen, weil sie fast nichts bringt.