Archivio delle versioni MT. - pagina 3

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

Credo che TesterStop() eExpertRemove() dovrebbero restituire true se non possono passare immediatamente il controllo a OnTester(). Permetterà di reagire in qualche modo, per esempio, così:

bool                 tester_stop = false;                 // флаг проверки выхода по TesterStop
.......
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(недопустимый параметр)          tester_stop = TesterStop();
........
}
double OnTester()
{
   if(tester_stop) return(-99999999999.99);

In questo caso, possiamo ottenere esattamente il risultato che ci si aspetta logicamente, invece di ballare e prevedere tutti gli errori che possono teoricamente verificarsi come risultato dell'arresto del test.

E questa è l'opzione che volevi vedere.

bool                 tester_stop = false;                 // флаг проверки выхода по TesterStop
.......
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(недопустимый параметр)
       {
        TesterStop();
        tester_stop = true;
        return;
       }
........
}
double OnTester()
{
   if(tester_stop) return(-99999999999.99);
 
Roman:

In questo contesto, non possiamo fare il controllo?

E come possiamo prevenire/annullare la terminazione forzata se è già in esecuzione? I vostri esempi sono un po' diversi.
 
Alexey Viktorov:
E come si fa a prevenire/annullare la terminazione forzata se è già in corso? I vostri esempi sono un po' diversi.

Non innescare una terminazione forzata. Allora non c'è bisogno di cancellarlo.

Probabilmente, forzando il completamento che è già in esecuzione, cancellarlo non ha senso a causa di possibili difetti del software.
Per questo motivo, è probabile che non ci sia questa possibilità. Non posso dirlo con certezza.
Questo significa che dovremmo organizzare logicamente il nostro codice in modo tale da non dover tornare al codice in esecuzione dopo aver forzato la terminazione.
Se ci ritiriamo, ci ritiriamo esplicitamente.

 
Roman:

È improbabile che una terminazione forzata che è già stata attivata abbia senso da annullare a causa di possibili difetti del software.
Pertanto, probabilmente non c'è una tale opzione. Non posso dirlo con certezza.
Questo significa che dovremmo organizzare logicamente il nostro codice in modo tale da non dover tornare al codice in esecuzione dopo aver forzato la terminazione.
Se ci ritiriamo, ci ritiriamo esplicitamente.

In qualche modo ho l'impressione che tu non abbia letto tutto nel topic. Qualcosa non coincide con la tua opinione sul problema in questione.

ps; Anche se no. Nel tuo primo post di questo thread sembravi citare le mie parole esatte, ma non completamente. Forse per questo l'intera idea del problema si è spostata.
 
Qualunque siano le domande, queste sono le risposte. Parlate con voi stessi, allora. Si cerca di entrare nel problema e alla gente continua a non piacere. Buona fortuna nel trovare il problema.
 
Alexey Viktorov:

E questa è la versione che volevate vedere.

Proprio così.

Ma non è

if(недопустимый параметр)          tester_stop = TesterStop();

più semplice e più chiaro di...

if(недопустимый параметр)
       {
        TesterStop();
        tester_stop = true;
        return;
       }

?

Ma ora ho fatto esattamente come mi avete consigliato.

 
Roman:
Tali domande e tali risposte. Potete discuterne con voi stessi. Cerchi di entrare in un problema e alla gente continua a non piacere. Buona fortuna nel trovare il problema.

Non dovresti offenderti. Bisognava leggere tutta la frase per capirla.

Forum sul trading, sistemi di trading automatico e strategie di trading di prova

Archivio delle versioni MT.

Alexey Viktorov, 2019.06.16 15:25

Sergey, non c'è niente di inaspettato. Al contrario, tutto è logico e coerente. Ci sono diversi casi. A volte devi completare l'elaborazione dell'evento prima che l'Expert Advisor finisca il suo lavoro, a volte, come nel tuo caso, devi finirlo con urgenza. Glisviluppatori si trovano di fronte alla domanda, qual è la cosa giusta da fare, fermarsi immediatamente, causando il malcontento di coloro che hanno bisogno di finire l'elaborazione dell'evento, o fermarsi dopo il completamento dell'elaborazione dell'evento. Qualsiasi programmatore ha nel suo arsenale l'operatore di ritorno, mentre non c'è nulla in caso di terminazione forzata.

E perché avete bisogno di cambiare il tipo void sul bool, perché di nuovo, nell'arsenale del programmatore ci sono variabili statiche che possono essere cambiate prima o dopo TesterStop (), e in linea di principio, tutto sarà come volete. Ma l'avete omesso dal mio esempio per qualche motivo.

e tu hai preso solo la seconda parte fuori dal contesto senza prestare attenzione alla prima parte.
 
Сергей Таболин:

Proprio così.

Ma non è

più semplice e più chiaro di...

?

Ma ora ho fatto esattamente come mi avete consigliato.

Può essere più semplice e chiaro, ma pretendere dagli sviluppatori qualcosa che può essere facilmente scritto da soli è sbagliato. Per qualche ragione non credo che siano state scritte aggiunte al linguaggio su C++ e richieste. E le osservazioni, sono sicuro, sono sufficienti per molti.

 
Alexey Viktorov:

Può essere più semplice e chiaro, ma è sbagliato pretendere dagli sviluppatori qualcosa che si scrive facilmente da soli. Per qualche ragione, non credo che siano state scritte aggiunte al linguaggio su C++ e richieste. E le osservazioni, sono sicuro, sono sufficienti per molti.

Ecco un controllo della tua opzione. È finita con un messaggio come questo:

2019.06.16 18:49:25.464 Core 1  TesterStop() called on 0% of testing interval

È un vicolo cieco...

 
Alexey Viktorov:

Non dovresti offenderti. Bisognava avere tutta la frase per capirla.

e tu hai preso solo la seconda parte fuori dal contesto senza prestare attenzione alla prima parte.

Dandovi un esempio con IsStopped(), stavo cercando di rispondere alla prima parte.
A volte è necessario completare l'elaborazione dell'evento prima di completare un EA, a volte è urgente come nel tuo caso.
Leggete la descrizione di questa funzione IsStopped() nella documentazione, forse vi porterà a qualche idea.
Ma a voi sembra che venga da un'altra direzione. Se è così, scusate per una possibile ipotesi.
Ma come si dice nei suggerimenti possibili, e risolve il problema.
La soluzione definitiva non lo dirà a nessuno, perché nessuno conosce tutta la logica del suo codice, e probabilmente non lo approfondirà.

Motivazione: