MT5 et la vitesse en action - page 5

 
fxsaber:

Dans Combat Advisors, j'ai enveloppé des fonctions partout dans des endroits suspects dans _B(FuncName(...), AlertTime).

J'ai oublié que c'est très cher.

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

Au mieux, je passe des dizaines de millisecondes sur chaque tic-tac juste à cause de HistorySelect.

Profilage du conseiller en matière de combat.


 
C'est soit ça, soit autre chose. Lorsqu'une commande est passée avec succès, son ticket est renvoyé ? Le retour de la fonction HistoryOrderSelect(ticket) vous dit-il quelque chose ? Pourquoi s'embêter à utiliser des HS coûteux, sauf pour démarrer le robot ?
 
Vladimir Simakov:
Pourquoi utiliser des HS coûteux, sauf pour démarrer le robot ?

Écrit au début du fil.

 
fxsaber:

Vous faites un envoi de commande. Si, immédiatement après la fin de l'envoi de l'ordre, une certaine position n'a pas été fermée en même temps, vous effectuez un autre envoi d'ordre. C'est toute la logique dont vous avez besoin pour programmer. Async n'est pas utilisé.

Maintenant, la situation qui s'est produite pour notre robot. Vous avez envoyé un OrderSend et pendant qu'il est exécuté, le Limiter s'est déclenché et ensuite le TP de notre position a été exécuté, comme je l'ai mentionné précédemment.

Je ne comprends vraiment rien à tout cela - si vous le pouvez, décrivez les étapes plus en détail. La seule chose que j'ai obtenue, c'est que seul le gestionnaire d'événementsOnTradeTransaction est utilisé, ce qui signifie que nous n'avons pas besoin d'une gestion des priorités de traitement des événements et que la suggestion suivante a été faite

bool HandleNextEvent(ENUM_EVENT_TYPE);

dégénère en

bool HandleNextEvent();
Quelle était la demande? Donnez-nousHandleNextEvent()
OnTradeTransaction(...)
{
        /*вычисления1*/
        HandleNextEvent();
        /*вычисления2*/
}
Maintenant, le gestionnaire d'événement secondaire dans le schéma est proposé pour être mis en œuvre comme ceci :
On2TradeTransaction(...)
{
        if флаг установлен goto label
        /*вычисления1*/
                запомнить результаты вычислений
                установить флаг
                return;
label:          извлечь результаты вычислений
        /*вычисления2*/
}
 
A100:

C'est là que je ne comprends vraiment pas - si vous le pouvez, décrivez-le plus en détail, étape par étape.

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

Pourquoi ne pouvez-vous pasrevenir après avoir appeléOrderSend?

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

La prochaine fois que vous revenez à OnMain, lorsqu'un nouvel événement a déjà été ajouté à la file d'attente (ou par minuterie)

 

A100:

Pourquoi l'appelOrderSend ne peut-il pas être suivi d'unretour ?

Il n'y a pas de limitation.

La prochaine fois, vous reviendrez à OnMain lorsqu'un nouvel événement sera ajouté à la file d'attente (ou par minuterie).

L'événement suivant est l'exécution d'un ordre en attente et non d'une prise de position.

 
fxsaber:

L'événement suivant est l'exécution de l'ordre en attente, et non la prise de position.

Il est suggéré de revenir à plusieurs reprises, jusqu'à ce que vous ayez lu toute la file d'attente actuelle ou pour un nombre donné d'événements. Lorsque les événements commerciaux sont terminés - il y aura un retour de la minuterie et vous aurez accès à tous les événements en même temps.

 
void OnMain()
{
        if (first)
        {
                OrderSend(OP_BULIMIT); // Во время выполнения сработал и другой отложенник и тейк позиции (после отложенника).
                return; 
        }
        if ( OnTrade событие последнее )
                return; //может еще есть
        if ( OnTimer событие последнее )
        { // все торговые события в лукошке
                if (наблюдаемая позиция закрылась по тейку) // Проблема определить это без доступа к очереди.
                        OrderSend(OP_BUYLIMIT)  
                else
                        OrderSend(OP_SELLLIMIT)
        }
}
il existe une solution plus élégante, sans OnTimer... réfléchissez-y