prev_calcolato - pagina 2

 
Alexey Kozitsyn:
Che ne dite di ricalcolare l'intero indicatore quando è 0? Mi sembra la soluzione migliore.
Per un indicatore pesante con tonnellate di grafica - non il migliore. No, la soluzione è semplice - usare la propria variabile invece di prev_calculated, statica o globale. Ma è una stampella e vogliamo qualcos'altro.
 
Alexey Kozitsyn:
:) Questo è quello che faccio...
Questo è quello che ho capito, stavo solo citando la tua domanda, ma in realtà stavo rispondendo adAlexander Puzanov.:)
 
Alexander Puzanov:
Per un indicatore pesante con tonnellate di grafica non è la soluzione migliore. La soluzione è semplice - usare la propria variabile invece di prev_calculated, statica o globale. Ma è una stampella e vogliamo qualcos'altro.

Una persona che usa la parola "stampella":

  • o è troppo pigro per leggere la documentazione
  • o non sa ancora come dovrebbe essere corretto.
L'unica soluzione corretta: a prev_calculate==0 ricalcolare l'indicatore.

 
Alexander Puzanov:
Per un indicatore pesante con tonnellate di grafica - non il migliore. No, la soluzione è semplice - usare la propria variabile invece di prev_calculated, statica o globale. Ma è una stampella e vogliamo qualcos'altro.
Non è affatto una stampella. È così che faccio io.
 
Karputov Vladimir:
E se la storia è stata scambiata, significa che ci possono essere nuove barre che sono state saltate o non calcolate prima - cioè le letture dell'indicatore saranno già sbagliate.

Slawa:

Se prev_calculated=0, significa che deve essere fatto un ricalcolo completo. Tutti gli indicatori standard sono completamente ricalcolati in questo caso.

È tutto chiaro, ma, ahimè, non cancella tutto questo:

Alexander Puzanov:

Tutto questo è utile, ma non può essere usato secondo il suo scopo diretto - mostrare quante 'barre sono state processate alla chiamata precedente' - prev_calculated

Gli indicatori sono diversi; alcuni non hanno bisogno di barre per i calcoli, alcuni hanno bisogno solo di tick dal vivo, alcuni hanno limitazioni sulla profondità di conversione - non gli importa cosa è cambiato dopo nella storia, alcuni hanno bisogno di tracciare oggetti grafici, ecc. Non hanno bisogno di funzioni aggiuntive per tracciare i cambiamenti nella storia allegata a prev_calculated, hanno solo bisogno di questo - "barre elaborate sulla chiamata precedente". Non ne hanno bisogno.

Comunque, signor programmatore, per favore non distragga l'aderente dal "catturare l'evento".

 
Alexey Kozitsyn:
E se ricalcolassi semplicemente l'intero indicatore a 0? Secondo me, è la soluzione migliore.

Non direi che è la soluzione migliore. Almeno non ancora.

Ho deciso di scrivere un indicatore che registra l'attuale drawdown del conto, così non devo ricalcolare nulla nella storia. La prima linea sembrava così all'inizio.

if(prev_calculated == 0)  return(rates_total);
Ma dopo l'avvio ho scoperto che i buffer non sono vuoti e non sono azzerati. C'è un prezzo nei buffer di origine sconosciuta. Ho dovuto forzare i buffer a zero... Poi è stato scoperto un altro problema. Il prev_calculate viene azzerato e l'indicatore viene ricalcolato, rispettivamente azzerando tutti i buffer fino all'ultima barra. Comunque, ho rinunciato all'idea per ora.
 
Alexey Viktorov:

Non direi che è la soluzione migliore. Almeno non ancora.

Ho deciso di scrivere un indicatore che registra l'attuale drawdown del conto, così non devo ricalcolare nulla nella storia. All'inizio la prima riga era così.

if(prev_calculated == 0)  return(rates_total);
Ma dopo l'avvio ho scoperto che i buffer non sono vuoti e non sono azzerati. C'è un po' di prezzo nei buffer che non so da dove venga. Ho dovuto forzare i buffer a zero... Poi è stato scoperto un altro problema. Il prev_calculate viene azzerato e l'indicatore viene ricalcolato, rispettivamente azzerando tutti i buffer fino all'ultima barra. Comunque, ho rinunciato all'idea per ora.

"...un prezzo che non so da dove venga... " - che è una schifezza di elementi UNINITIALIZZATI dell'array di buffer dell'indicatore. Cosa si dovrebbe fare:

  • a prev_calculate==0 passa attraverso tutti gli elementi del buffer degli indicatori nel ciclo e assegna loro dei valori. In questo caso, è necessario monitorare la situazione quando appare una nuova barra (rates_total meno prev_calculate sarà maggiore di zero) - il buffer dell'indicatore aumenta di conseguenza e anche questo nuovo elemento dovrebbe essere inizializzato.

 

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

Bug, bug, domande

Alexey Viktorov, 2016.10.17 09:58

Hai capito quello che hai scritto?

Meglio spiegare come sbarazzarsi della spazzatura PRIMA corsa dell'indicatore. Da dove viene questa spazzatura? Non dovrebbe esserci un'inizializzazione quando si collega il buffer all'array? O è durante l'inizializzazione che la spazzatura spaziale entra nell'array? Perché non c'è questa spazzatura in mql4?

Datemi un esempio di come setacciare la spazzatura dai valori normali senza usare variabili statiche o globali aggiuntive estranee.

Tutti sono abbastanza bravi da citare la documentazione.


 

Nessuno deve niente a nessuno. Quindi ci sarà della spazzatura nel buffer dell'indicatore, dopo il binding, fino a quando non inizializzerete voi stessi tutti gli elementi dell'array.

Aggiunto:

Ora creerò un esempio...

//+------------------------------------------------------------------+
//|                                              prev_calculated.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGray
#property indicator_label1  "prev_calculated"
//---- buffers
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   if(prev_calculated==0)
     {
      //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
      for(int i=0;i<rates_total;i++)
         ExtBuffer[i]=1.01;
      return(rates_total);
     }
//--- пересчитываем самый правый бар или самый правый бар и один предыдущий при появлении нового бара
   int limit=rates_total-prev_calculated+1;
   for(int i=rates_total-limit;i<rates_total;i++)
     {
      //--- визуализация пересчёта самого правого бара
      static bool drive=false;
      if(!drive)
         ExtBuffer[i]=1.03;
      else
         ExtBuffer[i]=1.02;
      drive=!drive;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Eseguirlo su M1. Vedrete che solo la barra più a destra viene ricalcolata.
File:
 
Karputov Vladimir:

Nessuno deve niente a nessuno. Quindi ci sarà della spazzatura nel buffer dell'indicatore, dopo il binding, fino a quando non inizializzerete voi stessi tutti gli elementi dell'array.

Aggiunto:

Ora creerò un esempio...

//+------------------------------------------------------------------+
//|                                              prev_calculated.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGray
#property indicator_label1  "prev_calculated"
//---- buffers
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   if(prev_calculated==0)
     {
      //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
      for(int i=0;i<rates_total;i++)
         ExtBuffer[i]=1.01;
      return(rates_total);
     }
//--- пересчитываем самый правый бар или самый правый бар и один предыдущий при появлении нового бара
   int limit=rates_total-prev_calculated+1;
   for(int i=rates_total-limit;i<rates_total;i++)
     {
      //--- визуализация пересчёта самого правого бара
      static bool drive=false;
      if(!drive)
         ExtBuffer[i]=1.03;
      else
         ExtBuffer[i]=1.02;
      drive=!drive;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Eseguirlo su M1. Vedrete che solo la barra più a destra viene ricalcolata.

Incredibile capacità di rispondere alla domanda sbagliata...

Ora spiegatemi cosa succede se:

1. Contate 100 barre, inserite nei buffer da 0 a 99 inclusi (consideriamo la direzione come serie temporale) valore 1.03

2. Improvvisamente la storia viene caricata e prev_calcola diventa 0

Da quale barra sarà 1,03?