MT5 und Geschwindigkeit in Aktion - Seite 5

 
fxsaber:

In Combat Advisors habe ich Funktionen überall an verdächtigen Stellen in _B(FuncName(...), AlertTime) verpackt.

Ich habe vergessen, dass es sehr teuer ist.

        Alert: Time[SyncEA.mqh 309: ::TerminalInfoInteger(TERMINAL_MEMORY_USED)] = 21 ms.
 
fxsaber:

Im besten Fall verbringe ich nur wegen HistorySelect bei jedem Tick einige zehn Millisekunden.

Profiling eines Kampfberaters.


 
Entweder ist es das oder etwas anderes. Wenn eine Bestellung erfolgreich aufgegeben wurde, wird das Ticket zurückgegeben? Sagt Ihnen der Rückgabewert der Funktion HistoryOrderSelect(ticket) etwas? Warum sollte man überhaupt teure HS verwenden, außer beim Starten des Roboters?
 
Vladimir Simakov:
Warum überhaupt teure HS verwenden, außer beim Starten des Roboters?

Ich habe am Anfang des Threads geschrieben.

 
fxsaber:

Sie machen einen OrderSend. Wenn unmittelbar nach dem Ende des OrderSend eine bestimmte Position nicht zur gleichen Zeit geschlossen wurde, machen Sie einen weiteren OrderSend. Dies ist die gesamte Logik, die Sie zum Programmieren benötigen. Async wird nicht verwendet.

Nun zu der Situation, in der sich unser Roboter befand. Sie haben eine OrderSend gesendet, und während diese ausgeführt wurde, hat der Limiter ausgelöst, und dann wurde der TP unserer Position ausgeführt, wie ich bereits erwähnt habe.

Ich verstehe wirklich nichts davon - wenn Sie können, beschreiben Sie bitte die Schritte genauer. Das Einzige, was ich herausgefunden habe, ist, dass nur derOnTradeTransaction-Ereignishandler verwendet wird, was bedeutet, dass wir kein Prioritätsmanagement für die Ereignisbehandlung benötigen und die vorgeschlagene

bool HandleNextEvent(ENUM_EVENT_TYPE);

artet aus in

bool HandleNextEvent();
Wie lautete die Anfrage? Geben Sie unsHandleNextEvent()
OnTradeTransaction(...)
{
        /*вычисления1*/
        HandleNextEvent();
        /*вычисления2*/
}
Der sekundäre Event-Handler im Schema soll wie folgt implementiert werden:
On2TradeTransaction(...)
{
        if флаг установлен goto label
        /*вычисления1*/
                запомнить результаты вычислений
                установить флаг
                return;
label:          извлечь результаты вычислений
        /*вычисления2*/
}
 
A100:

Das ist der Punkt, den ich wirklich nicht verstehe - wenn Sie es können, beschreiben Sie es bitte genauer, Schritt für Schritt.

void OnMain()
{
  OrderSend(OP_BULIMIT); // Во время выполнения сработал и другой отложенник и тейк позиции (после отложенника).
  
  // Следующий OrderSend должен быть незамедлительно вызван.
  if (наблюдаемая позиция закрылась по тейку) // Проблема определить это без доступа к очереди.
    OrderSend(OP_BUYLIMIT)  
  else
    OrderSend(OP_SELLLIMIT)    
}
 
fxsaber:

Warum können Sie nach dem Aufruf vonOrderSend nichtzurückkehren?

void OnMain()
{
        if (first)
        {
                OrderSend(OP_BULIMIT); // Во время выполнения сработал и другой отложенник и тейк позиции (после отложенника).
                return;
        }
//...
}

Wenn Sie das nächste Mal zu OnMain zurückkehren, wenn bereits ein neues Ereignis zur Warteschlange hinzugefügt wurde (oder durch einen Timer)

 

A100:

Warum kann auf denOrderSend-Aufruf nicht einReturn folgen?

Es gibt keine Einschränkungen.

Das nächste Mal kehren Sie zu OnMain zurück, wenn ein neues Ereignis zur Warteschlange hinzugefügt wird (oder durch einen Timer)

Das nächste Ereignis ist die Ausführung eines schwebenden Auftrags und nicht die Übernahme einer Position.

 
fxsaber:

Das nächste Ereignis ist die Ausführung des schwebenden Auftrags, nicht die Übernahme der Position.

Es wird vorgeschlagen, wiederholt zurückzukehren, bis Sie entweder die gesamte aktuelle Warteschlange oder eine bestimmte Anzahl von Ereignissen gelesen haben. Wenn die Handelsereignisse vorbei sind, kehrt ein Timer zurück und Sie haben Zugang zu allen Ereignissen auf einmal.

 
void OnMain()
{
        if (first)
        {
                OrderSend(OP_BULIMIT); // Во время выполнения сработал и другой отложенник и тейк позиции (после отложенника).
                return; 
        }
        if ( OnTrade событие последнее )
                return; //может еще есть
        if ( OnTimer событие последнее )
        { // все торговые события в лукошке
                if (наблюдаемая позиция закрылась по тейку) // Проблема определить это без доступа к очереди.
                        OrderSend(OP_BUYLIMIT)  
                else
                        OrderSend(OP_SELLLIMIT)
        }
}
es gibt eine elegantere Lösung, ohne OnTimer... darüber nachdenken