Librerie: MultiTester - pagina 3

 
Edgar:

Se si intende come guardare i risultati dell'ottimizzazione, stavo parlando di leggere i risultati dalla cache in modo programmatico.

Non è quello che intendevo. Ma la lettura della cache è possibile. Basta scriverla.

[Eliminato]  

Roba forte!!!

Ci ho avvitato anche Cycles ed era esattamente quello che mi mancava )))))

#include <fxsaber\MultiTester\MultiTester.mqh> // Esecuzioni multiple/ottimizzazioni in Tester.

enum CyclNum
{
   n01   = 1,     // 1
   n02,           // 2
   n03,           // 3
   n04,           // 4
   n05,           // 5
   n06,           // 6
   n07,           // 7
   n08,           // 8
   n09,           // 9
   n10,           // 0
};
sinput bool Period_M1 = false;         // Accendere M1
sinput bool Period_M5 = false;         // Accendere M5
sinput bool Period_M15 = false;        // Accendere M15
sinput bool OnlyCustomSymbols = false; // Solo caratteri personalizzati
sinput CyclNum number_cycles  = n06;   // Numero di cicli

// Questa funzione è responsabile della generazione dell'elenco dei compiti.
void SetTesterSettings()
{
   for(int n = 0; n < number_cycles; n++)
   {
      // Cerca tutti i simboli nel Market Watch.
      for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
      {

Grazie!

 
Сергей Таболин:

Ho aggiunto Cycles ed era esattamente quello che mi serviva ))))

Ho bisogno di funzioni di pressione dei pulsanti nel Tester. Allora l'automazione sarebbe di un altro livello.

 

Ho aggiunto alcune funzioni per i controlli di cui ho bisogno (Depo, Currency, Leverage, OptimisationType, BarsType, Criteria). Ma non l'ho ancora testato. Posso pubblicarlo in seguito.

Volevo implementare la gestione degli agenti. Ad esempio, è possibile fare clic sull'elenco degli agenti, premere HOME e selezionare ogni agente con VK_DOWN. Ma non so come richiamare il menu contestuale per la riga selezionata. E ci sarebbe da premere 'd'/'e' per disabilitare/abilitare.

Qualcuno può darmi un suggerimento?

