Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 600

 

Saluti! :)

Ho più o meno lo stesso codice indicatore:

bool busy=false;

int start()
{
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   limit=Bars-counted_bars+1;
   limit=MathMin(bBars-1, limit);
   if(IndicatorCounted()>0) limit=1;
   
   FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), Bars, IndicatorCounted());
   FileFlush(han);
   //if(busy=false) return(0);
   for (i=0; i<limit; i++)
   { 
      busy=true;
      FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), DoubleToStr(i, 0), DoubleToStr(IndicatorCounted(), 0));
      FileFlush(han);
      Здесь идут сложные вычисления которые занимают минуты 3
   }

   busy=false;
}

Lo lascio cadere sul grafico M1. L'indicatore si blocca insieme al terminale, presumibilmente eseguendo i calcoli.
Lo chiudo con forza dopo 15 minuti e apro il suo registro:

Pic1

Si scopre che l'indicatore non reagisce ai tick appena arrivati (è logico) finché non calcola la prima volta. Ma dimentica di dire al terminale durante la valutazione che a IndicatorConted() deve essere già assegnato un valore diverso da 0.
Quindi risulta che i tick in arrivo ordinati per la valutazione ricordano il valore corrente di IndicatorCounted()?

Ho provato a controllarlo tramite la variabile busy (stringa commentata - stesso risultato).

Ho provato anche in questo modo:

int start()
{
   FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), Bars, IndicatorCounted());
   FileFlush(han);
   return(0);
   .
   .
   .
}

Naturalmente, questa volta tutto ha funzionato correttamente:

Pic2

Cosa abbiamo qui? Il sistema non ha tempo per scrivere un nuovo valore in IndicatorCounted()? In altre parole, ho bisogno di fare qualcosa come sleep()? So che questo non è possibile nell'indicatore)
Oppure, quando arriva un nuovo tick, poiché il vecchio tick non ha finito i suoi calcoli, si ricorda che IndicatorCounte() è ancora uguale a zero e quando arriva il suo momento, comincia a calcolare dal vecchio valore IndicatourCounted()=0?

Cosa fare? )

 
Expert:

Saluti! :)

Ho circa lo stesso codice dell' indicatore:


Dice tutto. A proposito di questo codice, di questa risposta...per scrivere?
 
peace1984:
Questa è la mia prima esperienza, non giudicare troppo duramente:)
Ad essere onesti, mi sembra che il tester ricordi il valore passato della variabile - dall'ultimo test. Come - non lo so, non ho molto tempo per il debugging. Forse è un bug del terminale. Ho appena messo un commento nel codice e ho emesso i valori nel log. Così si scopre che ogni volta che eseguo un nuovo test il valore del test precedente viene memorizzato nella variabile sys. Che confusione. Forse qualcun altro vedrà, forse il mio occhio è bagnato...
File:
11_1.mq4  8 kb
 
AlexeyVik:
Questo dice tutto. Per circa questo codice, circa questa risposta...scrivere?


Il punto è che il resto del codice è irrilevante. L'essenza dell'errore è descritta in questo pezzo.
In generale avevo paura di spaventare la gente con un grande post. Così l'ho gonfiato.

In breve, può essere formulata come segue: se un indicatore viene calcolato per un lungo periodo (più di un minuto), IndicatorCounted() restituisce sempre 0.

 
artmedia70:
Ad essere onesti, mi sembra che il tester ricordi il valore passato della variabile - dall'ultimo test. Come - non lo so, non c'è molto tempo per il debriefing. Forse un bug nel terminale. Ho appena messo un commento nel codice e ho emesso i valori nel log. Così si scopre che ogni volta che eseguo un nuovo test il valore del test precedente viene memorizzato nella variabile sys. Che confusione. Forse qualcun altro vedrà, forse il mio occhio è bagnato...

È solo che hai dimenticato che la linea

int       sys=(Sys<0)?0:Sys;

Quando le proprietà dell'indicatore sono richiamate, non saranno eseguite.

Non ho guardato a fondo, ma forse questo otterrà il risultato desiderato?

extern int Sys=0;
int       sys;    // изменено
double    opb;
double    ops;
double    cb;
double    cs;
double    lot;
double    next_order;
int       i=0;
int       x;
double    max;
double    min;
int       ticket;
int       tip;
int       count;
bool      res;
double    bal;
double    sl;
datetime  d;
double    N;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   sys=(Sys<0)?0:Sys;  // добавлено
   bal=AccountBalance();
   return(0);
  }
 
AlexeyVik:

Hai solo dimenticato che la stringa

Quando le proprietà dell'indicatore sono richiamate, non saranno eseguite.

Non ho guardato a fondo, ma forse questo otterrà il risultato desiderato?



Generalmente un consulente. Ma HZ, non c'è tempo per sperimentare. Ho tutti gli EAs che lavorano nel modo che ho scritto. Dovrò rintracciare questa merda nel tester. Quando ho abbastanza tempo.
 
Expert:


Il punto è che il resto del codice è irrilevante. L'essenza dell'errore è descritta in questo pezzo.
In generale avevo paura di spaventare la gente con un grande post. Così l'ho gonfiato.

In breve, può essere formulata come segue: se un indicatore viene calcolato per un lungo periodo (più di un minuto), IndicatorCounted() restituisce sempre 0.


Non è questo il punto. Nessuno ha bisogno del tuo codice segreto completo. Basta scrivere un pezzo di codice di prova completo con quell'equivoco. E da questa parte.

bool busy=false;

int start()
{
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   limit=Bars-counted_bars+1;
   limit=MathMin(bBars-1, limit);
   if(IndicatorCounted()>0) limit=1;
   
   FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), Bars, IndicatorCounted());
   FileFlush(han);
   //if(busy=false) return(0);
   for (i=0; i<limit; i++)
   { 
      busy=true;
      FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), DoubleToStr(i, 0), DoubleToStr(IndicatorCounted(), 0));
      FileFlush(han);
      Здесь идут сложные вычисления которые занимают минуты 3
   }

   busy=false;
}

quando hai cancellato la linea evidenziata? I telepati non aiutano, i semplici mortali ancora meno...

Poi c'è questa parte.

   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   limit=Bars-counted_bars+1;
   limit=MathMin(bBars-1, limit);
   if(IndicatorCounted()>0) limit=1;

Non so da quale programmatore provenga, ma c'è qualcosa scritto in modo inadeguato... Non è colpa tua. Tu, come molti altri, hai appena preso il codice e cerchi di aggiustarlo...

Se la variabile counted_bars è uguale al numero di barre rimaste invariate dall'ultima chiamata dell'indicatore (la prima riga)

Come può diventare meno di zero che viene controllato if(counted_bars < 0) non riuscirò mai a capire...

Anche il resto è senza senso, ma sono troppo pigro per analizzarlo...

 
AlexeyVik:

Hai solo dimenticato che la stringa

Quando le proprietà dell'indicatore sono richiamate, non saranno eseguite.

Non ho guardato a fondo, ma forse questo otterrà il risultato desiderato?




Ci ho provato... non funziona...
 
artmedia70:
Generalmente un consulente. Ma HZ, non c'è tempo per sperimentare. Ho tutti gli EAs che lavorano nel modo che ho scritto. Dovrò rintracciare questa merda nel tester. Quando ho abbastanza tempo.

Beh, sì, certo, l'Expert Advisor. Allora sorge un'altra domanda: perché l'EA è stato messo sul grafico come indicatore di base? Ma non cambia la questione, quando si riavvia sia l'indicatore che l'EA, le variabili di livello globale non vengono reinizializzate e la linea int sys=(Sys<0)?0:Sys; non viene eseguita.
 
peace1984:

Ci ho provato... non funziona...
Probabilmente non è esattamente così che ho provato.
Ho appena ricompilato il codice in EA e l'ho eseguito. Quando cambio il parametro Sys nel commento questo valore cambia.