Errori, bug, domande - pagina 452

 

Grazie!

 
alexvd:

Sì, sul primo punto sono chiaramente confuso. Spiegare cosa c'è esattamente di sbagliato nella descrizione, che una copia dovrebbe essere restituita?

E riguardo alla concatenazione, nel tuo caso avresti dovuto scrivere qualcosa come

Per chiarire. Dice"Restituisce una copia della stringa con un valore modificato del carattere nella posizione specificata. "Il prototipo della funzione è boolStringSetCharacter(...). Ovviamente, non si può mettere una stringa in un bool. Se effettivamente viene restituito un booleano, allora apparentemente questo è un segno di successo/errore. Normalmente altre pagine di documentazione hanno una sezione separata sulvalore restituito, ma questa pagina non ne ha una. Dovrebbe essere aggiunto, e nella descrizione testuale formulare una frase riguardante la semantica della funzione, non il valore di ritorno.


Per quanto riguarda la concatenazione, se quello che hai scritto è corretto, anche la descrizione della funzione StringConcatenate dovrebbe essere cambiata. La descrizione dice che il parametrostring_var è una stringa [in][out] che sarà generata come risultato della concatenazione. Lei afferma che questo parametro è solo [out].

 
Nuova domanda. Cosa significa quando BarsCalculated restituisce 0. Non sembra essere un errore, ma come si possono calcolare 0 barre? In effetti - non è stato contato nulla. Non è un errore?
 
MoneyJinn:

Purtroppo, il problema è che il terminale pubblica solo gli ordini di chiusura delle posizioni con commenti nella scheda "Risultati".

L'ordine corrispondente non viene aggiunto alla lista di HistoryDealsTotal().

Nella lista generale degli ordini HistoryOrdersTotal(), manca anche l'ordine, anche se si seleziona un periodo con una certa ridondanza.

Vi posso assicurare che sia gli ordini che gli affari, nel caso di chiusura per 'fine test', sono presenti nella storia. Il mio multicurrency calcola il profitto guadagnato su ogni simbolo. Le compravendite chiuse nel tester entro la "fine del test" sono corrette nella deinizializzazione per riflettere queste compravendite. Il profitto totale per tutti i simboli coincide con i dati del rapporto di prova. Questo è il codice;

       if(HistorySelect(0,TimeTradeServer()))   // Поправка для 'end of test'
        {
         int DeelsTotal=HistoryDealsTotal();
         for(int i=0;i<SymbolsNumber;i++)
           {
            ulong ticket=HistoryDealGetTicket(DeelsTotal-1-i);
            string comment=HistoryDealGetString(ticket,DEAL_COMMENT);
            if(comment!="end of test"&&StringSubstr(comment,0,3)!="so ")
               break;
            for(int j=0;j<SymbolsNumber;j++)
              {
               if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=m_expert[j].Name())
                continue;
               m_Profit[j]=m_Profit[j]+HistoryDealGetDouble(ticket,DEAL_PROFIT)+  // Добавим профит закрытой позиции для "end of test" и "so"
                           HistoryDealGetDouble(ticket,DEAL_SWAP)+HistoryDealGetDouble(ticket,DEAL_COMMISSION);
              }
           }
        }
 

Colleghi, c'è un modo per far funzionare SymbolInfoSessionTrade nello strategy tester?

Una voce banale non funziona:

void OnTick() {
  datetime from, to;
  if (SymbolInfoSessionTrade(_Symbol, FRIDAY, 0, from, to)) Print("WOW!");
}
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
  • www.mql5.com
Получение рыночной информации / SymbolInfoSessionQuote - Документация по MQL5
 

Un'altra domanda, se possibile. Vorrei capire il significato del nuovo operatore. Qual è l'idea di fondo? Perché non creare l'oggetto nel solito modo? Dopo tutto, dopo la fine del blocco l'accesso all'oggetto dichiarato attraverso new sarà perso, quindi perché ne abbiamo bisogno?

P.S. Onestamente non l'ho trovato nella documentazione :)

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 
220Volt:

Un'altra domanda, se possibile. Vorrei capire il significato del nuovo operatore. Qual è l'idea di fondo? Perché non creare l'oggetto nel solito modo? Dopo tutto, dopo la fine del blocco l'accesso all'oggetto dichiarato attraverso new sarà perso, quindi perché ne abbiamo bisogno?

Tutto passa ad un certo punto. Significa che non c'è niente da fare...?


P.S. onestamente non l'ho trovato nella documentazione :)

Ti credo... :))
 
Valmars:

Grazie! L'ho capito. È necessario e sufficiente usareTimeTradeServer() invece di TimeCurrent().

Alla fine della settimana di trading non ci sono quotazioni fresche ed è per questo che TimeCurrent() non viene aggiornato per molto tempo.

Quando si deinizializza l'Expert Advisor, TimeCurrent() mostra l'ora 23:00; TimeTradeServer() mostra l'ora 23:59, che coincide con la fine del test.

 
MoneyJinn:

Grazie! L'ho capito. È necessario e sufficiente usareTimeTradeServer() invece di TimeCurrent().

Alla fine della settimana di trading non ci sono nuove quotazioni e quindi TimeCurrent() non viene aggiornato per molto tempo.

Il punto non è nelle virgolette ma nel fatto che gli accordi di "fine test" sono eseguiti dopo che il periodo di test è finito. Quindi, né 'OnTick' né 'OnTimer' possono prenderli dalla storia. Almeno era così un anno fa, quindi ho spostato il loro controllo su 'OnDeinit'.
 
220Volt:

Un'altra domanda, se possibile. Vorrei capire il significato del nuovo operatore. Qual è l'idea di fondo? Perché non creare l'oggetto nel solito modo? Dopo tutto, dopo la fine del blocco l'accesso all'oggetto dichiarato tramite new sarà perso, quindi perché ne abbiamo bisogno?

P.S onestamente non è riuscito a trovarlo nella documentazione :)

Non create oggetti dinamici - non dovrete usare ora e tutto ciò che è associato a questi oggetti (anche se poi non potrete fare molto).

Vuoi capire non il significato di adesso, ma il significato di lavorare con oggetti dinamici...

Inizializzazione e deinizializzazione di oggetti posizionati dinamicamente

I puntatori agli oggetti sonoun caso speciale, perché la dichiarazione di un puntatore non richiede l'inizializzazione dell'oggetto in questione. Gli oggetti posizionati dinamicamente sono inizializzati solo al momento della creazione di un'istanza di una classe tramite l'operatore new. L'inizializzazione di un oggetto implica una chiamata al costruttore della classe corrispondente. Se non c'è un costruttore corrispondente in una classe, i suoi membri di tipo semplice non saranno inizializzati automaticamente; i membri di tipo stringa, array dinamico e oggetto complesso saranno inizializzati automaticamente.

Ipuntatori possono essere dichiarati localmente o globalmente, e possono essere inizializzati con un valore NULL vuoto o con un puntatore dello stesso tipo o di uno spawned . Senew vienechiamato su un puntatore dichiarato a livello locale , anche la dichiarazione di cancellazioneper quel puntatore deve essere eseguita prima di lasciare il livello locale. Altrimenti, il puntatore sarà perso e l'oggetto non può essere cancellato esplicitamente.

Tutti gli oggetti creati dall'espressione pointer_object=new_ClassName devono essere distrutti successivamente con l'operatore delete(pointer_object).Se, per qualche motivo, questa variabile non è stata distrutta dall'operatore di cancellazione, il messaggio relativo apparirà nel Diario degli esperti. Potete dichiarare più variabili e assegnare a tutte loro dei puntatori allo stesso oggetto.

Se l'oggetto creato dinamicamente ha un costruttore, questo costruttore sarà chiamato quando viene eseguito il nuovooperatore . Se l'oggetto ha un distruttore, il distruttore sarà chiamato quando viene eseguito l'operatore dicancellazione.

Così, gli oggetti posizionati dinamicamente sono creati solo quando vengono creati utilizzando l'operatore new, e sono garantiti per essere eliminati o dall'operatore delete o automaticamente dal sistema di esecuzione MQL5 al momento dello scarico del programma.L'ordine di dichiarazione dei puntatori degli oggetti creati dinamicamente non influenza l'ordine della loro inizializzazione. L'ordine di inizializzazione e deinizializzazione è completamente controllato dal programmatore.