È ancora più difficile abilitare/disabilitare la nuvola (disabilitare prima della spunta o dell'ottimizzazione incrociata). Se si arriva al menu contestuale, non si può abilitare/disabilitare esplicitamente, si può solo girare. Non è possibile scoprire lo stato attuale in modo programmatico. Si può leggere dal log del terminale "2019.07.31 19:27:35.664 Tester Cloud servers using switch off". Sembra che non sia possibile leggere il log nemmeno in modo programmatico, bisogna guardare nel file di log.

C'è ancora una possibilità di comandi WinAPI non documentati. Forse qualche programmatore C++ sa come trovarli?

[Eliminato]  

Di fronte al problema dell'interruzione di corrente. Ora non so quanto sia stata fatta l'ottimizzazione ((((.

Quando avrò tempo, cercherò di aggiungere un controllo della percentuale di ottimizzazione totale e dei caratteri lavorati. Spero che all'autore non dispiaccia. ))) O vorrà farlo lui stesso?

 
Сергей Таболин:

Il problema dell'interruzione di corrente è stato affrontato. Ora non so quanto sia stata fatta l'ottimizzazione ((()

MultiTester riflette i suoi passi nei log. Se il terminale ha salvato i log, si vedrà tutto lì.

Inoltre, le cache di ottimizzazione sono salvate al 100%. Quindi è possibile vedere cosa è stato eseguito.

 
Edgar:

Ho aggiunto alcune funzioni per i controlli di cui ho bisogno (Depo, Currency, Leverage, OptimisationType, BarsType, Criteria). Ma non l'ho ancora testato. Posso pubblicarlo in seguito.

Prima di risolvere problemi privati, sarebbe opportuno descrivere gli scenari di utilizzo delle loro soluzioni.

 
fxsaber:

Prima di risolvere i problemi privati, è bene prescrivere gli scenari di utilizzo delle loro soluzioni.

Ho descritto il mio scenario nella pagina precedente.

Clicker non sostituisce tutto, ma è uno dei vari strumenti necessari per automatizzare l'ottimizzazione. Permette di fare tutto all'interno di un terminale senza dover lanciare un terminale aggiuntivo. Aggiungerei i frame per l'analisi dei risultati (la nuova libreria per la lettura della cache di ottimizzazione è adatta allo stesso scopo), le funzioni per la gestione delle variabili di input, SQLITE per la memorizzazione di stati e statistiche. E si possono scrivere script di ottimizzazione intelligenti. Non è possibile raggiungere l'universalità, ogni Expert Advisor ha il suo script. È necessario crearlo manualmente e applicarlo ripetutamente.

I frame sono già stati aggiunti. Ho avuto esperienza con SQLITE.

Ho solo esteso la vostra libreria per le mie esigenze. Sono sicuro che lo stavate progettando voi stessi, ma non ho aspettato. Questa è l'unica tecnologia di cui sopra per la quale non avevo una soluzione pronta. A proposito, ho controllato i miei componenti aggiuntivi e funzionano. I problemi di gestione degli agenti sono ancora rilevanti. Spy++ può aiutare a catturare i messaggi per un sistemista esperto, ma io ho avuto poco aiuto, devo sapere cosa filtrare. Spero che la gente si alzi. L'argomento è stato sollevato dal 2008.

 
Edgar:

Ecco come vorrei migliorarlo. Il mio tipico scenario di ottimizzazione:

Eseguire N prove genetiche per OHLC. Prendere il miglior risultato da ciascuno di essi in base a un criterio personalizzato.

Eseguire un'ottimizzazione lenta su ogni gruppo di parametri (ogni gruppo ha 2-3 parametri interdipendenti).

Ripetere iterativamente le ottimizzazioni lente per ciascun gruppo fino a raggiungere l'optimum (i parametri smettono di fluttuare).

Passare ai tick reali, eseguire le stesse ottimizzazioni lente.

Passare a un altro simbolo, ripetere tutto.

Non ho un compito del genere davanti a me. Naturalmente, sarebbe bene che l'automazione lo permettesse.

Io stesso sto cercando di sviluppare un criterio per la robustezza del TS attraverso indicatori di auto-ottimizzazione. Manca molto per una maggiore obiettività nella ricerca.

Lo schema dell'auto-ottimizzatore è stato completamente pensato, non ci sono ostacoli tecnici per la sua implementazione.

Bibla ha sicuramente bisogno di essere integrato con delle funzionalità. Vi preghiamo quindi di suggerire le vostre realizzazioni.

 
enum eOptType   { eOptOff, eOptSlow, eOptGen, eOptAllSym };
enum eBars      { eBarsEvery, eBarsReal, eBarsOHLC, eBarsOpen, eBarsMath };
enum eCriteria  { eCritBal, eCritPF, eCritEPO, eCritDD, eCritRF, eCritSR, eCritCust };



class MTTESTER {
public:

        static bool 
        SetOptType(eOptType opt) {
                const bool rc = MTTESTER::IsReady();
                if (rc) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x28FB };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_HOME, 0);
                        for (int i = 0; i < opt; i++)
                                user32::SendMessageW(Handle, WM_KEYDOWN, VK_DOWN, 0);
                }
                return rc;
        }



        static bool 
        SetBars(eBars type) {
                const bool rc = MTTESTER::IsReady();
                if (rc) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x2913 };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_HOME, 0);
                        for (int i = 0; i < type; i++)
                                user32::SendMessageW(Handle, WM_KEYDOWN, VK_DOWN, 0);
                }
                return rc;
        }



        static bool 
        SetCriteria(eCriteria type) {
                const bool Res = MTTESTER::IsReady();
                if (Res) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x290B };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_HOME, 0);
                        for (int i = 0; i < type; i++)
                                user32::SendMessageW(Handle, WM_KEYDOWN, VK_DOWN, 0);
                }
                return Res;
        }



        static bool 
        SetCurrency(const string name) {
                const bool Res = MTTESTER::IsReady();
                if (Res) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x293F, 0x03E9 };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_LBUTTONDOWN, 0, 0);
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_DELETE, 0);
                        char Chars[];
                        const int Size = ::StringToCharArray(name, Chars);
                        for (int i = 0; i < Size; i++)
                                user32::SendMessageW(Handle, WM_CHAR, Chars[i], 0);
                }
                return Res;
        }



        static bool 
        SetDepo(const long depo) {
                const bool Res = MTTESTER::IsReady();
                if (Res) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x28F9, 0x03E9 };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_LBUTTONDOWN, 0, 0);
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_DELETE, 0);
                        string s = IntegerToString(depo);
                        char Chars[];
                        const int Size = ::StringToCharArray(s, Chars);
                        for (int i = 0; i < Size; i++)
                                user32::SendMessageW(Handle, WM_CHAR, Chars[i], 0);
                }
                return Res;
        }



        static bool 
        SetLeverage(const long leverage) {
                const bool Res = MTTESTER::IsReady();
                if (Res) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x28E9, 0x03E9 };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_LBUTTONDOWN, 0, 0);
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_DELETE, 0);
                        string s = "1:" + IntegerToString(leverage);
                        char Chars[];
                        const int Size = ::StringToCharArray(s, Chars);
                        for (int i = 0; i < Size; i++)
                                user32::SendMessageW(Handle, WM_CHAR, Chars[i], 0);
                }
                return Res;
        }