La grande et terrible MT4 pour toujours (ou comment organiser une transition) - page 11

 
secret:
La commande a été passée au préalable. Le prix le touche, mais il est exécuté plus tard, à un prix moins élevé.

Non, si la limite a été moins bonne, alors on emmerde le courtier ou on fait avec.

Et si elles s'arrêtent, c'est bien, pour ainsi dire. 20-30 ms est tout à fait acceptable, si la commande est sortie ailleurs et pas seulement vérifiée par un plugin.

Et combien de tiques il y avait - cela n'a pas d'importance du tout.

 
Andrei Trukhanovich:

en quoi cela aide-t-il que la commission soit comptée en dollars à partir du volume en dollars ?

Curieusement, la devise du compte est affectée. Apparemment, il ne s'agit pas du taux de change actuel, mais d'un taux fixe. Plus les arrondis, si le lot est petit.

 

J'ai dû trouver quelque chose par moi-même et un exemple très facile à reproduire est né, qui montre à quel point il est facile de travailler avec des commandes.


Imaginons donc que nous utilisons un EA qui fonctionne en mode OnTick classique. Comme OnTick peut se produire à tout moment pendant l'état de l'environnement du terminal, il sera intéressant de voir ce que l'EA peut voir. Par conséquent, les états qui peuvent être rencontrés par le conseiller expert onTick sont choisis comme suit.

#define  TOSTRING(A) #A + " = " + (string)(A) + " "

void OnTradeTransaction( const MqlTradeTransaction&, const MqlTradeRequest&, const MqlTradeResult& )
{
  static int i = 0;
  
  Print(i++);
  
  if (HistorySelect(0, INT_MAX))
    Print(TOSTRING(PositionsTotal()) + TOSTRING(OrdersTotal()) + TOSTRING(HistoryDealsTotal()) + TOSTRING(HistoryOrdersTotal()));
        
  Print("----------------");
}

Ce code imprime simplement le nombre de positions/ordres actuels et le nombre de transactions/ordres fermés.


Nous l'exécutons et ouvrons manuellement une position et la fermons. Il n'y a rien d'autre. J'ai l'impression suivante (elle peut changer d'une exécution à l'autre).

        // Открываем позицию руками.

        0
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        1
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        2
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        3
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        4
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        5 // Открывающий позицию ордер исчез полностью - нет среди живых и мертвых.
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        6 // Открылась позиция, но нет соответствующей ей сделки.
        PositionsTotal() = 1 OrdersTotal() = 0 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 26 
        ----------------
        7
        PositionsTotal() = 1 OrdersTotal() = 0 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------

        // Закрываем позицию руками.
        8 // Позиция и закрывающий ее ордер.
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        9
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        10
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        11
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        12 // Позиция закрыта, но закрывающий ее ордер продолжает висеть.
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 26 
        ----------------
        13 // Закрывающий позицию ордер полностью исчез - нет среди мертвых/живых.
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 26 
        ----------------
        14
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 26 
        ----------------
        15
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 27 
        ----------------

Ainsi, le conseiller expert OnTick peut rencontrer n'importe laquelle de ces 16 situations, dont certaines intéressantes que j'ai commentées ci-dessus.

Je n'ai pas fait exprès de prendre un exemple. Je viens de le faire et de poster le résultat. Les lancements peuvent également donner d'autres variantes intéressantes.


J'ai pu commenter les résultats car je savais exactement ce que je faisais (j'ai ouvert une seule position et l'ai fermée à la main).

Comment se sent un conseiller expert qui ne le sait pas ? Imaginons que plusieurs conseillers experts travaillent en parallèle sur le compte. La facilité d'analyse du désordre résultant de la symbiose des situations ci-dessus est, je pense, évidente.


Un code concis est joint, tout le monde peut le reproduire.

 
fxsaber:

J'ai dû trouver quelque chose par moi-même et un exemple très facile à reproduire est né, qui montre à quel point il est facile de travailler avec des commandes.


Imaginons donc que nous utilisons un EA qui fonctionne en mode OnTick classique. Comme OnTick peut se produire à tout moment pendant l'état de l'environnement du terminal, il sera intéressant de voir ce que l'EA peut voir. Par conséquent, les états qui peuvent être rencontrés par le conseiller expert onTick sont choisis comme suit.

Ce code imprime simplement le nombre de positions/ordres actuels et le nombre de transactions/ordres fermés.


Nous l'exécutons et ouvrons manuellement une position et la fermons. Il n'y a rien d'autre. J'ai l'impression suivante (elle peut changer d'une exécution à l'autre).

Ainsi, le conseiller expert OnTick peut rencontrer n'importe laquelle de ces 16 situations, dont certaines intéressantes que j'ai commentées ci-dessus.

Je n'ai pas fait exprès de prendre un exemple. Je viens de le faire et de poster le résultat. Les lancements peuvent également donner d'autres variantes intéressantes.


J'ai pu commenter les résultats car je savais exactement ce que je faisais (j'ai ouvert une seule position et l'ai fermée à la main).

Comment se sent un conseiller expert qui ne le sait pas ? Imaginons que plusieurs conseillers experts travaillent en parallèle sur le compte. La facilité d'analyse du désordre résultant de la symbiose des situations ci-dessus est, je pense, évidente.


Un code concis est joint, chacun peut le reproduire.

Vous devez comprendre combien de fois OnTradeTransaction est appelé et ce que vous pouvez obtenir à quel moment.

