Cosa restituiscono le funzioni Lowest e Highest - pagina 2

 
nen
Non ho potuto rispondere (ero via). Pubblica il codice che devi analizzare per parlare di una cosa.
ZS In quello zigzag non era un errore ma un refuso (rispetto al codice di MT3), ho trovato solo questo refuso e non ho corretto altro.
 
Vladislav, per qualche motivo il tuo codice non funziona su tutti i timeframe. Funziona in alcuni periodi, ma non in altri. È strano, funziona.
 
Rosh, ecco il codice da codebase.mql4.com. Ne ho uno uguale. Se è possibile superarlo con tutto il mondo, gliene sarò molto grato. Non sarò l'unico. Grazie in anticipo per il vostro aiuto.

Ora ho accumulato un gran numero di queste o altre modifiche. Funzionano abbastanza bene. Tuttavia, il primo raggio - quello che parte dalla barra zero o da una qualsiasi delle prime barre - fallisce con errori nelle funzioni di identificazione degli estremi. E l'indicatore funziona in modo instabile.

//+------------------------------------------------------------------+
//| Media mobile personalizzata.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp.
//| https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net/

#proprietà indicator_chart_window
#proprietà indicator_buffers 1
#property indicator_color1 Red
//---- parametri dell'indicatore
extern intDepth=12;
extern inttern ExtDeviation=5;
extern inttern ExtBackstep=3;
//---- buffer degli indicatori
doppio ExtMapBuffer[];
doppio ExtMapBuffer2[];

//+------------------------------------------------------------------+
//| funzione di inizializzazione dell'indicatore personalizzato
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(2);
//---- impostazioni di disegno
SetIndexStyle(0,DRAW_SECTION);
//---- mappatura dei buffer degli indicatori
SetIndexBuffer(0,ExtMapBuffer);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexEmptyValue(0,0.0);
//---- nome corto dell'indicatore
IndicatoreNomeCorto("ZigZag("+ExtDepth+", "+ExtDeviation+", "+ExtBackstep+")");
//---- inizializzazione fatta
ritorno(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int shift, back, lasthighpos, lastlowpos;
doppio val,res;
doppio curlow, curhigh, lasthigh, lastlow;

for(shift=Bars-ExtDepth; shift>=0; shift--)
{
val=Low[Lowest(NULL,0,MODE_LOW,ExtDepth,shift)];
if(val==lastlow) val=0.0;
else
{
lastlow=val;
se((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;
else
{
for(back=1; back<=ExtBackstep; back++)
{
res=ExtMapBuffer[shift+back];
se((res!=0)&&(res>val)) ExtMapBuffer[shift+back]=0.0;
}
}
}
ExtMapBuffer[shift]=val;
//--- alto
val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)];
if(val==lasthigh) val=0.0;
else
{
lasthigh=val;
se((val-High[shift])>(ExtDeviation*Point)) val=0.0;
else
{
for(back=1; back<=ExtBackstep; back++)
{
res=ExtMapBuffer2[shift+back];
se((res!=0)&&(res<val)) ExtMapBuffer2[shift+back]=0.0;
}
}
}
ExtMapBuffer2[shift]=val;
}

// taglio finale
lasthigh=-1; lasthighpos=-1;
lastlow=-1; lastlowpos=-1;

for(shift=Bars-ExtDepth; shift>=0; shift--)
{
curlow=ExtMapBuffer[shift];
curhigh=ExtMapBuffer2[shift];
se((curlow==0)&&(curhigh==0)) continua;
//---
se(curhigh!=0)
{
if(lasthigh>0)
{
if(lasthigh<curhigh) ExtMapBuffer2[lasthighpos]=0;
altrimenti ExtMapBuffer2[shift]=0;
}
//---
if(lasthigh<curhigh || lasthigh<0)
{
lasthigh=curhigh;
lasthighpos=shift;
}
lastlow=-1;
}
//----
se(curlow!=0)
{
se(lastlow>0)
{
if(lastlow>curlow) ExtMapBuffer[lastlowpos]=0;
altrimenti ExtMapBuffer[shift]=0;
}
//---
se((curlow<lastlow)||(lastlow<0))
{
lastlow=curlow;
lastlowpos=shift;
}
ultimo posto=-1;
}
}

for(shift=Bars-1; shift>=0; shift--)
{
if(shift>=Bars-ExtDepth) ExtMapBuffer[shift]=0.0;
else
{
res=ExtMapBuffer2[shift];
if(res!=0.0) ExtMapBuffer[shift]=res;
}
}
}
 
Vladislav, per qualche motivo il tuo codice non funziona su tutti i timeframe. Funziona in alcuni periodi, ma non in altri. È strano, funziona. <br / translate="no">


Funziona su altri timeframe ma non su altri. Sembra funzionare per me. Sì, e non è il mio codice - dalla fornitura standard sembra essere. Almeno io l'ho fatto in tutte le versioni di MT.
 
Vladislav, è chiaro che questo non è il tuo codice. Ho il codice che ho fornito nella mia consegna.
Su quali timeframes non viene visualizzato. BC - Brezan.
GBP-CHF
Non è indicato su m1 e m15. È mostrato su tutti gli altri.
EUR-USD
Non è mostrato - m1, m5
AUD-USD - tutti sono mostrati.
Non so perché appare così.

Forse avete il codice che Slava ha rielaborato in estate. Ma non mi è piaciuta la sua rielaborazione. Alcuni problemi non sono stati risolti lì.
================
GODZILLA (Nikolay) ha fatto un buon lavoro. Ma ha solo due problemi risolti.
1) Ricalcolo su ogni tick. L'ha ridotto drasticamente
2) Ha aggiunto un algoritmo di rimozione della gobba. Le gobbe appaiono principalmente a causa della presenza di entrambi i minimi e massimi su una barra. L'algoritmo a zig zag lascia solo gli alti. Questo si traduce spesso nel fare diversi massimi di fila.

Ho alcune varianti di miglioramento dell'indicatore fissate da GODZILL. I nodi che pendono nell'aria sono stati rimossi. Tuttavia, suppongo che le funzioni di ricerca degli estremi funzionino comunque in modo errato nei primi due raggi. È a causa di questo problema che ho sollevato questo argomento qui.

Tuttavia, forse la funzione di ricerca funziona correttamente ma non c'è una descrizione chiara di questa funzione. Questo è il motivo per cui viene usato in modo scorretto.
 
Lo faccio visualizzare su tutti i t\f sulle coppie specificate. Non ricordo da dove viene questo codice - pensavo fosse nella consegna della build 197 - ce l'ho in tutte le MT per qualche motivo :). Lo controllerò domani.
 
Mi vergogno a dire che non mi sono mai interessato seriamente agli zigzag prima d'ora :). Il codice nel post di nen 18.10.06 17:46
Non riesco ancora a capirlo. Mi sembra che dovrebbe essere qualcosa come .
.. // val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)]; highpos=Highest(NULL,0,MODE_HIGH,ExtDepth,shift); val=High[highpos]; if(MathAbs(val-lastlow) < Point) val=0.0; // se(val==lasthigh) val=0.0; altrimenti { lasthigh=val; if(highpos!=shift) val=0.0; // se((val-High[shift])>(ExtDeviation*Point)) val=0.0; altrimenti { ...


Qui il vecchio codice 'extra' è commentato. Anche se forse non ho ancora capito bene l'idea dello zigzag. In ogni caso questo codice non produce estremi dangling. Se questa variante di codice si adatta ma non è stata inventata da me :), mi scuso per la mancanza di riferimenti.

 
Candido, grazie. Vedrò come funziona. Ma la domanda nel titolo del thread non sparisce. Il solo zigzagare ha rivelato il problema del lavoro "incomprensibile" delle funzioni che cercano gli estremi. La linea highpos=Highest(NULL,0,MODE_HIGH,ExtDepth,shift); aiuta a trovare un estremo. Tuttavia, l'indice highpos restituito dalla funzione Highest quando viene eseguito nel codice zigzag è spesso casuale. C'è una deviazione dalla vera posizione della barra. In altre parole, highpos sarà, per esempio, 15. Ma in realtà, la barra avrà un indice diverso: 13 o 16 o qualcos'altro. Così si ottiene la differenza. Pertanto, lo zigzag con piccoli valori di parametri e su timeframe "piccoli" (1 minuto, 5 minuti ...) inizia a lavorare in modo instabile.

Va bene. Non importa lo zigzag. La domanda non riguarda lo zigzag. La questione è che le funzioni del linguaggio MQ4 dovrebbero funzionare in modo costante e prevedibile.

E questo è il PROBLEMA PRINCIPALE. Le funzioni di ricerca sono utilizzate non solo nello ZigZag. Ma anche in molti altri indicatori.

Lo zigzag è un caso speciale. Ma aiuta a evidenziare il problema. Molti indicatori sono basati su zigzag. Lo zigzag funziona in modo instabile. Non è un segreto per nessuno. Molte persone devono spendere il loro tempo per programmare i propri zigzag per le proprie esigenze. Quanto tempo viene sprecato. Invano. A causa della mancanza di comprensione della radice del problema.
 
Candido, le tue parole: vergogna di dirlo, ..... Il codice nel post di nen 18.10.06 17:46 deve ancora essere compreso.

Sono parole d'oro. Non sei il primo a dirlo. Tuttavia, le idee dietro lo zigzag e parzialmente implementate in questo codice sono molto buone. Queste idee devono essere portate a compimento.
 
2 nen:
Quando spostiamo la finestra (shift,shift+ExtDepth) durante il calcolo dell'indicatore, la comparsa di un nuovo estremo può essere legata sia al nuovo prezzo che al fatto che il vecchio estremo è uscito dalla finestra. Questo punto deve essere trattato. A questo scopo, il mio inserimento contiene la linea if(highpos!=shift) val=0.0; . Come questo sia fatto nel codice standard, non lo capisco. A giudicare dagli estremi mancanti nella mia versione, è fatto in modo scorretto o non lo è affatto.
E qual è esattamente l'instabilità dello zigzag?