Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Che ne dite di ricalcolare l'intero indicatore quando è 0? Mi sembra la soluzione migliore.
:) Questo è quello che faccio...
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":
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.
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.
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:
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".
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.
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ì.
"...un prezzo che non so da dove venga... " - che è una schifezza di elementi UNINITIALIZZATI dell'array di buffer dell'indicatore. Cosa si dovrebbe fare:
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);
}
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
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?