COMMANDE_TRANSACTION_ADDITIONNELLE

Ajout d'un nouvel ordre ouvert.

MISE À JOUR DE LA COMMANDE DE TRANSACTION COMMERCIALE

Modification d'un ordre ouvert. Ces changements comprennent non seulement des changements explicites du côté du terminal client ou du serveur de négociation, mais aussi des changements de l'état de passation de l'ordre (par exemple, de ORDER_STATE_STARTED à ORDER_STATE_PLACED ou de ORDER_STATE_PLACED à ORDER_STATE_PARTIAL, etc.)

COMMANDE_TRANSACTIONNELLE_SUPPRESSION

Supprime l'ordre de la liste des ordres ouverts. Un ordre peut être supprimé de la liste des ordres ouverts à la suite d'une demande de transaction ou à la suite d'une exécution (fill) et d'un transfert vers l'historique.

TRANSACTION_COMMERCIALE_ADDITIONNELLE

Ajout d'un métier à l'historique. Cette opération est effectuée à la suite de l'exécution de l'ordre ou à la suite des opérations de solde de compte.

MISE À JOUR DES TRANSACTIONS COMMERCIALES

Changement d'accord dans l'histoire. Il peut arriver qu'une transaction exécutée précédemment soit modifiée sur le serveur. Par exemple, la transaction a été modifiée dans le système de négociation externe (bourse), où elle a été supprimée par le courtier.

TRANSACTION_TRANSACTION_DEAL_DELETE

Suppression de la transaction de l'historique. Il peut arriver qu'une transaction précédemment exécutée soit supprimée sur le serveur. Par exemple, la transaction a été supprimée dans le système de négociation externe (bourse) où elle a été supprimée par le courtier.

AJOUT DE L'HISTORIQUE DES TRANSACTIONS COMMERCIALES

Ajout d'un ordre à l'historique à la suite de son exécution ou de son annulation.

MISE À JOUR DE L'HISTORIQUE DES TRANSACTIONS COMMERCIALES

Modification d'une commande passée dans l'historique des commandes. Ce type est destiné à augmenter la fonctionnalité du côté du serveur commercial.

HISTORIQUE_TRANSACTIONNEL_SUPPRIMER

Suppression d'une commande dans l'historique des commandes. Ce type est destiné à l'extension des fonctionnalités du côté du serveur commercial.

TRADE_TRANSACTION_POSITION

Modification d'une position non liée à l'exécution de la transaction. Ce type de transaction indique que la position a été modifiée du côté du serveur de transactions. Le volume de la position, le prix d'ouverture et les niveaux de Stop Loss et Take Profit peuvent être modifiés. Les informations sur les changements sont transmises à la structure MqlTradeTransaction par le biais du gestionnaire OnTradeTransaction. Un changement de position (ajout, modification ou élimination) résultant d'une transaction ne provoque pas l'occurrence de la transaction TRADE_TRANSACTION_POSITION.

DEMANDE_DE_TRANSACTION

Une notification indiquant qu'une demande de transaction a été traitée par le serveur et que son résultat a été reçu. Pour les transactions de ce type, il est nécessaire d'analyser un seul champ - type (type de transaction) dans la structure MqlTradeTransaction. Les deuxième et troisième paramètres de la fonction OnTradeTransaction (requête et résultat) doivent être analysés pour obtenir des informations supplémentaires.

 
Alexey Viktorov:

Vous devez déterminer combien de fois OnTradeTransaction est appelé et ce que vous pouvez obtenir à quel moment.

Je pense avoir été aussi clair que possible.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

La grande et terrible MT4 pour toujours (ou comment construire une stratégie de migration)

fxsaber, 2021.05.03 12:48

Ainsi, OnTick EA peut se retrouver dans l'une de ces 16 situations, intéressantes celles que j'ai commentées ci-dessus.

 
fxsaber:
Je pense avoir été aussi clair que possible.

Quel est le rapport avec OnTick() si vous gérez tout cela dans OnTradeTransaction.

Obtenir la raison de l'appel de OnTradeTransaction et traiter ce qui est disponible dans cet appel en conséquence.
 
Alexey Viktorov:

Quel est le rapport avec OnTick() si vous traitez tout cela dans OnTradeTransaction.

Obtenir la raison de l'appel de OnTradeTransaction et traiter ce qui est disponible à cet appel en conséquence.

Peut-être que l'un des membres du forum pourra vous expliquer. Ça ne marche pas pour moi.

 
Alexey Viktorov:

Quel est le rapport avec OnTick() si vous traitez tout cela dans OnTradeTransaction.

Obtenez la raison de l'appel de OnTradeTransaction et traitez ce qui est disponible à cet appel en conséquence.

DansOnTick, absolument toutes ces bizarreries sont en place. Il est justedifficile de faire un exemple facilement reproductible avec OnTick.OnTradeTransaction a été choisi comme exemplemais cela ne change rien à l'essentiel.

 
traveller00:

OnTick a absolument toutes ces bizarreries en place. Il est justedifficile de faire un exemple facilement reproductible avecOnTick.OnTradeTransaction a été choisi comme exemple, mais cela ne change rien à l'affaire.

Continuez à imiter Don Quichotte...

 
fxsaber:

нет среди живых и мертвых

Il serait formidable de contourner ce point au niveau de MT4Orders.

Les sauvegardes des commandes ont lieu maintenant, malheureusement. Très probablement à cause de ça.

Raison: