MetaTrader 5 build 2121: nuovo design dello Strategy Tester - pagina 7

 
Roman:

Aggiunto StringLen al test, e inizializzato la stringa in modo diverso. La documentazione dice una cosa, il comportamento reale è diverso.
E il buffer in questo caso mostra 0 invece di 260.

La documentazione specifica quando viene restituito 0 ed è appropriato per il caso specificato

 
A100:

La documentazione indica quando viene restituito 0 ed è appropriato per il caso indicato

La documentazione non corrisponde affatto al comportamento attuale!

Qual è la differenza tra i due tipi di inizializzazione?

StringInit(str, 1, "_");
string str = "_";
E i risultati sono diversi ))
E non è chiaro da dove venga il numero 260 di sinistra.
 
Roman:

La documentazione non corrisponde affatto al comportamento attuale!

Documentazione: un valore di 0 significa che la stringa è una costante e il contenuto del buffer non può essere cambiato.

La stringa è inizializzata con una costante "_" e il compilatore considera la stringa condizionatamente (per scopi di efficienza) una costante - perché no? Perché c'è una contraddizione? Tanto più che non vengono eseguite altre operazioni con esso.

 
Roman:
E in generale non è chiaro da dove venga il numero 260 di sinistra.

Il moderatore ha spiegato da dove viene, e perché nel caso di

string str = "_";

non appare - motivo per controllare

 
A100:

Il moderatore ha chiarito da dove

Penso di averlo ottenuto con il numero 260, il compilatore stesso alloca la dimensione iniziale del bufferStringBufferLen a 260.
Se la lunghezza della stringa è inferiore a 260, StringBufferLen stamperà 260, non la lunghezza effettiva della stringa!
E se la lunghezza della stringa è maggiore di 260, allora viene stampato il valore reale della stringa.

Quindi, usando la funzione StringBufferLen, con una lunghezza di stringa inferiore a 260 caratteri, non otterremo la lunghezza reale della stringa, e otterremo sempre 260.
Questo deve essere un errore.
Non appena la lunghezza supera i 260 caratteri, otterremo la lunghezza reale della stringa.

p.s. poiché la documentazione non è aggiornata è molto fuorviante.

 
Roman:

Cioè, usando la funzione StringBufferLen, con una lunghezza di stringa inferiore a 260 caratteri, non otterremo la lunghezza effettiva della stringa, e otterremo sempre 260.
Questo deve essere un errore.
Non appena la lunghezza supera i 260 caratteri, otterremo la lunghezza reale.

Lunghezza della stringa in senso stretto: StringLen e lunghezza del buffer: StringBufferLen sono funzioni piuttosto rare. E in generale possono non coincidere.

Questo fa due casi almeno discutibili:

void OnStart() 
{ 
        string s1 = "_";
        Print(StringBufferLen(s1)); //(1)//Ожидалось 260 вместо 0 - строка s1 далее может быть увеличена
        StringInit(s1,1,'_');
        const string s2 = s1;
        Print(StringBufferLen(s2)); //(2)//Ожидалось 0\1 вместо 260 - строка s2 константная и не может быть далее увеличена
}
 
まだ、ストラテジーテスターのオプティマイズの不具合が修正されていません。
修正してください。
私が使っている最適化設定は、バランス+シャープレシオですがスクリーンショットの画像のように、異常な最適化数値が表示され、以降の最適化のジェネレーションにこの異常値による正常な最適化が不可能になっています。

A MetaQuotes Software Corp.
Il bug di ottimizzazione del tester di strategia non è stato ancora risolto.
Si prega di correggere.
L'impostazione di ottimizzazione che uso è balance + sharp ratio, ma viene visualizzato un valore di ottimizzazione anomalo come nello screenshot, e l'ottimizzazione normale dovuta a questo valore anomalo viene generata nella successiva generazione di ottimizzazione. È impossibile.

L'errore nell'ottimizzazione del tester di strategia non è ancora stato risolto.
Per favore, correggetelo.
L'ottimizzazione che sto usando è balance + sharp, ma il valore di ottimizzazione anormale è mostrato come nello screenshot e l'ottimizzazione normale dovuta a questo valore anormale è generata nella successiva generazione di ottimizzazione. Questo non è possibile
 
Lalunghezza della stringa è StringLen. E StringBufferLen mostra la dimensione della memoria preallocata.

La dimensione della memoria di stringa preallocata è una questione interna del compilatore e non dovrebbe essere impostata su di esso.
 
Renat Fatkhullin:
La dimensione della memoria di stringa preallocata è una questione interna del compilatore e non ci si può fare affidamento.

I risultati dell'esecuzione mostrano che il compilatore agisce contro la logica:

  • Per una stringa costante viene allocata più memoria del necessario (la sua lunghezza non può essere aumentata in linea di principio)
  • Per una stringa non costante, non viene allocata ulteriore memoria (se la sua lunghezza viene aumentata, sarà necessaria una nuova allocazione di memoria)
  • Se un utente inizializza una stringa con StringInitInit, viene allocata più memoria del necessario, perché la dimensione del buffer è impostata esplicitamente dall'utente e nella maggior parte dei casi non sarà aumentata (l'utente ha già pensato a quale buffer finale ha bisogno e ha impostato la sua dimensione esplicitamente)
 
A100:

I risultati dell'esecuzione mostrano che il compilatore agisce contro la logica:

  • Per una stringa costante viene allocata più memoria del necessario (la sua lunghezza non può essere aumentata in linea di principio)
  • Per una stringa non costante, non viene allocata ulteriore memoria (se la sua lunghezza viene aumentata, sarà necessaria una nuova allocazione di memoria).
  • Se un utente inizializza una stringa con StringInitInit, viene allocata più memoria del necessario, perché la dimensione del buffer è definita esplicitamente dall'utente, e nella maggior parte dei casi, non sarà aumentata (l'utente ha già pensato a quale buffer finale ha bisogno e definito la sua dimensione esplicitamente)

La dimensione di preallocazione dei buffer per le stringhe è una questione interna del compilatore.

Cambieremo la gestione delle stringhe molte altre volte.

Motivazione: