Erreurs, bugs, questions - page 480

 
papaklass:
Maintenant mis à jour et essayant de le comprendre à nouveau. J'ai mis des empreintes sur presque toutes les lignes. Je ferai part des résultats.

Voici le parcours avec votre insert, au moment où le stop loss a été fixé :

2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 Position longue par EURUSD à fermer de stop-loss
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 -----------------Deal #63 sl 1.33328
2011.08.09 00:41:08 Core 1 2011.01.01.14 01:41:27 oldDealsTotal=62 newDealsTotal=63
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 CSampleExpert::Trade
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 ordre exécuté vendre 0.15 à 1.33328 [#63 vendre 0.15 EURUSD à 1.33328]
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 transaction effectuée [#63 vendre 0.15 EURUSD à 1.33328]
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 deal #63 sell 0.15 EURUSD at 1.33328 done (based on order #63)
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 stop loss déclenché acheter 0.15 EURUSD 1.32127 sl : 1.33328 tp : 1.35139 [#63 vendre 0.15 EURUSD à 1.33328]
2011.08.09 00:41:08 Core 1 2011.01.13 18:32:00 Position longue par EURUSD à modifier trailing
 
Évidemment, le résultat différent est un traitement différent dans OnTrade, je ne cherche que les transactions, seules elles m'intéressent, vous, par contre, si je comprends bien, vous traitez tous les événements, en les classant, et vous avez fait une erreur quelque part ici.
 
J'en déduis que le marché des paris à terme est également une démo ? J'en ai pris un vrai du MMVB, les lots ne correspondent pas.
 
papaklass:

Je place des ordres en attente avec une durée de vie d'une heure. Après une heure, les ordres qui n'ont pas été activés sont fermés à l'heure d'expiration de l'ordre. Si plusieurs ordres sont fermés simultanément, et qu'avant la fermeture, la fonction HistoryOrdersTotal() avait une valeur non nulle, alors elle perd certains ordres. Par exemple, avant la clôture de 8 ordres, la fonction avait une valeur de 4, mais après la clôture, elle a une valeur de 10. Deux ordres sont perdus.


Que voulez-vous dire par "les ordres ont été perdus" ? Il faut garder à l'esprit que les messages arrivant à OnTrade() peuvent porter des informations sur plus d'un événement commercial. En outre, si plusieurs messages sont envoyés simultanément, lors du traitement du premier message, le cache historique peut déjà avoir changé, et vous pouvez avoir une sensation d'"événements perdus".

Veuillez lire l'article Événements commerciaux dans MetaTrader 5:

Conclusion

Toutes les opérations dans la plateforme de trading MetaTrader 5 sont asynchrones, et l'envoi de messages sur tous les changements dans le compte de trading se fait indépendamment les uns des autres, donc n'essayez pas de tracer un seul événement selon la règle "Une demande - Un événement de trading". Si vous voulez déterminer exactement ce qui a changé après l'événement Trade, vous devez analyser toutes les transactions, positions et ordres à chaque appel du gestionnaire OnTrade et les comparer avec l'état que nous avions avant l'apparition de l'événement.
 
papaklass:
J'ai spécifiquement demandé la valeur HistoryOrdersTotal(), qui était égale à 4, avant de fermer les ordres. Après la clôture de 8 ordres, la valeur de HistoryOrdersTotal() aurait dû être égale à 12 (4 + 8), mais elle était égale à 10. J'ai joint un fichier journal, on peut y voir des situations similaires plus d'une fois. J'ai également joint le conseiller expert, avec lequel on obtient ce résultat. Faites-le vous-même et vous verrez tout.

Essayez de changer la fonction, que se passera-t-il ?

void OnTrade(){
//---
   HistorySelect(dayStart,TimeTradeServer());      
   Print("              ",__FUNCTION__,"  :  historyOrdersTotal = ",HistoryOrdersTotal(),"   ",TimeTradeServer()); 
}
     
 
Le rapport HTML de l'exécution du test n'est pas toujours sauvegardé dans un fichier !
 
zigan:
Le rapport HTML de l'exécution du test n'est pas toujours enregistré dans un fichier !

Décrivez plus précisément. Dans quelles circonstances.

 
alexvd:

Décrivez plus précisément. Dans quelles circonstances.

Rarement, environ un essai sur 20-30 - ouvrir l'onglet "Résultats".

cliquez sur enregistrer le rapport XML - je reçois le fichier du rapport, tout est OK !

cliquez sur enregistrer le rapport HTML - la fenêtre d'enregistrement du fichier apparaît, se bloque avec une barre de progression vide pendant un moment (brièvement), puis la barre de progression se remplit rapidement et la fenêtre se ferme... Mais aucun fichier de rapport n'est créé !

Je ne peux pas spécifier un modèle pour savoir quand cela se produit exactement.

 
Rosh:

Essayez de changer la fonction, que se passera-t-il ?

Je ne pense pas que cela puisse aider. OnTrade, par principe, ne peut pas fonctionner comme papaklass.

La clé est la suivante :" vous devez analyser toutes les transactions, positions et ordres à chaque appel au gestionnaire OnTrade et le comparer à l'état dans lequel il se trouvait avant son apparition " . Dans l'exemple de à avec des ordres en attente, cela ne s'applique qu'aux ordres dans l'historique. Pour éviter de perdre des ordres, je modifierais le code de cette façon :

Introduire une variable globale int oldHistoryOrders ; et dans Ontrade, quelque chose comme ceci :

//--------------------------ТОРГОВЫЕ СОБЫТИЯ-------------------------------------------------------------+
void OnTrade(){
//---
   Print(__FUNCTION__);
   HistorySelect(0,TimeCurrent()+1);      
   int newHistoryOrders=HistoryOrdersTotal();
   if(oldHistoryOrders==newHistoryOrders) return;
   Print("oldHistoryOrders=",oldHistoryOrders," newHistoryOrders=",newHistoryOrders);
   for(int i=oldHistoryOrders;i<newHistoryOrders;i++)
      Print("Order ",i," #",HistoryOrderGetTicket(i));
   oldHistoryOrders=newHistoryOrders;    
//   Print("              ",__FUNCTION__,"  :  historyOrdersTotal = ",newHistoryOrders,"   ",dayStart); 
}
Dossiers :
 
papaklass:

Ce n'est pas la façon dont je travaille avec OnTrade() comme vous l'avez décrit. Dans mon code joint, j'ai tout supprimé, ne laissant que la partie qui met en évidence le bug de la fonction. Je n'ai pratiquement pas de boucles dans mon EA. L'EA traite un seul symbole sur un seul tick. Par conséquent, je n'ai pas besoin de cycles. Je traite tous les symboles dans les 12 ticks.

PS : OnTrade() m'informe d'un événement commercial. Et l'événement qui s'est produit est défini par mes fonctions sans boucles.

Bon, d'accord, je faisais seulement référence à votre exemple qui prouve, soi-disant, la perte d'ordres par la fonction OnTrade. OnTrade fonctionne de manière asynchrone, et non par ticks, donc il ne se soucie pas du nombre de symboles que vous traitez dans un tick. Vous avez un tas de commandes vides qui expirent en même temps, donc vous ne pouvez pas vous passer de cette solution de contournement. J'ai modifié votre code pour montrer que OnTrade ne rate rien. Je l'ai même fait fonctionner dans le testeur et tout semble être en place. Les tickers de tous lesordres supprimés imprimés par l'imprimante depuis OnTrade sont présents dans le journal. Avez-vous essayé ma version ?
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
Raison: