Errori, bug, domande - pagina 3030

 
Andrey Dik:

restituiamo 0, affermando così che non abbiamo ancora contato nulla e non incrementeremo di 1 sulla prossima barra.

cioè saremo sulla barra dove abbiamo iniziato la richiesta di dati dal fattore più vecchio fino al ritorno (rates_total)

Dall'aiuto:"Il parametro prev_calculated nella chiamata di funzione contiene il valore restituito da OnCalculate() nella chiamataprecedente ".
 
mktr8591:
Dall'aiuto:"Il parametro prev_calculated alla chiamata della funzione contiene il valore restituito da OnCalculate() alla chiamataprecedente ".

Sì, c'è molto scritto nella Guida, ma non sempre comprensibile, purtroppo (non per fare dispetto agli sviluppatori), bisogna imparare, imparare, imparare. Ma questo ramo esiste perché a volte si scoprono cose che non sono coerenti né con la Guida né con il buon senso, A100 è il nostro eroe, perché va anche dove nessuno salirebbe da solo))).

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

1. Grazie a tutti - sono diventato un po' più alfabetizzato negli indicatori ))))

Andrew, se qualcuno non capisce le tue idee (me compreso), significa solo una cosa: TU non disegni correttamente! O meglio, lo fai in un modo tale che molte persone non lo capiscono...

la verità è più importante. non è sempre chiara a tutti, purtroppo.

 

Andrey Dik:

restituisce 0, affermando così che non abbiamo ancora contato nulla e che prev_calc non sarà incrementato di 1 nella prossima barra.

Allora return(rates_total) dovrebbe aumentare prev_calc di rates_total?

 
Andrey Dik:

restituisce 0, affermando così che non abbiamo ancora calcolato nulla e che il kalk prev non aumenterà di 1 nella prossima barra.

lui stesso azzera il calcolo e si lamenta che lo azzera)

 
Andrey Dik:

possiamo permetterci di calcolare una nuova barra solo una volta e non ad ogni tick.

non possiamo permettercelo perché il terminale non genererà dati storici online sul "TF superiore"

In generale, qui è necessaria qualche supposizione:

- o costruiamo da soli l'OHLC all'interno dell'indicatore

- o il terminale costruisce OHLC stesso


Se è quest'ultimo, allora dovremmo considerare che il terminale non sa affatto come interagiscono i TF, chi è un multiplo di cosa e cosa succede all'evento"nuova barra". ma dovremmo lasciare che il terminale costruisca il TF necessario


Provate questo codice nel vostro secondo indicatore:

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[])
{
   double buff [];
   if(prev_calculated == 0)
   {
      if (iBars (Symbol (), OldTF) != BarsCalculated (Handle))
      {
         Print ("Индикатор на периоде ", OldTF, " ещё не рассчитан");
         return 0;
      }
   }
   else
   {
      if (rates_total == prev_calculated)
      {
         if(CopyBuffer (Handle, 0, 0, 1, buff)<0) return 0;
         return rates_total;
      }
   }

   ulong t = GetMicrosecondCount ();

...... далее без изменений
 
Andrei Trukhanovich:

stesso azzera il calcolo e si lamenta del fatto che si azzera)

Andrei, esegui il codice, per favore... ma non cominciare, eh? Non posso combattere con te.

 
Igor Makanu:

non possiamo permetterci come il terminale non genererà dati storici online sul "vecchio TF"

In generale, qui è necessaria qualche supposizione:

- O costruiamo da soli l'OHLC all'interno dell'indicatore

- o il terminale stesso costruisce OHLC per noi


se è quest'ultimo, allora dobbiamo considerare che il terminale non sa affatto come interagisce il TF, chi è un multiplo di cosa e cosa succede all'evento"nuova barra"


Provate questo codice nel vostro secondo indicatore:

Il tuo codice farà dei calcoli ad ogni tick, non è interessante per me, non ho nemmeno intenzione di eseguirlo. Ho bisogno di fare il calcolo solo UNA volta su ogni barra, su tutti gli indicatori usati, non su ogni tick di tutti gli indicatori usati.

 
Andrey Dik:

Il tuo codice sta per martellare i calcoli ad ogni tick, non mi interessa, non lo eseguirò nemmeno. Ho bisogno di fare il calcolo solo UNA volta su ogni barra, su tutti gli indicatori utilizzati, non su ogni tick di tutti gli indicatori utilizzati.

Il mio codice "ticchetta per ticchetta" solo il tuo indicatore #1, dove hai scritto :

 if (rates_total == prev_calculated) return rates_total;

permetterà al terminale di costruire da solo il "timeframe superiore".

Per me - è più "economico" che eseguire un ricalcolo completo dell'indicatore № 1, che avviene nel tuo codice quando sincronizzi la storia sul "vecchio TF

 
Andrey Dik:

Andrei, potresti eseguire il codice, per favore... ma non cominciare, eh? Non posso combattere contro di te.

Sostituire

if (SeriesInfoInteger (Symbol (), OldTF, SERIES_SYNCHRONIZED))
   {
      if (iBars (Symbol (), OldTF) != BarsCalculated (Handle))
      {
        Print ("Индикатор на периоде ", OldTF, " ещё не рассчитан");
        return 0;
      }
   }
   else 
   {
     Print ("Период ", OldTF, " не синхронизирован.");
     return 0;
   }

a

if (SeriesInfoInteger (Symbol (), OldTF, SERIES_SYNCHRONIZED))
   {
      if (iBars (Symbol (), OldTF) != BarsCalculated (Handle))
      {
        Print ("Индикатор на периоде ", OldTF, " ещё не рассчитан");
        return prev_calculated;
      }
   }
   else 
   {
     Print ("Период ", OldTF, " не синхронизирован.");
     return prev_calculated;
   }

e testarlo.