MetaTrader 5 Strategy Tester: bug, errori, suggerimenti per il miglioramento - pagina 46

 
traveller00:
Bild 2280, ma questo era anche il caso nelle versioni precedenti. Se eseguo uno script o un EA per il debug, si apre una nuova finestra del primo simbolo dalla panoramica del mercato sul timeframe 1H. E se ho bisogno di fare il debug non sul primo simbolo o su un altro timeframe? C'è un modo per farlo senza cancellare tutti i simboli per far venire prima quello giusto?
Vai alle impostazioni del terminale. Lì potete selezionare il simbolo di cui eseguire il debug.
 
Artyom Trishkin:
Vai alle impostazioni del terminale. Lì c'è una selezione di simboli per il debug.

Artyom, hai sbagliato. Queste sono impostazioni del ME, non del terminale.


Devi lavorare meno)))

 
Artyom Trishkin:
Vai alle impostazioni del terminale. Lì potete selezionare un simbolo per il debug.

Capito, grazie. Sono nuovo di MT5, non so ancora tutto.

 
Alexey Viktorov:

Artyom, hai sbagliato. Queste sono impostazioni del ME, non del terminale


Dovresti lavorare meno)))

Sì, errore mio... A volte, quando si scrive da un telefono cellulare, non si può nemmeno guardare...
 

Costruire 2280. Ci sono 4 processori sul computer. Ci sono 2 MT5 in funzione. La prima è l'esecuzione di un lungo script, terminal64.exe sta mangiando il 100% di 1 processore, risultando in un carico totale del 25%. Il secondo MT5 sta eseguendo l'ottimizzazione genetica. Ci sono 4 agenti per il numero di processori come standard. Il primo gruppo di lavori ottiene tutti i 127. I compiti rimanenti sono ricevuti ed eseguiti da 2 agenti, i restanti 2 sono appesi in finito e nemmeno ricevuti. Se li disabilitate forzatamente, cominceranno a funzionare. Finché l'ottimizzazione non ricomincia. Se si uccide prima MT5, la situazione rimane la stessa. Se riavviate il secondo MT5 dopo questo, andrà tutto bene. È un bilanciamento del carico così complicato o un bug da qualche parte? Se il primo, allora non è molto buono, perché finisce per caricare al 75% (primi agenti MT5+2) e ancora dovrebbe essere gestito piuttosto dalle priorità del vento.

P.S. Sembra che non sia necessariamente legato al carico della CPU. Ha appena iniziato la genetica solo dopo il riavvio, nient'altro in esecuzione, anche 2 agenti erano pigri finché non li ho spenti/accesi. Se tengo solo 3 agenti attivi e ne disabilito 1 a tutti, ancora 2 sono in ritardo, solo 1 funziona.

P.P.S. Se ci sono 6 processori, allora ce ne sono 3.
 

Costruire 2280. Debug dell'indicatore, eseguito passo dopo passo nel debugger. Sulla linea

StartTime = iTime(Symbols[0], _Period, Pos + PosAddon);

il debug si è bloccato. Qualcosa come un errore critico, il debug si è fermato. Nel registro c'è scritto

           crash -->  000000 B7250C38B1 038424 B8000000    add        eax, [rsp+0xb8]
                      000000 B7250C38B8 89442460          mov        [rsp+0x60], eax
                      000000 B7250C38BC 448 B4C2460        mov        r9d, [rsp+0x60]
                      000000 B7250C38C1 49 B8010000000000  mov        r8, 0x1
                                       0000
                      000000 B7250C38CB 488 B542468        mov        rdx, [rsp+0x68]
                      000000 B7250C38D0 48 B9E8DD4220B700  mov        rcx, 0xb72042dde8
                                       0000
                      000000 B7250C38DA 49 FF96580F0000    call       qword near [r14+0xf58]  ; #11037 (terminal64.exe)
        
        00: 0x000000B7250C38B1

Succede ancora, ma raramente. A mia insaputa, non è cambiato molto tra un debug e l'altro.

 

Costruire 2280. Borsa, mercato dei futures. Tutta la storia viene caricata, ma i test vengono fatti offline. iBarShift funziona stranamente negli indicatori. E lo stesso codice funziona bene nello script. È un bug o mi manca qualcosa?

#property indicator_separate_window

void OnInit()
{
  datetime Time[];
  ArraySetAsSeries(Time, true);
  CopyTime(_Symbol,_Period,0,1,Time);

  int Shift=iBarShift(_Symbol,_Period,Time[0]);
  Print("Symbol="+_Symbol+", Shift="+(string)Shift);

  for(int i=0;i!=SymbolsTotal(true);++i)
  {
    const string SymbName=SymbolName(i,true);
    Shift=iBarShift(SymbName,_Period,Time[0]);
    Print("Symbol="+SymbName+", Shift="+(string)Shift);
  }
}

int OnCalculate(const int rates_total,const int prev_calculated,const datetime& time[],const double& open[],const double& high[],
  const double& low[],const double& close[],const long& tick_volume[],const long& volume[],const int& spread[])
{
  return 0;
}

Esiste un tale codice. Essenzialmente scorre attraverso tutti i simboli dall'esame del mercato e strattona l'iBarShift. Lo stesso codice funziona bene nello script. L'indicatore produce -1 per tutti i simboli, tranne quello corrente (sul grafico di cui è in esecuzione) con l'errore che non c'è storia. Allo stesso tempo, alla seconda esecuzione, apparentemente carica la storia e la mostra già normalmente.

 
traveller00:

lo stesso codice funziona bene nello script. È un bug o mi manca qualcosa?

A differenza dello script, l'indicatore funziona in modo asincrono - non aspetta che la storia sia pronta.

 
fxsaber:

A differenza dello script, l'indicatore funziona in modo asincrono - non aspetta che la storia sia pronta.

Beh, tutta la storia è lì. Come ho detto, funziona offline, tutta la storia è già scaricata dal server. O ha bisogno di qualcos'altro?

 
traveller00:

Beh, tutta la storia è lì. Come ho detto, sta lavorando offline, tutta la storia è già scaricata dal server. O ha bisogno di qualcos'altro?

In teoria, ovviamente, è necessario portare tutto su dall'inizio a freddo. In pratica, però, non mi occupo di indicatori, quindi non posso dirlo con certezza.