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
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.
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;
}
}
}
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.
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.
Non riesco ancora a capirlo. Mi sembra che dovrebbe essere qualcosa come .
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.
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.
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.
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?