Errori, bug, domande - pagina 3079

 
Lo screenshot non si carica nel mercato. Provato da due browser.
 
Dmitry Fedoseev #:
Il mercato non carica uno screenshot. Provato da due browser.

Anch'io...

 

Buon pomeriggio, quale potrebbe essere il problema? Uso la dll per scrivere su SQL Server (esempio dall'articolo https://www.mql5.com/ru/articles/2895 ).

Se uso fino a 5 thread, i dati vengono scritti correttamente. Se uso più thread, ci sarà un errore "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.
File:
SQL.mqh  19 kb
OHLC_1.mq5  5 kb
 
SEM #:

Buon pomeriggio, quale potrebbe essere il problema? Uso la dll per scrivere su SQL Server (esempio dall'articolo https://www.mql5.com/ru/articles/2895 ).

Se uso fino a 5 thread, i dati vengono scritti correttamente. Se uso più threads l'errore "Unhandled exception 0xE0434352" appare subito.

In tutte le funzioni della DLL di interfaccia dovremmo usare try catch, catturare "unhandled exception" e scriverlo nel log...

È una buona idea catturare tutte le eccezioni e provare tutte le chiamate ai plus. Anche nella documentazione MQL è scritto chiaramente - le DLL non dovrebbero lanciare eccezioni, non il C++.

in particolare nell'articolo conn.Close e new SqlConnection non rientrano in "exception catching" e possono potenzialmente lanciare eccezioni

 
Dmitry Fedoseev #:
Lo screenshot non si carica nel Marketplace. Ho provato con due browser.
Yury Emeliyanov #:

Anch'io...

Hai provato un semplice drag and drop dell'immagine?

Forum sul trading, sistemi di trading automatico e test di strategia

Mercato e matematica

Alexey Viktorov, 2021.08.19 21:01

Provate a inserire un'immagine semplicemente trascinandola sul testo.

Ora ho provato a fare delle modifiche in Expert Advisor nascosto e ho trascinato la prima immagine che ho visto.



 
Alexey Viktorov #:

Hai provato un semplice drag and drop dell'immagine?


su 5 immagini solo una viene aggiunta

 
Andrei Trukhanovich #:

Questo è stato il caso per molto tempo. Le stringhe mql non amano molto i caratteri nulli all'interno di una stringa e nei letterali, anche nelle funzioni.

L'unico modo normale è convertire tre stringhe in un array con uno zero finale.

Cioè questo comportamento come è ora è stato fatto deliberatamente qualche anno fa. Non conosco le ragioni.

Ci sono nemici ovunque

 
Maxim Kuznetsov #:

In tutte le funzioni DLL di interfaccia, avvolgere tutto in try catch, catturare l'"eccezione non gestita" e registrarla...

È una buona idea catturare tutte le eccezioni e avvolgere tutte le chiamate a plus in try. Anche nella documentazione MQL è scritto chiaramente - le DLL non dovrebbero lanciare eccezioni, non il C++.

in particolare conn.Close e new SqlConnection non lanciano eccezioni e potrebbero potenzialmente lanciarne una

Grazie! Controllato, errore di accesso alla variabile condivisa. Anche l'autore ne ha scritto.

Va notato che il progetto demo ha una limitazione molto significativa: permette di eseguire solo un Expert Advisor che lavora con DB in un terminale MetaTrader. La questione è che tutti gli EA usano un'istanza di una DLL caricata. Poiché la nostra classe è statica, sarà la stessa per tutti gli Expert Advisor in esecuzione. Anche le variabili saranno comuni. Se si eseguono diversi esperti, essi useranno tutti la stessa connessione e un oggetto comando per tutti. Se diversi esperti cercano di accedere a questi oggetti allo stesso tempo, possono verificarsi dei problemi.


D: Come posso implementare l'accesso multi-thread a dll (istanza separata per ogni chiamata di funzione e variabili locali per ogni chiamata)?

 
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

Sto riscontrando questo problema nel tester MT5.

Lavorando con più valute, i dati vengono occasionalmente scambiati da un'altra valuta. Controllare il tester. Per favore, correggetelo.

Il primo valore èSymbolInfoDouble(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

Come se non potesse ricevere i prezziSymbolInfoDouble(EURGBP,SYMBOL_BID); e prende il valore da un'altra coppia che è in funzione. C'è un modo per controllare se la citazione è corretta?

 
SEM #:

Grazie! Controllato, errore di accesso alla variabile condivisa. L'autore ha anche scritto

Va notato che il progetto demo ha una limitazione molto significativa: permette di eseguire solo un Expert Advisor che lavora con DB in un terminale MetaTrader. La questione è che tutti gli EA usano un'istanza di una DLL caricata. Poiché la nostra classe è statica, sarà la stessa per tutti gli Expert Advisor in esecuzione. Anche le variabili saranno comuni. Se si eseguono diversi esperti, essi useranno tutti la stessa connessione e un oggetto comando per tutti. Se diversi esperti cercano di accedere a questi oggetti allo stesso tempo, possono verificarsi dei problemi.


D: Come posso implementare l'accesso multi-thread a dll (istanza separata per ogni chiamata di funzione e variabili locali per ogni chiamata)?

Non c'è quasi nessun modo di farlo in .NET. La classe è resa statica non perché l'autore dell'articolo sia malvagio, ma perché è così che vengono importate le classi nitide.

Vedo due modi: 1) (lungo da scrivere, funziona velocemente) riscrivere in C++ e non toccare più .NET 2) (piuttosto meccanicamente, ma la velocità scenderà e potrebbero esserci effetti collaterali) avvolgere premurosamente le chiamate in Critical Section per evitare che due thread accedano contemporaneamente

se lo sharping è importante, un'altra opzione - riscrivere i pool di connessioni di controllo a livello di DLL per ricordare la mappatura di EA<->connection_id e ogni EA lavora con la sua connessione;
non posso dire su .net - è possibile ottenere e memorizzare il riferimento all'oggetto sharping in qualche struttura MQL o scalare e passarlo avanti e indietro. Cioè operare come con un normale puntatore C++. Se è possibile, allora tutto si semplifica.