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
Klot, opzione interessante.
Se le vostre varianti di zigzag mostrano risultati interessanti, posso applicarle nel mio sviluppo?
Certo che puoi, sto seguendo lo sviluppo con interesse e mi piace molto il tuo lavoro.
Altro per quanto riguarda le "opzioni". Ora una delle condizioni per la commutazione dell'estremo: la corrente bassa è superiore alla corrente bassa per più di punti di ExtDeviation (simile per l'alto). Il codice permette di implementare altre opzioni abbastanza facilmente, se necessario.
Bene, seguendo klot vorrei aggiungere che il mio attuale interesse per lo zigzag è causato unicamente dal mio interesse per il tuo disegno.
Incluso il tuo zigzag come uno zigzag esterno. Non appena apparirà una versione stabile e funzionante, la cambierò.
//+------------------------------------------------------------------+ //| CZigZag.mq4 | //| Copyright © 2006, Candid | //| likh@yandex.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Candid" #property link "likh@yandex.ru" #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Navy //---- indicator parameters extern int ExtDepth=12; extern int ExtDeviation=5; //extern int ExtBackstep=3; int shift; double res=0; int i; double CurMax,CurMin; int CurMaxPos,CurMinPos; int CurMaxBar,CurMinBar; double hPoint; double mhPoint; double EDev; int MaxDist,MinDist; bool FirstRun; bool AfterMax,AfterMin; int BarTime; //---- indicator buffers double ZigZag[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_SECTION); //---- indicator buffers mapping SetIndexBuffer(0,ZigZag); SetIndexEmptyValue(0,0.0); //---- indicator short name IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+")"); FirstRun = true; //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); int fBar; if (FirstRun) { hPoint = 0.5*Point; mhPoint = -hPoint; EDev = (ExtDeviation+0.5)*Point; AfterMax = true; AfterMin = true; fBar = Bars-1; CurMax = High[fBar]; CurMaxBar = 1; CurMin = Low[fBar]; CurMinBar = 1; MaxDist = 0; MinDist = 0; BarTime = 0; FirstRun = false; } //---- fBar = Bars-counted_bars-1; if (fBar > Bars-2) fBar = Bars-2; for(shift=fBar; shift>=0; shift--) { if (BarTime!=Time[shift]) { BarTime=Time[shift]; if (res > hPoint ) { MaxDist = Bars-CurMaxBar-shift+1; MinDist = Bars-CurMinBar-shift+1; if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev) { if (AfterMax) { AfterMax = false; AfterMin = true; CurMaxBar = CurMinBar+1; CurMaxPos = Bars-CurMaxBar; CurMax = High[CurMaxPos]; for (i=CurMaxPos-1;i>=shift;i--) { if (High[i] > CurMax+hPoint) { CurMaxBar = Bars-i; CurMax = High[i]; } } // for (i=CurMaxPos-1;i>=shift;i--) ZigZag[Bars-CurMaxBar] = CurMax; } else { // if (AfterMax) AfterMin = false; AfterMax = true; CurMinBar = CurMaxBar+1; CurMinPos = Bars-CurMinBar; CurMin = Low[CurMinPos]; for (i=CurMinPos-1;i>=shift;i--) { if (Low[i] < CurMin-hPoint) { CurMinBar = Bars-i; CurMin = Low[i]; } } // for (i=CurMinPos-1;i>=shift;i--) ZigZag[Bars-CurMinBar] = CurMin; } // else if (AfterMax) } // if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev) } // if (res > hPoint ) } // if (BarTime!=Time[0]) if (AfterMax) { res = Low[shift]-CurMin; if (res < mhPoint) { ZigZag[Bars-CurMinBar] = 0; CurMin = Low[shift]; CurMinBar = Bars-shift; ZigZag[Bars-CurMinBar] = CurMin; } // if (res < mhPoint) } // if (AfterMax) if (AfterMin) { res = CurMax-High[shift]; if (res < mhPoint) { ZigZag[Bars-CurMaxBar] = 0; CurMax = High[shift]; CurMaxBar = Bars-shift; ZigZag[Bars-CurMaxBar] = CurMax; } // if (res < mhPoint) } // if (AfterMin) } // for(shift=fBar; shift>=0; shift--) //---- return(0); } //+------------------------------------------------------------------+A proposito delle peculiarità dei diversi zigzag. La caratteristica principale di questo zigzag è che tutto è fatto in un solo passaggio, la rivisitazione dei dati storici è fatta solo quando un estremo è fissato, e solo per i dati dopo quell'estremo. Cioè, deve essere abbastanza veloce. I particolari del disegno dipenderanno naturalmente dai criteri di fissaggio degli estremi, ma varie opzioni possono essere facilmente implementate qui. Per esempio, ho già fatto delle varianti di commutazione per percentuale di una mossa precedente, per allontanamento di High dal minimo (rispettivamente Low dal massimo) e legando la commutazione alla dimensione media della barra.
Per chiarire i miei sospetti, ho inserito il Print nel codice:
if (shift<5) Print ("shift=",shift,", Bars=",Bars,", Time[shift]=",TimeToStr(Time[shift],TIME_DATE|TIME_MINUTES),", High[shift]=",High[shift],", Low[shift]=",Low[shift]);Il terminale è stato poi chiuso e riavviato pochi minuti dopo. Ed ecco un frammento del log:
Potete vedere che alle 23:58:23 la storia non era ancora stata pompata, e alle 23:58:25 l'ultimo 1 bar era stato pompato. E solo nel 2006.10.31 23:58:26 tutte le barre intermedie erano pompate.
Domanda agli sviluppatori: è questa la normale sequenza di paginazione? E se è così, che senso ha? Chiaramente, è auspicabile avere il valore del prezzo corrente in anticipo. Ma l'esistenza programmata di un buco nella storia per qualche tempo significa essenzialmente un fallimento garantito degli indicatori per questo tempo. Non è più sicuro per l'utente rimandare il calcolo degli indicatori fino a quando la storia è completamente scambiata? O almeno reinizializzarli dopo lo scambio completo?