Errori, bug, domande - pagina 2708

 

Suggerisco di aggiungere specifiche alla convalida automatica dei prodotti nel mercato. Oltre agli errori generali riportati dal validatore, sono fortemente richiesti il contesto del test in corso e i log. In particolare, non sono stato in grado di aggiornare un indicatore per un paio d'anni a causa dell'errore "il tester impiega troppo tempo". La prima versione è stata caricata sotto moderazione "umana" e non ha avuto lamentele. Il criterio dell'autovalidatore per emettere questo errore non è assolutamente chiaro.

Ecco una domanda specifica: quanti tick in quanto tempo dovrebbe fornire il prodotto su quale hardware in modo che il "tester impiega troppo tempo" non appaia?

L'indicatore è destinato all'elaborazione dei tick da parte dell'algoritmo MapReduce, vengono utilizzati calcoli interi, quindi non c'è nulla da comprimere, a meno che non si butti fuori l'algoritmo stesso. Il profiler è stato utilizzato, è stato aggiunto un trotlining per ricalcolare l'array di nuovi tick con un dato periodo. Senza alcun risultato.

Sul mio computer l'anno viene testato in pochi minuti. Cosa stia realmente accadendo nell'autovalidatore e perché stia rallentando è impossibile saperlo al momento.

La mancanza di un adeguato supporto al prodotto è un problema sia per gli utenti che per MQ - influenza l'implementazione.

 

È normale che sia così?

class cA
  {
public:
   int               Add(int i1,int i2)
     {
      return i1+i2;
     };
                     cA()
     {
      Print("+++");
     };
                    ~cA()
     {
      Print("---");
     };
  };

void OnStart()
  {
   cA a=cA();
  }

Diario:

2020.04.17 18:39:32.996 test3 (EURUSD,M1)       +++
2020.04.17 18:39:32.996 test3 (EURUSD,M1)       +++
2020.04.17 18:39:32.996 test3 (EURUSD,M1)       ---
2020.04.17 18:39:32.996 test3 (EURUSD,M1)       ---

Doppia chiamata al costruttore e al distruttore, come se due oggetti fossero creati e cancellati. Tutto va bene quando si usa new e delete.

Costruire 2380.

 
Aliaksandr Hryshyn:

come se venissero creati e cancellati due oggetti.

Le cose stanno così.

 
fxsaber:

Lo è.

E il mio oggetto viene creato per secondo:

class cA
  {
public:
   int               my_i;
   int               Add(int i1,int i2)
     {
      return i1+i2;
     };
                     cA()
     {
      static int i=0;
      my_i=i;
      i++;
      Print("+++");
     };
                    ~cA()
     {
      Print("---");
     };
  };

void OnStart()
  {
   cA a=cA();
   Print(a.my_i);
  }
2020.04.17 18:47:34.771 test3 (EURUSD,M1)       +++
2020.04.17 18:47:34.771 test3 (EURUSD,M1)       +++
2020.04.17 18:47:34.771 test3 (EURUSD,M1)       ---
2020.04.17 18:47:34.771 test3 (EURUSD,M1)       1
2020.04.17 18:47:34.771 test3 (EURUSD,M1)       ---
 
Aliaksandr Hryshyn:

E il mio oggetto viene creato per secondo:

Primo oggetto.

cA a=cA();


Secondo oggetto.

cA a=cA();
 

Allora è così che dovrebbe essere:

cA a;
Print(a.my_i);
 
Stanislav Korotky:

Sul mio computer, un anno viene testato in pochi minuti. Cosa stia realmente accadendo nell'autovalidatore e perché stia rallentando è impossibile saperlo al momento.

Un anno in pochi minuti è molto. Quasi nessuno avrebbe aspettato (se fosse stato un EA).
Disegna visivamente in modo normale? È possibile capire qualcosa osservando il tester?

Aggiungere una spina per il mercato - accelerare i calcoli a scapito della precisione (se possibile), o disegnare "qualcosa di simile" del tutto. Il prodotto è chiaramente specifico, e chi ne ha bisogno potrà cambiare il parametro giusto.

 
Andrey Khatimlianskii:

Un anno in pochi minuti è molto. Quasi nessuno avrebbe aspettato (se fosse stato un EA).
E visivamente si disegna bene? È possibile capire qualcosa osservando il tester?

Aggiungere uno stub per il mercato - accelerare i calcoli a spese della precisione (se possibile), o disegnare "qualcosa di simile" del tutto. Il prodotto è chiaramente specifico, e chi ne ha bisogno potrà cambiare il parametro giusto.

Secondo me, un anno in pochi minuti in modalità potica va bene. C'era un limite di 15-20 minuti nei campionati (non ricordo esattamente). Una stalla è già stata aggiunta (time-lapse trottling). Si possono saltare le zecche, ma allora il punto del prodotto scompare. La specificità è un concetto relativo: so che molti lavorano in modalità tick (e tutti hanno un add-on con controllo di prezzo e/o volume). E tanto più importante, per avere criteri più precisi, più il feedback dell'autovalidatore (se diciamo "il tuo terminale non funziona" nel forum, noi MQ cosa chiediamo? - dare registri e condizioni per la riproduzione; qui otteniamo un messaggio che il nostro prodotto non funziona, ma nessuna specifica). Ed è più corretto prendere in considerazione le specificità del prodotto. Dopo tutto, il tempo totale di esecuzione del prodotto non è solo il tempo del codice MQL, ma il terminale stesso. Ci sono chiamate più costose come CopyTicksRange. Queste spese generali sono ora considerate come difetti nel prodotto MQL.

PS. Nel caso degli indicatori sembra che non sia più critica l'operazione per tick, ma il numero di buffer (ce ne sono molti a causa delle peculiarità del compito). Cercherò di limitarne il numero per il tester (rende il prodotto più complicato e irto di errori, così come altre bandiere imposte da condizioni esterne, come il trotto). Questo dimostra ancora una volta la necessità dell'autovalidatore di variare il punteggio delle prestazioni su diversi parametri.

PPS. Sto richiedendo le zecche per l'ultimo giorno, e il tester le sta caricando per 2 anni - e anche questo richiede tempo.

 
Stanislav Korotky:

PPS. Sto richiedendo le zecche per l'ultimo giorno, e il tester le sta caricando per 2 anni

Per qualche motivo questo comportamento è ufficiale.

Suppongo che non dovrebbero generare affatto barre per gli Expert Advisors che non usano indicatori o barre di indirizzo ecc.

Per esempio, se c'è solo SymbolInfoTick - non generare barre, non memorizzare la storia per i copyticks.


Non è affatto chiara questa barofilia per uno strumento di algotrading serio come il Tester. Ma siccome anche gli esteti del MO continuano a sgranocchiare questo cactus, probabilmente non c'è comprensione.

 

Perché in MQL non posso chiamare il costruttore protetto dal mio metodo di fabbrica?

class A1
{
  protected:
    A1(const bool x = false){}
  public:  
    static A1 *creator()
    {
      return new A1(true);
    }
};

void OnStart()
{
  A1 *a = A1::creator();
}

Il codice dà un errore di compilazione "'A1::A1' - cannot access protected member function", e specifica la linea dove inizia la descrizione della classe, non dove viene chiamato il costruttore (cioè devo cercare manualmente dove è il problema).

Ma il punto è che non ci dovrebbe essere alcun errore. C++ si compila senza problemi.