Erreurs, bugs, questions - page 3079

 
Dmitry Fedoseev #:
Le marché ne charge pas de capture d'écran. J'ai essayé à partir de deux navigateurs.

Moi aussi...

 

Bonjour, quel pourrait être le problème ? J'utilise une dll pour écrire sur le serveur SQL (exemple de l'article https://www.mql5.com/ru/article s/2895 ).

Si j'utilise jusqu'à 5 threads, les données sont écrites correctement. Si j'utilise plus de threads, il y aura une erreur "Unhandled exception 0xE0434352".

Интеграция эксперта на MQL и базы данных (SQL Server, .NET и C#)
Интеграция эксперта на MQL и базы данных (SQL Server, .NET и C#)
  • www.mql5.com
Статья описывает, как добавить в экспертов на MQL5 возможность работы с сервером баз данных Microsoft SQL Server. Используется импорт функций из DLL. Для создания DLL применяется платформа Microsoft .NET и язык C#. Используемые в статье методы с незначительными изменениями подходят и для экспертов, написанных на MQL4.
Dossiers :
SQL.mqh  19 kb
OHLC_1.mq5  5 kb
 
SEM #:

Bonjour, quel pourrait être le problème ? J'utilise une dll pour écrire sur le serveur SQL (exemple de l'article https://www.mql5.com/ru/article s/2895 ).

Si j'utilise jusqu'à 5 threads, les données sont écrites correctement. Si j'utilise plusieurs threads, l'erreur "Unhandled exception 0xE0434352" apparaît immédiatement.

Dans toutes les fonctions de l'interface DLL nous devrions utiliser try catch, attraper "unhandled exception" et l'écrire dans le journal...

C'est une bonne idée d'attraper toutes les exceptions et d'essayer tous les appels aux plus. Même dans la documentation de MQL, il est clairement écrit que les DLL ne doivent pas lancer d'exceptions, pas le C++.

en particulier dans l'article conn.Close et new SqlConnection ne relèvent pas de la "capture d'exception" et peuvent potentiellement lancer des exceptions.

 
Dmitry Fedoseev #:
La capture d'écran ne se charge pas dans le Marché. Je l'ai essayé avec deux navigateurs.
Yury Emeliyanov #:

Moi aussi...

Avez-vous essayé un simple glisser-déposer de l'image ?

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

Marché et mathématiques

Alexey Viktorov, 2021.08.19 21:01

Essayez d'insérer une image en la faisant simplement glisser et en la déposant sur le texte.

J'ai maintenant essayé d'effectuer des changements dans le conseiller expert caché et j'ai fait glisser la première image que j'ai vue.



 
Alexey Viktorov #:

Avez-vous essayé un simple glisser-déposer de l'image ?


sur 5 photos, une seule est ajoutée

 
Andrei Trukhanovich #:

C'est le cas depuis longtemps. Les chaînes mql n'aiment vraiment pas les caractères nuls à l'intérieur d'une chaîne et dans les littéraux, dans les fonctions aussi.

La seule façon normale est de convertir trois chaînes de caractères en un tableau avec un zéro à la fin.

C'est-à-dire que ce comportement tel qu'il est maintenant a été fait délibérément il y a quelques années. Je ne connais pas les raisons.

Il y a des ennemis partout

 
Maxim Kuznetsov #:

Dans toutes les fonctions DLL d'interface, enveloppez tout dans try catch, attrapez l'exception non gérée et enregistrez-la...

C'est une bonne idée d'attraper toutes les exceptions et d'envelopper tous les appels aux plus dans un try. Même dans la documentation de MQL, il est clairement écrit que les DLL ne doivent pas lancer d'exceptions, pas le C++.

en particulier conn.Close et new SqlConnection ne lèvent pas d'exceptions et pourraient potentiellement en lever une.

Merci ! Je l'ai vérifié, erreur d'accès à la variable partagée. L'auteur a également écrit à ce sujet.

Il faut noter que le projet de démonstration a une limitation très importante : il ne permet d'exécuter qu'un seul conseiller expert travaillant avec DB dans un terminal MetaTrader. Le problème est que toutes les EA utilisent une instance d'une DLL chargée. Comme notre classe est statique, elle sera la même pour tous les Expert Advisors en cours d'exécution. Les variables seront également communes. Si vous exécutez plusieurs experts, ils utiliseront tous la même connexion et un seul objet de commande pour tous. Si plusieurs experts essaient d'accéder à ces objets en même temps, des problèmes peuvent survenir.


Q : Comment puis-je implémenter un accès multithread à la dll (instance séparée pour chaque appel de fonction et variables locales pour chaque appel) ?

 
2020.08.17 01:22:44   9842:0.8953065>0.92137
2020.08.17 01:22:44   9843:0.8953065>0.92106
2020.08.17 01:22:44   9844:0.8953065>0.92075
2020.08.17 01:22:44   9845:0.8953065>0.92045
2020.08.17 01:22:44   9846:0.8953065>0.92014
2020.08.17 01:22:44   9847:0.8953065>0.91983
        

2020.08.17 01:22:48   9842:0.8953065>0.92137
2020.08.17 01:22:48   9843:0.8953065>0.92106
2020.08.17 01:22:48   9844:1.7189865>0.92075
2020.08.17 01:22:48   Create GlobalVariables for SELL 1.7189865>0.92075
2020.08.17 01:22:48   9845:0.8953065>0.92045
2020.08.17 01:22:48   9846:0.8953065>0.92014
2020.08.17 01:22:48   9847:0.8953065>0.91983

Je rencontre ce problème dans le testeur MT5.

En travaillant avec plusieurs devises, les données sont parfois échangées contre une autre devise. Vérifiez le testeur. Veuillez le corriger.

La première valeur estSymbolInfoDouble(symbol,SYMBOL_BID) ;

2020.08.17 01:11:38   9877(EURGBP):0.8952471000000001>0.91079
2020.08.17 01:11:38   9878(EURGBP):0.8952471000000001>0.91048
2020.08.17 01:11:38   9879(EURGBP):0.8952471000000001>0.91017
2020.08.17 01:11:38   9880(EURGBP):1.7184123>0.90987
2020.08.17 01:11:38   Create GlobalVariables for SELL 1.7184123>0.90987
2020.08.17 01:11:38   9881(EURGBP):0.8952471000000001>0.90956
2020.08.17 01:11:38   9882(EURGBP):0.8952471000000001>0.90925
2020.08.17 01:11:38   9883(EURGBP):0.8952471000000001>0.90894
2020.08.17 01:11:38   9884(EURGBP):0.8952471000000001>0.90864

Comme si elle ne pouvait pas recevoir de prixSymbolInfoDouble(EURGBP,SYMBOL_BID) ; et prend la valeur d'une autre paire qui est en cours. Existe-t-il un moyen de vérifier si la citation est correcte ?

 
SEM #:

Merci ! Je l'ai vérifié, erreur d'accès à la variable partagée. L'auteur a également écrit à ce sujet

Il convient de noter que le projet de démonstration présente une limitation très importante : il ne permet d'exécuter qu'un seul conseiller expert travaillant avec DB dans un terminal MetaTrader. Le problème est que toutes les EA utilisent une instance d'une DLL chargée. Puisque notre classe est statique, elle sera la même pour tous les Expert Advisors en cours d'exécution. Les variables seront également communes. Si vous exécutez plusieurs experts, ils utiliseront tous la même connexion et un seul objet de commande pour tous. Si plusieurs experts essaient d'accéder à ces objets en même temps, des problèmes peuvent survenir.


Q : Comment puis-je implémenter un accès multi-thread à la dll (instance séparée pour chaque appel de fonction et variables locales pour chaque appel) ?

Il n'y a pratiquement aucun moyen de le faire en .NET. La classe est rendue statique non pas parce que l'auteur de l'article est mauvais, mais parce que c'est ainsi que les classes pointues sont importées.

Je vois deux solutions : 1) (longue à écrire, mais rapide) réécrire en C++ et ne plus toucher à .NET 2) (plutôt mécaniquement, mais la vitesse diminuera et il pourrait y avoir des effets secondaires) envelopper les appels dans une section critique pour éviter que deux threads y accèdent simultanément.

si le sharping est important, une autre option consiste à réécrire les pools de connexion de contrôle au niveau de la DLL pour se souvenir du mappage EA<->connection_id et chaque EA fonctionne avec sa connexion ;
Je ne peux pas me prononcer sur .net - est-il possible d'obtenir et de stocker la référence à l'objet sharping dans une structure MQL ou un scalaire et de le faire passer dans les deux sens. Il s'agit de fonctionner comme avec un pointeur C++ ordinaire. Si vous le pouvez, alors tout est simplifié.

 
Veuillez ajouter un serveur LiteForex-ECN.com, il n'est pas possible de créer un signal.
Raison: